ZGlmZiAtLWdpdCBhL3JjMS9DUkVESVRTLnR4dCBiL3JjMS9DUkVESVRTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU4ZGJmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNDAgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IFN1bml0YSBDaGFuZHJhc2VrYXJhbgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IEJhcmJhcmEgQ2hhcG1hbgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFVuaXZlcnNpdHkgb2YgSG91c3RvbiAKK1c6IGh0dHA6Ly93ZWIuY3MudWguZWR1L35vcGVudWgvZG93bmxvYWQvCitEOiBPcGVuVUggdGVzdCBzdWl0ZQorCitOOiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgcnVudGltZSB0ZWFtCitXOiBodHRwOi8vb3Blbm1wcnRsLm9yZworRDogQ3JlYXRlZCB0aGUgcnVudGltZS4KKworTjogTWF0dGhpYXMgTXVsbGVyCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogUGF2ZWwgTmV5dGNoZXYKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBTdGV2ZW4gTm9vbmFuCitFOiBzdGV2ZW5AdXBsaW5rbGFicy5uZXQKK0Q6IFBhdGNoZXMgZm9yIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGFuZCByZW1vdmFsIG9mIHNldmVyYWwgaW5jb25zaXN0ZW5jaWVzLgorCitOOiBBbHAgVG9rZXIKK0U6IGFscEBudWFudGkuY29tCitEOiBNYWtpbmcgYnVpbGQgd29yayBmb3IgRnJlZUJTRC4KKworTjogQ2hlbmcgV2FuZyAKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSApkaWZmIC0tZ2l0IGEvcmMxL0xJQ0VOU0UudHh0IGIvcmMxL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjQxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxMjQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAiQlNELUxpa2UiIGxpY2Vuc2UgYW5kIHRoZSBNSVQgbGljZW5zZS4gIEFzIGEgdXNlciBvZgordGhpcyBjb2RlIHlvdSBtYXkgY2hvb3NlIHRvIHVzZSBpdCB1bmRlciBlaXRoZXIgbGljZW5zZS4gIEFzIGEgY29udHJpYnV0b3IsCit5b3UgYWdyZWUgdG8gYWxsb3cgeW91ciBjb2RlIHRvIGJlIHVzZWQgdW5kZXIgYm90aC4gIFRoZSBmdWxsIHRleHQgb2YgdGhlCityZWxldmFudCBsaWNlbnNlcyBpcyBpbmNsdWRlZCBiZWxvdy4KKworSW4gYWRkaXRpb24sIGEgbGljZW5zZSBhZ3JlZW1lbnQgZnJvbSB0aGUgY29weXJpZ2h0L3BhdGVudCBob2xkZXJzIG9mIHRoZQorc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgaW5jbHVkZWQgYmVsb3cuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorICAgIE9wZW5NUCBSdW50aW1lIFRlYW0KKyAgICBJbnRlbCBDb3Jwb3JhdGlvbgorICAgIGh0dHA6Ly93d3cub3Blbm1wcnRsLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIEludGVsIENvcnBvcmF0aW9uIE9wZW5NUCBSdW50aW1lIFRlYW0gbm9yIHRoZQorICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitDT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCitTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDEzIEludGVsIENvcnBvcmF0aW9uCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50ZWwgQ29ycG9yYXRpb24KKworU29mdHdhcmUgR3JhbnQgTGljZW5zZSBBZ3JlZW1lbnQgKCJBZ3JlZW1lbnQiKQorCitFeGNlcHQgZm9yIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZWluIHRvIHlvdSwgSW50ZWwgQ29ycG9yYXRpb24gKCJJbnRlbCIpIHJlc2VydmVzCithbGwgcmlnaHQsIHRpdGxlLCBhbmQgaW50ZXJlc3QgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSAoZGVmaW5lZCBiZWxvdykuCisKK0RlZmluaXRpb24KKworIlNvZnR3YXJlIiBtZWFucyB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIGFueSBvcmlnaW5hbCB3b3JrIG9mCithdXRob3JzaGlwLCBpbmNsdWRpbmcgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zIHRvIGFuIGV4aXN0aW5nIHdvcmssIHRoYXQKK2lzIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGJ5IEludGVsIHRvIGxsdm0ub3JnIChodHRwOi8vbGx2bS5vcmcpICgiTExWTSIpIGZvcgoraW5jbHVzaW9uIGluLCBvciBkb2N1bWVudGF0aW9uIG9mLCBhbnkgb2YgdGhlIHByb2R1Y3RzIG93bmVkIG9yIG1hbmFnZWQgYnkgTExWTQorKHRoZSAiV29yayIpLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIgbWVhbnMgYW55IGZvcm0gb2YKK2VsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQgdG8gTExWTSBvciBpdHMKK3JlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMKK21haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUKK21hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgTExWTSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nCit0aGUgV29yaywgYnV0IGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3RoZXJ3aXNlLgorCisxLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworICAgQWdyZWVtZW50LCBJbnRlbCBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhbmQgdG8gcmVjaXBpZW50cyBvZiB0aGUgU29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIGJ5IExMVk0gYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZQorICAgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgU29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3Jrcy4KKworMi4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZQorICAgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlcgorICAgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBJbnRlbCB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgSW50ZWwncyBTb2Z0d2FyZSBhbG9uZSBvciBieQorICAgY29tYmluYXRpb24gb2YgdGhlIFNvZnR3YXJlIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBTb2Z0d2FyZSB3YXMKKyAgIHN1Ym1pdHRlZC4gSWYgYW55IGVudGl0eSBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgSW50ZWwgb3IgYW55CisgICBvdGhlciBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nCisgICB0aGF0IEludGVsJ3MgU29mdHdhcmUsIG9yIHRoZSBXb3JrIHRvIHdoaWNoIEludGVsIGhhcyBjb250cmlidXRlZCBjb25zdGl0dXRlcworICAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZAorICAgdG8gdGhhdCBlbnRpdHkgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgZm9yIHRoZSBTb2Z0d2FyZSBvciBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHRoZSBzb2Z0d2FyZSBpcworcHJvdmlkZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsCitlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL01ha2VmaWxlIGIvcmMxL29mZmxvYWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzc5ZjA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL01ha2VmaWxlCkBAIC0wLDAgKzEsMjA4IEBACisjDQorIyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMvLw0KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorIy8vDQorIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4NCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuDQorIy8vDQorIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorIw0KKw0KKyMgTUFLRUZJTEUgUEFSQU1FVEVSUw0KKyMNCisjIHJvb3RfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBsaWJvZmZsb2FkDQorIyBidWlsZF9kaXIgLSBwYXRoIHRvIGJ1aWxkIGRpcmVjdG9yeQ0KKyMgbXBzc19kaXIgLSBwYXRoIHRvIHJvb3QgZGlyZWN0b3J5IG9mIG1wc3MNCisjIGxpYmlvbXBfaG9zdF9kaXIgLSBwYXRoIHRvIGhvc3QgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgaXMgaWNjKQ0KKyMgbGliaW9tcF90YXJnZXRfZGlyIC0gcGF0aCB0byB0YXJnZXQgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNhcnJ5IGlmIGNvbXBpbGVyX3RhcmdldCBpcyBpY2MpDQorIyBvbXBfaGVhZGVyX2RpciAtIHBhdGggdG8gb21wLmggKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgYW5kIGNvbXBpbGVyX3RhcmdldCBhcmUgaWNjKQ0KKyMgb3NfaG9zdCAtIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQ0KKyMgb3NfdGFyZ2V0IC0gdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0NCisjIGNvbXBpbGVyX2hvc3QgLSBob3N0IGNvbXBpbGVyDQorIyBjb21waWxlcl90YXJnZXQgLSB0YXJnZXQgY29tcGlsZXINCisjIG9wdGlvbnNfaG9zdCAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG9zdCBjb21waWxlcg0KKyMgb3B0aW9uc190YXJnZXQgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRhcmdldCBjb21waWxlcg0KKyMNCisNCisjIERpcmVjdG9yaWVzDQorcm9vdF9kaXI/PS4NCitidWlsZF9kaXI/PSQocm9vdF9kaXIpL2J1aWxkDQorYnVpbGRfaG9zdF9kaXI9JChidWlsZF9kaXIpL2hvc3QNCitidWlsZF90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS90YXJnZXQNCitvYmpfaG9zdF9kaXI9JChidWlsZF9kaXIpL29ial9ob3N0DQorb2JqX3RhcmdldF9kaXI9JChidWlsZF9kaXIpL29ial90YXJnZXQNCitzb3VyY2VfZGlyPSQocm9vdF9kaXIpL3NyYw0KK2ltcG9ydGVkX2Rpcj0kKHNvdXJjZV9kaXIpL2ltcG9ydGVkDQorDQorIyBPUw0KK29zX2hvc3Q/PWxpbnV4DQorb3NfdGFyZ2V0Pz1saW51eA0KK2lmbmVxICgkKG9zX2hvc3QpXyQob3NfdGFyZ2V0KSwgbGludXhfbGludXgpDQorICAkKGVycm9yICJPbmx5IGxpbnV4IGlzIHN1cHBvcnRlZCIpDQorZW5kaWYNCisNCisjIENvbXBpbGVycw0KK2NvbXBpbGVyX2hvc3Q/PWdjYw0KK2NvbXBpbGVyX3RhcmdldD89Z2NjDQorDQorIyBNUFNTDQorbXBzc19kaXI/PS8NCittcHNzX3ByZXNlbnQ9JChzaGVsbCBpZiB0ZXN0IC1kICQobXBzc19kaXIpOyB0aGVuIGVjaG8gT0s7IGVsc2UgZWNobyBLTzsgZmkpDQoraWZuZXEgKCQobXBzc19wcmVzZW50KSwgT0spDQorICAkKGVycm9yICJDYW5ub3QgZmluZCBNUFNTIGRpcmVjdG9yeSAkKG1wc3NfZGlyKSIpDQorZW5kaWYNCisNCitjb2lfZGlyPSQobXBzc19kaXIpL29wdC9pbnRlbC9taWMvY29pDQorbXlvX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL215bw0KKw0KKyMgU291cmNlcw0KK3NyY19saWJvZmZsb2FkX2NvbW1vbj1kdl91dGlsLmNwcCBsaWJvZmZsb2FkX2Vycm9yLmMgbGlib2ZmbG9hZF9tc2cuYyBvZmZsb2FkX2NvbW1vbi5jcHAgb2ZmbG9hZF90YWJsZS5jcHAgb2ZmbG9hZF90cmFjZS5jcHAgb2ZmbG9hZF91dGlsLmNwcA0KKw0KK3NyY19saWJvZmZsb2FkX2hvc3Q9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNlYW5fdXRpbC5jcHAgY29pL2NvaV9jbGllbnQuY3BwIGNvbXBpbGVyX2lmX2hvc3QuY3BwIG9mZmxvYWRfZW5naW5lLmNwcCBvZmZsb2FkX2Vudi5jcHAgb2ZmbG9hZF9ob3N0LmNwcCBvZmZsb2FkX29tcF9ob3N0LmNwcCBvZmZsb2FkX3RpbWVyX2hvc3QuY3BwIG9mZmxvYWRfb3JzbC5jcHAgb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBvZmZsb2FkX215b19ob3N0LmNwcA0KK3NyY19saWJvZmZsb2FkX2hvc3Q6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfaG9zdCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19saWJvZmZsb2FkX3RhcmdldD0kKHNyY19saWJvZmZsb2FkX2NvbW1vbikgY29pL2NvaV9zZXJ2ZXIuY3BwIGNvbXBpbGVyX2lmX3RhcmdldC5jcHAgb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBvZmZsb2FkX3RhcmdldC5jcHAgb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIG9mZmxvYWRfbXlvX3RhcmdldC5jcHANCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfdGFyZ2V0KSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQorc3JjX29mbGQ9b2ZsZGJlZ2luLmNwcCBvZmxkZW5kLmNwcA0KK3NyY19vZmxkOj0kKGZvcmVhY2ggZmlsZSwkKHNyY19vZmxkKSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQoraGVhZGVycz0kKHdpbGRjYXJkICQoc291cmNlX2RpcikvKi5oKSAkKHdpbGRjYXJkICQoc291cmNlX2RpcikvY29pLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9pbmNsdWRlLyouaCkNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIGhlYWRlcnMrPSQoaW1wb3J0ZWRfZGlyKS9vbXAuaA0KK2VuZGlmDQorDQorIyBPYmplY3RzDQorb2JqX2xpYm9mZmxvYWRfaG9zdD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX2hvc3QpKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouYz0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX2hvc3QpLCQob2JqX2hvc3RfZGlyKS8kKGZpbGUpKQ0KKw0KK29ial9saWJvZmZsb2FkX3RhcmdldD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX3RhcmdldCkpDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKG9ial9saWJvZmZsb2FkX3RhcmdldDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX3RhcmdldCksJChvYmpfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCitvYmpfb2ZsZD0kKG5vdGRpciAkKHNyY19vZmxkKSkNCitvYmpfb2ZsZDo9JChvYmpfb2ZsZDouY3BwPS5vKQ0KK29ial9vZmxkX2hvc3Q9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF9ob3N0X2RpcikvJChmaWxlKSkNCitvYmpfb2ZsZF90YXJnZXQ9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF90YXJnZXRfZGlyKS8kKGZpbGUpKQ0KKw0KKyMgT3B0aW9ucw0KK29wdHNfY29tbW9uPS1PMiAtdyAtZnBpYyAtYyAtRENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVCAtSSQoY29pX2RpcikvaW5jbHVkZSAtSSQobXlvX2RpcikvaW5jbHVkZSAtSSQoc291cmNlX2RpcikNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIG9wdHNfY29tbW9uKz0tSSQoaW1wb3J0ZWRfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkPS1zaGFyZWQgLVdsLC1zb25hbWUsbGlib2ZmbG9hZC5zby41IC1sZGwgLWxzdGRjKysgLWxpb21wNQ0KKw0KK29wdHNfbGlib2ZmbG9hZF9ob3N0PSQob3B0c19saWJvZmZsb2FkKSAtTCQoY29pX2RpcikvaG9zdC1saW51eC1yZWxlYXNlL2xpYiAtbGNvaV9ob3N0IC1MJChteW9fZGlyKS9saWIgLWxteW8tY2xpZW50DQoraWZuZXEgKCQobGliaW9tcF9ob3N0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF9ob3N0Kz0tTCQobGliaW9tcF9ob3N0X2RpcikNCitlbmRpZg0KKw0KK29wdHNfbGlib2ZmbG9hZF90YXJnZXQ9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfZGlyKS9kZXZpY2UtbGludXgtcmVsZWFzZS9saWIgLWxjb2lfZGV2aWNlIC1MJChteW9fZGlyKS9saWIgLWxteW8tc2VydmljZQ0KK2lmbmVxICgkKGxpYmlvbXBfdGFyZ2V0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF90YXJnZXQrPS1MJChsaWJpb21wX3RhcmdldF9kaXIpDQorZW5kaWYNCisNCitvcHRpb25zX2hvc3Q/PQ0KK29wdHNfaG9zdD0kKG9wdGlvbnNfaG9zdCkgLURIT1NUX0xJQlJBUlk9MQ0KK2lmZXEgKCQob3NfaG9zdCksIGxpbnV4KQ0KKyAgb3B0c19ob3N0Kz0tRExJTlVYDQorZW5kaWYNCisNCitvcHRpb25zX3RhcmdldD89DQorb3B0c190YXJnZXQ9JChvcHRpb25zX3RhcmdldCkgLURIT1NUX0xJQlJBUlk9MA0KK2lmZXEgKCQob3NfdGFyZ2V0KSwgbGludXgpDQorICBvcHRzX3RhcmdldCs9LURMSU5VWA0KK2VuZGlmDQorDQorIyBNYWtlIHRhcmdldHMNCisuUEhPTlk6IGFsbCBjbGVhbiBpbmZvDQorDQorYWxsOiBpbmZvICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28gJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvICQob2JqX29mbGRfaG9zdCkgJChvYmpfb2ZsZF90YXJnZXQpDQorDQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41IHwgJChidWlsZF9ob3N0X2RpcikNCisJbG4gLWYgJDwgJEANCisNCiskKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfaG9zdCkgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19saWJvZmZsb2FkX2hvc3QpICQob3B0c19ob3N0KSAkXiAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL2NvaS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvOiAkKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJbG4gLWYgJDwgJEANCisNCiskKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc28uNTogJChvYmpfbGlib2ZmbG9hZF90YXJnZXQpIHwgJChidWlsZF90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2xpYm9mZmxvYWRfdGFyZ2V0KSAkKG9wdHNfdGFyZ2V0KSAkXiAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmMgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL2NvaS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9saWIvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChpbXBvcnRlZF9kaXIpL29tcC5oOiAkKG9tcF9oZWFkZXJfZGlyKS9vbXAuaCB8ICQoaW1wb3J0ZWRfZGlyKQ0KKwljcCAkPCAkQA0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpICQoYnVpbGRfdGFyZ2V0X2RpcikgJChvYmpfaG9zdF9kaXIpICQob2JqX3RhcmdldF9kaXIpOiB8ICQoYnVpbGRfZGlyKQ0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGJ1aWxkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKyQoaW1wb3J0ZWRfZGlyKToNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorDQorY2xlYW46DQorCSQoc2hlbGwgcm0gLXJmICQoYnVpbGRfZGlyKSkNCisJQGVjaG8gIlJlbW92ZSAkKGJ1aWxkX2RpcikgZGlyZWN0b3J5Ig0KKw0KKw0KK2luZm86DQorCUBlY2hvICJyb290X2RpciA9ICQocm9vdF9kaXIpIg0KKwlAZWNobyAiYnVpbGRfZGlyID0gJChidWlsZF9kaXIpIg0KKwlAZWNobyAibXBzc19kaXIgPSAkKG1wc3NfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfaG9zdF9kaXIgPSAkKGxpYmlvbXBfaG9zdF9kaXIpIg0KKwlAZWNobyAibGliaW9tcF90YXJnZXRfZGlyID0gJChsaWJpb21wX3RhcmdldF9kaXIpIg0KKwlAZWNobyAib21wX2hlYWRlcl9kaXIgPSAkKG9tcF9oZWFkZXJfZGlyKSINCisJQGVjaG8gIm9zX2hvc3QgPSAkKG9zX2hvc3QpIg0KKwlAZWNobyAib3NfdGFyZ2V0ID0gJChvc190YXJnZXQpIg0KKwlAZWNobyAiY29tcGlsZXJfaG9zdCA9ICQoY29tcGlsZXJfaG9zdCkiDQorCUBlY2hvICJjb21waWxlcl90YXJnZXQgPSAkKGNvbXBpbGVyX3RhcmdldCkiDQorCUBlY2hvICJvcHRpb25zX2hvc3QgPSAkKG9wdGlvbnNfaG9zdCkiDQorCUBlY2hvICJvcHRpb25zX3RhcmdldCA9ICQob3B0aW9uc190YXJnZXQpIg0KKw0KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL1JFQURNRS50eHQgYi9yYzEvb2ZmbG9hZC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViOWZiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTI5IEBACisNCisJICAgICAgIFJFQURNRSBmb3IgSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkNCisJICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbg0KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLg0KK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOg0KKw0KKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcNCisNCitpbiB0aGlzIGRpcmVjdG9yeS4NCisNCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZA0KK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlDQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLg0KKw0KK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20NCit3d3cuZG94eWdlbi5vcmcuDQorDQorDQorU29mdHdhcmUgUmVxdWlyZW1lbnRzDQorPT09PT09PT09PT09PT09PT09PT09DQorDQorSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkgcmVxdWlyZXMgYWRkaXRpb25hbCBzb2Z0d2FyZToNCisNCisxKSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4gIFlvdSBjYW4gZWl0aGVyIGRvd25sb2FkIHRoZSBzb3VyY2UNCitjb2RlIGZvciB0aGF0IChmcm9tIG9wZW5tcHJ0bC5vcmcgb3Igb3Blbm1wLmxsdm0ub3JnKSBvciBzaW1wbHkgdXNlIHRoZQ0KK2NvbXBpbGVkIHZlcnNpb24gZGlzdHJpYnV0ZWQgd2l0aCB0aGUgSW50ZWwgY29tcGlsZXJzLg0KKzIpIEludGVsKFIpIENPSSBSdW50aW1lIExpYnJhcnkgYW5kIEludGVsKFIpIE1ZTyBSdW50aW1lIExpYnJhcnkuICBUaGVzZQ0KK2xpYnJhcmllcyBhcmUgcGFydCBvZiBJbnRlbChSKSBNYW55Y29yZSBQbGF0Zm9ybSBTb2Z0d2FyZSBTdGFjayAoTVBTUykuICBZb3UNCitjYW4gZG93bmxvYWQgTVBTUyBzb3VyY2UgY29kZSBvciBiaW5hcmllcyBmcm9tDQorc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLW1hbnljb3JlLXBsYXRmb3JtLXNvZnR3YXJlLXN0YWNrLW1wc3MuDQorQmluYXJpZXMgaW5jbHVkZSBob3N0IGxpYnJhcmllcyBmb3IgSW50ZWwoUikgNjQgQXJjaGl0ZWN0dXJlIGFuZCB0YXJnZXQNCitsaWJyYXJpZXMgZm9yIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4NCisNCitBbHNvIHlvdSB3aWxsIHJlcXVpcmUgYWxsIG9mIHRoZSBsaWJyYXJpZXMgdGhhdCBlbmFibGUgdGhlIHRhcmdldCBjb2RlIHRvIHJ1bg0KK29uIGRldmljZS4gIElmIHlvdSB0YXJnZXQgdGhlIEludGVsKFIpIFhlb24gUGhpIChUTSkgY29wcm9jZXNzb3IsIHRoZXNlDQorbGlicmFyaWVzIGNhbiBiZSB0YWtlbiBmcm9tIE1QU1MgdG9vLg0KKw0KKw0KK0hvdyB0byBCdWlsZCB0aGUgSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorVGhlIE1ha2VmaWxlIGF0IHRoZSB0b3AtbGV2ZWwgd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB3aGF0IGl0IG5lZWRzIHRvDQorYnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5LiAgVG8gc2VlIHRoZSBkZWZhdWx0IHNldHRpbmdzLA0KK3R5cGU6DQorDQorbWFrZSBpbmZvDQorDQorWW91IGNhbiBjaGFuZ2UgdGhlIE1ha2VmaWxlJ3MgYmVoYXZpb3Igd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6DQorDQorcm9vdF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlDQorCQkgICAgICB0b3AtbGV2ZWwgTWFrZWZpbGUuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbiB0aGUNCisJCSAgICAgIHZhbHVlIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Lg0KKw0KK2J1aWxkX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbA0KKwkJICAgICAgdGFrZSBvbiB2YWx1ZSBbcm9vdF9kaXJdL2J1aWxkLg0KKw0KK21wc3NfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUNCisJCSAgICAgIFN0YWNrIGluc3RhbGwgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24NCisJCSAgICAgIHRoZSB2YWx1ZSBvZiBvcGVyYXRpbmcgc3lzdGVtJ3Mgcm9vdCBkaXJlY3RvcnkuDQorDQorbGliaW9tcF9ob3N0X2RpcjogICAgIFRoZSBwYXRoIHRvIHRoZSBob3N0IEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Lg0KKwkJICAgICAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiB0aGUgaG9zdCBjb21waWxlciBpcyBvdGhlcg0KKwkJICAgICAgdGhhbiBpY2MuDQorDQorbGliaW9tcF90YXJnZXRfZGlyOiAgIFRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lDQorCQkgICAgICBMaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiB0aGUgdGFyZ2V0DQorCQkgICAgICBjb21waWxlciBpcyBvdGhlciB0aGFuIGljYy4NCisNCitvbXBfaGVhZGVyX2RpcjogICAgICAgVGhlIHBhdGggdG8gdGhlIGhlYWRlciBmaWxlIDxvbXAuaD4gb2YgSW50ZWwoUikgT3Blbk1QKg0KKwkJICAgICAgUnVudGltZSBMaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgaWYgZWl0aGVyIGhvc3QNCisJCSAgICAgIG9yIHRhcmdldCBjb21waWxlciBpcyBvdGhlciB0aGFuIGljYy4NCisNCitvc19ob3N0OgkgICAgICBPcGVyYXRpbmcgc3lzdGVtIG9uIGhvc3QuICBDdXJyZW50bHkgc3VwcG9ydHMgb25seQ0KKwkJICAgICAgImxpbnV4IiB3aGljaCBpcyBzZXQgYnkgZGVmYXVsdC4NCisNCitvc190YXJnZXQ6CSAgICAgIE9wZXJhdGluZyBzeXN0ZW0gb24gdGFyZ2V0IGRldmljZS4gIEN1cnJlbnRseSBzdXBwb3J0cw0KKwkJICAgICAgb25seSAibGludXgiIHdoaWNoIGlzIHNldCBieSBkZWZhdWx0Lg0KKw0KK2NvbXBpbGVyX2hvc3Q6CSAgICAgIFdoaWNoIGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGJ1aWxkIG9mIHRoZSBob3N0IHBhcnQuDQorCQkgICAgICBEZWZhdWx0cyB0byAiZ2NjIiouICBBbHNvIHN1cHBvcnRzICJpY2MiIGFuZCAiY2xhbmciKi4NCisJCSAgICAgIFlvdSBzaG91bGQgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlciBvciBpdA0KKwkJICAgICAgc2hvdWxkIGJlIGluIHRoZSB1c2VyJ3MgcGF0aC4NCisNCitjb21waWxlcl9ob3N0OgkgICAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZCBvZiB0aGUgdGFyZ2V0IHBhcnQuDQorCQkgICAgICBEZWZhdWx0cyB0byAiZ2NjIiouICBBbHNvIHN1cHBvcnRzICJpY2MiIGFuZCAiY2xhbmciKi4NCisJCSAgICAgIFlvdSBzaG91bGQgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlciBvciBpdA0KKwkJICAgICAgc2hvdWxkIGJlIGluIHRoZSB1c2VyJ3MgcGF0aC4NCisNCitvcHRpb25zX2hvc3Q6CSAgICAgIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIGhvc3QgY29tcGlsZXIuDQorDQorb3B0aW9uc190YXJnZXQ6ICAgICAgIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRhcmdldCBjb21waWxlci4NCisNCitUbyB1c2UgYW55IG9mIHRoZSBvcHRpb25zIGFib3ZlLCBzaW1wbGUgYWRkIDxvcHRpb25fbmFtZT49PHZhbHVlPi4gIEZvcg0KK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggaWNjIGluc3RlYWQgb2YgZ2NjLCB0eXBlOg0KKw0KK21ha2UgY29tcGlsZXJfaG9zdD1pY2MgY29tcGlsZXJfdGFyZ2V0PWljYw0KKw0KKw0KK1N1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IEludGVsKFIpIDY0LCBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkDQorQ29yZSBBcmNoaXRlY3R1cmUNCisNCisJICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCSAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICAgY2xhbmcgICAgfA0KKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQorfCBMaW51eCogT1MgICB8ICAgICAgWWVzICAgICAgfCAgICAgWWVzKDEpICB8ICAgICBZZXMoMSkgIHwNCit8IE9TIFgqICAgICAgIHwgICAgICAgTm8gICAgICB8ICAgICAgTm8gICAgIHwgICAgICBObyAgICAgfA0KK3wgV2luZG93cyogT1MgfCAgICAgICBObyAgICAgIHwgICAgICBObyAgICAgfCAgICAgIE5vICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisoMSkgTGlib2ZmbG9hZCByZXF1aXJlcyBfcmR0c2MgaW50cmluc2ljLCB3aGljaCBtYXkgYmUgdW5zdXBwb3J0ZWQgYnkgc29tZQ0KKyAgICB2ZXJzaW9ucyBvZiBjb21waWxlci4gIEluIHRoaXMgY2FzZSB5b3UgbmVlZCB0byBpbmNsdWRlIHNyYy9yZHRzYy5oDQorICAgIG1hbnVhbGx5IGJ5IHVzaW5nIE1ha2VmaWxlIG9wdGlvbnMgb3B0aW9uc19ob3N0IGFuZCBvcHRpb25zX3RhcmdldDoNCisNCisgICAgbWFrZSBvcHRpb25zX2hvc3Q9Ii1pbmNsdWRlIHNyYy9yZHRzYy5oIiBvcHRpb25zX3RhcmdldD0iLWluY2x1ZGUgc3JjL3JkdHNjLmgiDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitOb3RpY2VzDQorPT09PT09PQ0KKw0KKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuDQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYgYi9yYzEvb2ZmbG9hZC9kb2MvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE3NmYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnIGIvcmMxL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0NWI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9kb2MvZG94eWdlbi9jb25maWcKQEAgLTAsMCArMSwyMzI4IEBACisjIERveHlmaWxlIDEuOC42CisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgorIworIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgorIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cywgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoXCIgXCIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIHRleHQKKyMgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udgorIyBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYKKyMgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKKyMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCisjIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCisjIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkludGVsJnJlZzsmbmJzcDtPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeSIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzIGluY2x1ZGVkIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdCBleGNlZWQgNTUgcGl4ZWxzCisjIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbworIyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworUFJPSkVDVF9MT0dPICAgICAgICAgICA9IAorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgcGF0aAorIyBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uIElmIGEgcmVsYXRpdmUgcGF0aCBpcworIyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZgorIyBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogQWZyaWthYW5zLCBBcmFiaWMsIEFybWVuaWFuLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsCisjIENoaW5lc2UtVHJhZGl0aW9uYWwsIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRW5nbGlzaCAoVW5pdGVkIFN0YXRlcyksCisjIEVzcGVyYW50bywgRmFyc2kgKFBlcnNpYW4pLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwgR3JlZWssIEh1bmdhcmlhbiwKKyMgSW5kb25lc2lhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLAorIyBLb3JlYW4sIEtvcmVhbi1lbiAoS29yZWFuIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksIExhdHZpYW4sIExpdGh1YW5pYW4sCisjIE1hY2Vkb25pYW4sIE5vcndlZ2lhbiwgUGVyc2lhbiAoRmFyc2kpLCBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLAorIyBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFR1cmtpc2gsCisjIFVrcmFpbmlhbiBhbmQgVmlldG5hbWVzZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEVuZ2xpc2guCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gc3JjLworCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IHNyYy8KKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KKworIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IGEKKyMgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyBjb21tZW50cykgYXMKKyMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBUaGUgbmV3IGRlZmF1bHQgaXMKKyMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24uIFNldCB0aGlzCisjIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW9yIGluc3RlYWQuCisjCisjIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyBhbHNvIG1lYW5zIHRoYXQgcmF0aW9uYWwgcm9zZSBjb21tZW50cyBhcmUKKyMgbm90IHJlY29nbml6ZWQgYW55IG1vcmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGFuIHVuZG9jdW1lbnRlZCBtZW1iZXIgaW5oZXJpdHMgdGhlCisjIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCByZS1pbXBsZW1lbnRzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhCisjIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlCisjIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETC4gRm9yIGluc3RhbmNlIHRvIG1ha2UKKyMgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMKKyMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlIEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkCisjIG9yIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgorIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgorIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKKyMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZQorIyBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyB3aWxsIG1ha2UKKyMgZG94eWdlbiB0byByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUKKyMgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3UKKyMgc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZiB0aGUgc2FtZSB0eXBlCisjIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSBzdWJncm91cCBvZiB0aGF0CisjIHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byBOTyB0byBwcmV2ZW50CisjIHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZyB0aGUKKyMgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kIHVuaW9ucworIyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZyBcaW5ncm91cCkKKyMgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWAorIyBhbmQgUlRGKS4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCB3b3JrIGluIGNvbWJpbmF0aW9uIHdpdGgKKyMgU0VQQVJBVEVfTUVNQkVSX1BBR0VTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucworIyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIG9yIHNpbXBsZSB0eXBlZGVmIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGdyb3VwIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldAorIyB0byBOTywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQKKyMgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCB0YWcgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IKKyMgZW51bSBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28KKyMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0CisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSBiZQorIyB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZAorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCisjIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZSB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKSBkZWZpbmVkCisjIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTworIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsIG1ldGhvZHMsCisjIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTyBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcworIyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYW55CisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHN5c3RlbSBkZXBlbmRlbnQuCisKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGgKKyMgdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBicmllZgorIyBkZXNjcmlwdGlvbnMgb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKKyMgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZSBsaXN0CisjIHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBEbyBub3QgdXNlIGZpbGUgbmFtZXMgd2l0aCBzcGFjZXMsIGJpYnRleCBjYW5ub3QgaGFuZGxlIHRoZW0uIFNlZQorIyBhbHNvIFxjaXRlIGZvciBpbmZvIGhvdyB0byBjcmVhdGUgcmVmZXJlbmNlcy4KKworQ0lURV9CSUJfRklMRVMgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRvCisjIHN0YW5kYXJkIG91dHB1dCBieSBkb3h5Z2VuLiBJZiBRVUlFVCBpcyBzZXQgdG8gWUVTIHRoaXMgaW1wbGllcyB0aGF0IHRoZQorIyBtZXNzYWdlcyBhcmUgb2ZmLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKKyMgZ2VuZXJhdGVkIHRvIHN0YW5kYXJkIGVycm9yICggc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTyBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyCisjIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4KKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgdGhlCisjIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLCAqLmMrKywgKi5qYXZhLCAqLmlpLAorIyAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLCAqLmhoLCAqLmh4eCwgKi5ocHAsCisjICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsICoubSwgKi5tYXJrZG93biwKKyMgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwgKi52aGQsICoudmhkbCwgKi51Y2YsCisjICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcCAqLmY5MAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gc3JjL2ltcG9ydGVkIHNyYy9yZHRzYy5oCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4gRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiBwYXR0ZXJuPWZpbHRlcgorIyAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cKKyMgZmlsdGVycyBhcmUgdXNlZC4gSWYgdGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgaXMgZW1wdHkgb3IgaWYgbm9uZSBvZiB0aGUKKyMgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUiApIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQKKyMgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgY29tcGlsZWQgd2l0aCB0aGUgLS13aXRoLWxpYmNsYW5nIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDTEFOR19BU1NJU1RFRF9QQVJTSU5HID0gTk8KKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIEhUTUwgb3V0cHV0CisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBodG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwgLnBocCwgLmFzcCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgaGVhZGVyIGZpbGUgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4KKyMKKyMgVG8gZ2V0IHZhbGlkIEhUTUwgdGhlIGhlYWRlciBmaWxlIHRoYXQgaW5jbHVkZXMgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cworIyB0aGF0IGRveHlnZW4gbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgKGUuZy4KKyMgdGhlIHNldHRpbmcgR0VORVJBVEVfVFJFRVZJRVcpLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc3RhcnQgd2l0aCBhCisjIGRlZmF1bHQgaGVhZGVyIHVzaW5nCisjIGRveHlnZW4gLXcgaHRtbCBuZXdfaGVhZGVyLmh0bWwgbmV3X2Zvb3Rlci5odG1sIG5ld19zdHlsZXNoZWV0LmNzcworIyBZb3VyQ29uZmlnRmlsZQorIyBhbmQgdGhlbiBtb2RpZnkgdGhlIGZpbGUgbmV3X2hlYWRlci5odG1sLiBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIgorIyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGhlYWRlciB0aGF0IGRveHlnZW4gbm9ybWFsbHkKKyMgdXNlcy4KKyMgTm90ZTogVGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5IGhhdmUgdG8gcmVnZW5lcmF0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4uIEZvciBhIGRlc2NyaXB0aW9uCisjIG9mIHRoZSBwb3NzaWJsZSBtYXJrZXJzIGFuZCBibG9jayBuYW1lcyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBmb290ZXIgZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkCisjIGZvb3Rlci4gU2VlIEhUTUxfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQKKyMgZm9vdGVyIGFuZCB3aGF0IHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuIFNlZSBhbHNvCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgZm9vdGVyCisjIHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUKKyMgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlIGxvb2sgb2YKKyMgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIHN0eWxlCisjIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBOb3RlOiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyB0YWcsIGFzCisjIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzIHRhZyAoSFRNTF9TVFlMRVNIRUVUKSB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lCisjIG9ic29sZXRlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsIHVzZXItCisjIGRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEZvciBhbiBleGFtcGxlCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGVzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKCBoaGMuZXhlKS4gSWYgbm9uLWVtcHR5CisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoCisjIFlFUykgb3IgdGhhdCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKCBOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKCBoaGspLCBjb250ZW50ICggaGhjKQorIyBhbmQgcHJvamVjdCBmaWxlIGNvbnRlbnQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0gCisKKyMgVGhlIEJJTkFSWV9UT0MgZmxhZyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoCisjIFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKCBOTykgaW4gdGhlIC5jaG0gZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGVzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PCisKKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0CisjIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCisjIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCisjIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKKyMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCisjIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAorIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCisjIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKKyMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0CisjIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisjIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKKyMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4CisjIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCisjIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCisjIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4CisjIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKKyMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPSAKKworIyBUaGUgTUFUSEpBWF9DT0RFRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgd2l0aCBqYXZhc2NyaXB0IHBpZWNlcworIyBvZiBjb2RlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHN0YXJ0dXAgb2YgdGhlIE1hdGhKYXggY29kZS4gU2VlIHRoZSBNYXRoSmF4IHNpdGUKKyMgKHNlZTogaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgYW4KKyMgZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0NPREVGSUxFICAgICAgID0gCisKKyMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3ggZm9yCisjIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgYW5kIERIVE1MIGFuZAorIyBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIEhUTUwgaGVscAorIyAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzIChHRU5FUkFURV9ET0NTRVQpCisjIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIHR5cGljYWxseSBiZSBkaXNhYmxlZC4KKyMgRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUgY2FuIGJlIHNsb3csIHRoZW4KKyMgZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4gSXQgaXMgcG9zc2libGUgdG8KKyMgc2VhcmNoIHVzaW5nIHRoZSBrZXlib2FyZDsgdG8ganVtcCB0byB0aGUgc2VhcmNoIGJveCB1c2UgPGFjY2VzcyBrZXk+ICsgUworIyAod2hhdCB0aGUgPGFjY2VzcyBrZXk+IGlzIGRlcGVuZHMgb24gdGhlIE9TIGFuZCBicm93c2VyLCBidXQgaXQgaXMgdHlwaWNhbGx5CisjIDxDVFJMPiwgPEFMVD4vPG9wdGlvbj4sIG9yIGJvdGgpLiBJbnNpZGUgdGhlIHNlYXJjaCBib3ggdXNlIHRoZSA8Y3Vyc29yIGRvd24KKyMga2V5PiB0byBqdW1wIGludG8gdGhlIHNlYXJjaCByZXN1bHRzIHdpbmRvdywgdGhlIHJlc3VsdHMgY2FuIGJlIG5hdmlnYXRlZAorIyB1c2luZyB0aGUgPGN1cnNvciBrZXlzPi4gUHJlc3MgPEVudGVyPiB0byBzZWxlY3QgYW4gaXRlbSBvciA8ZXNjYXBlPiB0byBjYW5jZWwKKyMgdGhlIHNlYXJjaC4gVGhlIGZpbHRlciBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCB3aGVuIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZQorIyBzZWFyY2ggYm94IGJ5IHByZXNzaW5nIDxTaGlmdD4rPGN1cnNvciBkb3duPi4gQWxzbyBoZXJlIHVzZSB0aGUgPGN1cnNvciBrZXlzPgorIyB0byBzZWxlY3QgYSBmaWx0ZXIgYW5kIDxFbnRlcj4gb3IgPGVzY2FwZT4gdG8gYWN0aXZhdGUgb3IgY2FuY2VsIHRoZSBmaWx0ZXIKKyMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlCisjIGltcGxlbWVudGVkIHVzaW5nIGEgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGEgd2ViIGNsaWVudCB1c2luZyBKYXZhc2NyaXB0LiBUaGVyZQorIyBhcmUgdHdvIGZsYXZvdXJzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUKKyMgRVhURVJOQUxfU0VBUkNIIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yCisjIHNlYXJjaGluZyBhbmQgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzCisjIGVuYWJsZWQgdGhlIGluZGV4aW5nIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZQorIyB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyICggZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kCisjIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FX1VSTCAgICAgICA9IAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAorIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKKyMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKKyMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcworIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKKyMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIX0lEICAgICA9IAorCisjIFRoZSBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhyb3VnaCBkb3h5Z2VuCisjIHByb2plY3RzIG90aGVyIHRoYW4gdGhlIG9uZSBkZWZpbmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLCBidXQgdGhhdCBhcmUKKyMgYWxsIGFkZGVkIHRvIHRoZSBzYW1lIGV4dGVybmFsIHNlYXJjaCBpbmRleC4gRWFjaCBwcm9qZWN0IG5lZWRzIHRvIGhhdmUgYQorIyB1bmlxdWUgaWQgc2V0IHZpYSBFWFRFUk5BTF9TRUFSQ0hfSUQuIFRoZSBzZWFyY2ggbWFwcGluZyB0aGVuIG1hcHMgdGhlIGlkIG9mCisjIHRvIGEgcmVsYXRpdmUgbG9jYXRpb24gd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kLiBUaGUgZm9ybWF0IGlzOgorIyBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgPSB0YWduYW1lMT1sb2MxIHRhZ25hbWUyPWxvYzIgLi4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfU0VBUkNIX01BUFBJTkdTICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQorIyBpbnZva2VkLgorIworIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCisjIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcworIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byBnZW5lcmF0ZQorIyBpbmRleCBmb3IgTGFUZVguCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IG1ha2VpbmRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IKKyMgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5CisjIEVYVFJBX1BBQ0tBR0VTPXRpbWVzCisjIElmIGxlZnQgYmxhbmsgbm8gZXh0cmEgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGZpcnN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgaGVhZGVyLiBTZWUKKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBsZXQgZG94eWdlbiB3cml0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgdG8gYSBzZXBhcmF0ZSBmaWxlLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBoZWFkZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISBUaGUKKyMgZm9sbG93aW5nIGNvbW1hbmRzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIHRoZSBoZWFkZXI6ICR0aXRsZSwKKyMgJGRhdGV0aW1lLCAkZGF0ZSwgJGRveHlnZW52ZXJzaW9uLCAkcHJvamVjdG5hbWUsICRwcm9qZWN0bnVtYmVyLiBEb3h5Z2VuIHdpbGwKKyMgcmVwbGFjZSB0aGVtIGJ5IHJlc3BlY3RpdmVseSB0aGUgdGl0bGUgb2YgdGhlIHBhZ2UsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUsCisjIG9ubHkgdGhlIGN1cnJlbnQgZGF0ZSwgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRveHlnZW4sIHRoZSBwcm9qZWN0IG5hbWUgKHNlZQorIyBQUk9KRUNUX05BTUUpLCBvciB0aGUgcHJvamVjdCBudW1iZXIgKHNlZSBQUk9KRUNUX05VTUJFUikuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gZG9jL2RveHlnZW4vaGVhZGVyLnRleAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCB1c2UgcGRmbGF0ZXggdG8gZ2VuZXJhdGUKKyMgdGhlIFBERiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIExhVGVYIGZpbGVzLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgorIyBjbGFzc2VzIGFuZCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KKworIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKyMgTUFOX09VVFBVVC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCisjIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgorIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKKyMgb3B0aW9uYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgWE1MIHNjaGVtYSwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYQorIyB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPSAKKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIFhNTCBEVEQsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEKKyMgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfRFREICAgICAgICAgICAgICAgID0gCisKKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gQXV0b0dlbgorIyBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsCisjIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQorIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTyB0aGUKKyMgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQKKyMganVzdCB0aGUgc2FtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQorIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCisjIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAorIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyBvbmx5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpbGwgYmUKKyMgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkIHdheSBieSBzZXR0aW5nCisjIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlIFBSRURFRklORUQgYW5kCisjIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBpbmNsdWRlcyBmaWxlcyBpbiB0aGUKKyMgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUKKyMgcHJlcHJvY2Vzc29yLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIX0lOQ0xVREVTIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBDT0lfTElCUkFSWV9WRVJTSU9OPTIgLURNWU9fU1VQUE9SVCAtRE9GRkxPQURfREVCVUc9MSAtRFNFUF9TVVBQT1JUIC1EVElNSU5HX1NVUFBPUlQKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsCisjIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4KKyMgYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoIGZ1bmN0aW9uIG1hY3JvcyBhcmUKKyMgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90CisjIHJlbW92ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBUQUdGSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWcgZmlsZXMuIEZvciBlYWNoIHRhZworIyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZSBmb3JtYXQgb2YKKyMgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgorIyB3aGVyZSBsb2MxIGFuZCBsb2MyIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyBvciBVUkxzLiBTZWUgdGhlCisjIHNlY3Rpb24gIkxpbmtpbmcgdG8gZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZQorIyBvZiB0YWcgZmlsZXMuCisjIE5vdGU6IEVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGFuIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzIHdpbGwgYmUgbGlzdGVkIGluIHRoZQorIyBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIHBhZ2VzIHdpbGwgYmUgbGlzdGVkIGluCisjIHRoZSByZWxhdGVkIHBhZ2VzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIHBhZ2VzIHdpbGwKKyMgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9QQUdFUyAgICAgICAgID0gWUVTCisKKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0CisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgJ3doaWNoIHBlcmwnKS4KKyMgVGhlIGRlZmF1bHQgZmlsZSAod2l0aCBhYnNvbHV0ZSBwYXRoKSBpczogL3Vzci9iaW4vcGVybC4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgaW5oZXJpdGFuY2UKKyMgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZCBvciBpcyBub3QgYSBjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXogKHNlZToKKyMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvKSwgYSBncmFwaCB2aXN1YWxpemF0aW9uIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQKKyMgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMKKyMgc2V0IHRvIE5PCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcyBhbGxvd2VkCisjIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCBkb3h5Z2VuIHdpbGwgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YKKyMgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQgZXhwbGljaXRseSB0byBhIHZhbHVlCisjIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZSBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nCisjIHNwZWVkLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzMiwgZGVmYXVsdCB2YWx1ZTogMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCisKKyMgV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCBuIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuCisjIE5vdGU6IElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyCisjIHRvIG1ha2UgdGhlIFNWRyBmaWxlcyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzCisjIHJlcXVpcmVtZW50KS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogcG5nLCBqcGcsIGdpZiBhbmQgc3ZnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKKyMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCisjIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCisjIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkb3RmaWxlCisjIGNvbW1hbmQpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcbXNjZmlsZQorIyBjb21tYW5kKS4KKworTVNDRklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQorIyBjb21tYW5kKS4KKworRElBRklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdAorIyBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB2YXJpb3VzIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9yYzEvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlOTYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4CkBAIC0wLDAgKzEsOTAgQEAKKyUgTGF0ZXggaGVhZGVyIGZvciBkb3h5Z2VuIDEuOC4zLjENCitcZG9jdW1lbnRjbGFzc3tib29rfQ0KK1x1c2VwYWNrYWdlW2E0cGFwZXIsdG9wPTIuNWNtLGJvdHRvbT0yLjVjbSxsZWZ0PTIuNWNtLHJpZ2h0PTIuNWNtXXtnZW9tZXRyeX0NCitcdXNlcGFja2FnZXttYWtlaWR4fQ0KK1x1c2VwYWNrYWdle25hdGJpYn0NCitcdXNlcGFja2FnZXtncmFwaGljeH0NCitcdXNlcGFja2FnZXttdWx0aWNvbH0NCitcdXNlcGFja2FnZXtmbG9hdH0NCitcdXNlcGFja2FnZXtsaXN0aW5nc30NCitcdXNlcGFja2FnZXtjb2xvcn0NCitcdXNlcGFja2FnZXtpZnRoZW59DQorXHVzZXBhY2thZ2VbdGFibGVde3hjb2xvcn0NCitcdXNlcGFja2FnZXt0ZXh0Y29tcH0NCitcdXNlcGFja2FnZXthbGx0dH0NCitcdXNlcGFja2FnZXtpZnBkZn0NCitcaWZwZGYNCitcdXNlcGFja2FnZVtwZGZ0ZXgsDQorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwNCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsDQorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsDQorICAgICAgICAgICAgdW5pY29kZQ0KKyAgICAgICAgICAgXXtoeXBlcnJlZn0NCitcZWxzZQ0KK1x1c2VwYWNrYWdlW3BzMnBkZiwNCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLA0KKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwNCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwNCisgICAgICAgICAgICB1bmljb2RlDQorICAgICAgICAgICBde2h5cGVycmVmfQ0KK1x1c2VwYWNrYWdle3BzcGljdHVyZX0NCitcZmkNCitcdXNlcGFja2FnZVt1dGY4XXtpbnB1dGVuY30NCitcdXNlcGFja2FnZXttYXRocHRteH0NCitcdXNlcGFja2FnZVtzY2FsZWQ9LjkwXXtoZWx2ZXR9DQorXHVzZXBhY2thZ2V7Y291cmllcn0NCitcdXNlcGFja2FnZXtzZWN0c3R5fQ0KK1x1c2VwYWNrYWdle2Ftc3N5bWJ9DQorXHVzZXBhY2thZ2VbdGl0bGVzXXt0b2Nsb2Z0fQ0KK1x1c2VwYWNrYWdle2RveHlnZW59DQorXHVzZXBhY2thZ2V7ZmFuY3loZHJ9DQorXHBhZ2VzdHlsZXtmYW5jeX0NCitcbHN0c2V0e2xhbmd1YWdlPUMrKyxpbnB1dGVuY29kaW5nPXV0ZjgsYmFzaWNzdHlsZT1cZm9vdG5vdGVzaXplLGJyZWFrbGluZXM9dHJ1ZSxicmVha2F0d2hpdGVzcGFjZT10cnVlLHRhYnNpemU9NCxudW1iZXJzPWxlZnQgfQ0KK1xtYWtlaW5kZXgNCitcc2V0Y291bnRlcnt0b2NkZXB0aH17M30NCitccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0NCitccmVuZXdjb21tYW5ke1xmYW1pbHlkZWZhdWx0fXtcc2ZkZWZhdWx0fQ0KK1xoZnV6ej0xNXB0DQorXHNldGxlbmd0aHtcZW1lcmdlbmN5c3RyZXRjaH17MTVwdH0NCitcaGJhZG5lc3M9NzUwDQorXHRvbGVyYW5jZT03NTANCitcYmVnaW57ZG9jdW1lbnR9DQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj1mYWxzZSxjaXRlY29sb3I9Ymx1ZX0NCitcYmVnaW57dGl0bGVwYWdlfQ0KK1x2c3BhY2UqezdjbX0NCitcYmVnaW57Y2VudGVyfQ0KK3tcTGFyZ2UgSW50ZWxcdGV4dHN1cGVyc2NyaXB0e1x0ZXh0cmVnaXN0ZXJlZH0gT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkgfVxcDQorXHZzcGFjZSp7MWNtfQ0KK3tcbGFyZ2UgR2VuZXJhdGVkIGJ5IERveHlnZW4gJGRveHlnZW52ZXJzaW9uIH1cXA0KK1x2c3BhY2UqezAuNWNtfQ0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXA0KK1xlbmR7Y2VudGVyfQ0KK1xlbmR7dGl0bGVwYWdlfQ0KKw0KK3tcYmYgRlRDIE9wdGltaXphdGlvbiBOb3RpY2V9DQorDQorSW50ZWwncyBjb21waWxlcnMgbWF5IG9yIG1heSBub3Qgb3B0aW1pemUgdG8gdGhlIHNhbWUgZGVncmVlIGZvciBub24tSW50ZWwgbWljcm9wcm9jZXNzb3JzIGZvcg0KK29wdGltaXphdGlvbnMgdGhhdCBhcmUgbm90IHVuaXF1ZSB0byBJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFRoZXNlIG9wdGltaXphdGlvbnMgaW5jbHVkZSBTU0UyLA0KK1NTRTMsIGFuZCBTU1NFMyBpbnN0cnVjdGlvbiBzZXRzIGFuZCBvdGhlciBvcHRpbWl6YXRpb25zLiBJbnRlbCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlDQorYXZhaWxhYmlsaXR5LCBmdW5jdGlvbmFsaXR5LCBvciBlZmZlY3RpdmVuZXNzIG9mIGFueSBvcHRpbWl6YXRpb24gb24gbWljcm9wcm9jZXNzb3JzIG5vdA0KK21hbnVmYWN0dXJlZCBieSBJbnRlbC4NCisNCitNaWNyb3Byb2Nlc3Nvci1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucyBpbiB0aGlzIHByb2R1Y3QgYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBJbnRlbA0KK21pY3JvcHJvY2Vzc29ycy4gQ2VydGFpbiBvcHRpbWl6YXRpb25zIG5vdCBzcGVjaWZpYyB0byBJbnRlbCBtaWNyb2FyY2hpdGVjdHVyZSBhcmUgcmVzZXJ2ZWQgZm9yDQorSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2FibGUgcHJvZHVjdCBVc2VyIGFuZCBSZWZlcmVuY2UgR3VpZGVzIGZvcg0KK21vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBzcGVjaWZpYyBpbnN0cnVjdGlvbiBzZXRzIGNvdmVyZWQgYnkgdGhpcyBub3RpY2UuDQorDQorTm90aWNlIHJldmlzaW9uIFwjMjAxMTA4MDQNCisNCitcdnNwYWNlKnswLjVjbX0NCisNCit7XGJmIFRyYWRlbWFya3N9DQorDQorSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KKw0KK1RoaXMgZG9jdW1lbnQgaXMgQ29weXJpZ2h0IFx0ZXh0Y29weXJpZ2h0IDIwMTQsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiANCisNCitccGFnZW51bWJlcmluZ3tyb21hbn0NCitcdGFibGVvZmNvbnRlbnRzDQorXHBhZ2VudW1iZXJpbmd7YXJhYmljfQ0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0NCmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTg5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcApAQCAtMCwwICsxLDM0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY2Vhbl91dGlsLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworLy8gMS4gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlCisvLyAyLiBpbml0aWFsaXplZCBpdCBmb3IgcmVhZGluZyBjb25zZXF1ZW50bHkgY29udGlndW91cyByYW5nZXMKKy8vICAgIGRlc2NyaWJlZCBieSAiYXAiIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoY29uc3QgYXJyX2Rlc2MgKmFwKQoreworICAgIENlYW5SZWFkUmFuZ2VzICogcmVzOworCisgICAgLy8gZmluZCB0aGUgbWF4IGNvbnRpZ3VvdXMgcmFuZ2UKKyAgICBpbnQ2NF90IHJhbmsgPSBhcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBsZW5ndGggPSBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgZm9yICg7IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIGlmIChhcC0+ZGltW3JhbmtdLnN0cmlkZSA9PSAxKSB7CisgICAgICAgICAgICBsZW5ndGggKj0gKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsgMSk7CisgICAgICAgICAgICBpZiAocmFuayA+IDAgJiYgbGVuZ3RoICE9IGFwLT5kaW1bcmFuayAtIDFdLnNpemUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0oQ2VhblJlYWRSYW5nZXMgKiltYWxsb2Moc2l6ZW9mKENlYW5SZWFkUmFuZ2VzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwLT5yYW5rIC0gcmFuaykgKiBzaXplb2YoQ2VhblJlYWREaW0pKTsKKyAgICByZXMtPmN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICByZXMtPnJhbmdlX3NpemUgPSBsZW5ndGg7CisgICAgcmVzLT5sYXN0X25vbmNvbnRfaW5kID0gcmFuazsKKworICAgIC8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgY29udGlndW91cyByYW5nZXMgaW5zaWRlIG5vbmNvbnRpZ3VvdXMgZGltZW5zaW9ucworICAgIGludCBjb3VudCA9IDE7CisgICAgYm9vbCBwcmV2X2lzX2NvbnQgPSB0cnVlOworICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICByZXMtPkRpbVtyYW5rXS5jb3VudCA9IGNvdW50OworICAgICAgICByZXMtPkRpbVtyYW5rXS5zaXplID0gYXAtPmRpbVtyYW5rXS5zdHJpZGUgKiBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgICAgIGNvdW50ICo9IChwcmV2X2lzX2NvbnQgJiYgYXAtPmRpbVtyYW5rXS5zdHJpZGUgPT0gMT8gMSA6CisgICAgICAgICAgICAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgKworICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS5zdHJpZGUpIC8gYXAtPmRpbVtyYW5rXS5zdHJpZGUpOworICAgICAgICBwcmV2X2lzX2NvbnQgPSBmYWxzZTsKKyAgICAgICAgb2Zmc2V0ICs9KGFwLT5kaW1bcmFua10ubG93ZXIgLSBhcC0+ZGltW3JhbmtdLmxpbmRleCkgKgorICAgICAgICAgICAgICAgICBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgfQorICAgIHJlcy0+cmFuZ2VfbWF4X251bWJlciA9IGNvdW50OworICAgIHJlcyAtPiBwdHIgPSAodm9pZCopYXAtPmJhc2U7CisgICAgcmVzIC0+IGluaXRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHJldHVybiByZXM7Cit9CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispCit7CisgICAgcmV0dXJuICggcmVhZF9ybmcxID09IE5VTEwgfHwgcmVhZF9ybmcyID09IE5VTEwgfHwKKyAgICAgICAgICAgIChyZWFkX3JuZzEtPnJhbmdlX3NpemUgJSByZWFkX3JuZzItPnJhbmdlX3NpemUgPT0gMCB8fAorICAgICAgICAgICAgcmVhZF9ybmcyLT5yYW5nZV9zaXplICUgcmVhZF9ybmcxLT5yYW5nZV9zaXplID09IDApKTsKK30KKworLy8gU2V0IG5leHQgb2Zmc2V0IGFuZCBsZW5ndGggYW5kIHJldHVybnMgdHJ1ZSBmb3IgbmV4dCByYW5nZS4KKy8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBhcmUgb3Zlci4KK2Jvb2wgZ2V0X25leHRfcmFuZ2UoCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZywKKyAgICBpbnQ2NF90ICpvZmZzZXQKKykKK3sKKyAgICBpZiAoKytyZWFkX3JuZy0+Y3VycmVudF9udW1iZXIgPiByZWFkX3JuZy0+cmFuZ2VfbWF4X251bWJlcikgeworICAgICAgICByZWFkX3JuZy0+Y3VycmVudF9udW1iZXIgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCByYW5rID0gMDsKKyAgICBpbnQgbnVtID0gcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyIC0gMTsKKyAgICBpbnQ2NF90IGN1cl9vZmZzZXQgPSAwOworICAgIGludCBudW1fbG9jOworICAgIGZvciAoOyByYW5rIDw9IHJlYWRfcm5nLT5sYXN0X25vbmNvbnRfaW5kOyByYW5rKyspIHsKKyAgICAgICAgbnVtX2xvYyA9IG51bSAvIHJlYWRfcm5nLT5EaW1bcmFua10uY291bnQ7CisgICAgICAgIGN1cl9vZmZzZXQgKz0gbnVtX2xvYyAqIHJlYWRfcm5nLT5EaW1bcmFua10uc2l6ZTsKKyAgICAgICAgbnVtID0gbnVtICUgcmVhZF9ybmctPkRpbVtyYW5rXS5jb3VudDsKKyAgICB9CisgICAgKm9mZnNldCA9IGN1cl9vZmZzZXQgKyByZWFkX3JuZy0+aW5pdF9vZmZzZXQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaXNfYXJyX2Rlc2NfY29udGlndW91cyhjb25zdCBhcnJfZGVzYyAqYXApCit7CisgICAgaW50NjRfdCByYW5rID0gYXAtPnJhbmsgLSAxOworICAgIGludDY0X3QgbGVuZ3RoID0gYXAtPmRpbVtyYW5rXS5zaXplOworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS5zdHJpZGUgPiAxICYmCisgICAgICAgICAgICBhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxlbmd0aCAhPSBhcC0+ZGltW3JhbmtdLnNpemUpIHsKKyAgICAgICAgICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICAgICAgICAgIGlmIChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggKj0gKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsgMSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitpbnQ2NF90IGNlYW5fZ2V0X3RyYW5zZl9zaXplKENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcpCit7CisgICAgcmV0dXJuKHJlYWRfcm5nLT5yYW5nZV9tYXhfbnVtYmVyICogcmVhZF9ybmctPnJhbmdlX3NpemUpOworfQorCitzdGF0aWMgdWludDY0X3QgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0OwordHlwZWRlZiB2b2lkICgqZnBwKShjb25zdCBjaGFyICpzcGFjZXMsIHVpbnQ2NF90IGxvdywgdWludDY0X3QgaGlnaCwgaW50IGVzaXplKTsKKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfb25lX3JhbmdlKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBscmFuZ2UsCisgICAgdWludDY0X3QgcnJhbmdlLAorICAgIGZwcCBmcCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICBnZW5lcmF0ZV9vbmVfcmFuZ2UobHJhbmdlPSVwLCBycmFuZ2U9JXAsIGVzaXplPSVkKVxuIiwKKyAgICAgICAgc3BhY2VzLCAodm9pZCopbHJhbmdlLCAodm9pZCopcnJhbmdlLCBlc2l6ZSk7CisgICAgaWYgKGxhc3RfbGVmdCA9PSAtMSkgeworICAgICAgICAvLyBGaXJzdCByYW5nZQorICAgICAgICBsYXN0X2xlZnQgPSBscmFuZ2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobHJhbmdlID09IGxhc3RfcmlnaHQrMSkgeworICAgICAgICAgICAgLy8gRXh0ZW5kIHByZXZpb3VzIHJhbmdlLCBkb24ndCBwcmludAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKCpmcCkoc3BhY2VzLCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQsIGVzaXplKTsKKyAgICAgICAgICAgIGxhc3RfbGVmdCA9IGxyYW5nZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0X3JpZ2h0ID0gcnJhbmdlOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBiYXNlLAorICAgIHVpbnQ2NF90IHJhbmssCisgICAgY29uc3Qgc3RydWN0IGRpbV9kZXNjICpkZHAsCisgICAgZnBwIGZwLAorICAgIGludCBlc2l6ZQorKQoreworICAgIHVpbnQ2NF90IGxpbmRleCA9IGRkcC0+bGluZGV4OworICAgIHVpbnQ2NF90IGxvd2VyID0gZGRwLT5sb3dlcjsKKyAgICB1aW50NjRfdCB1cHBlciA9IGRkcC0+dXBwZXI7CisgICAgdWludDY0X3Qgc3RyaWRlID0gZGRwLT5zdHJpZGU7CisgICAgdWludDY0X3Qgc2l6ZSA9IGRkcC0+c2l6ZTsKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICAiCisgICAgICAgICJnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKGJhc2U9JXAsIHJhbms9JWxsZCwgbGluZGV4PSVsbGQsICIKKyAgICAgICAgImxvd2VyPSVsbGQsIHVwcGVyPSVsbGQsIHN0cmlkZT0lbGxkLCBzaXplPSVsbGQsIGVzaXplPSVkKVxuIiwKKyAgICAgICAgc3BhY2VzLCAodm9pZCopYmFzZSwgcmFuaywgbGluZGV4LCBsb3dlciwgdXBwZXIsIHN0cmlkZSwgc2l6ZSwgZXNpemUpOworICAgIGlmIChyYW5rID09IDEpIHsKKyAgICAgICAgdWludDY0X3QgbHJhbmdlLCBycmFuZ2U7CisgICAgICAgIGlmIChzdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgbHJhbmdlID0gYmFzZSArIChsb3dlci1saW5kZXgpKnNpemU7CisgICAgICAgICAgICBycmFuZ2UgPSBscmFuZ2UgKyAodXBwZXItbG93ZXIrMSkqc2l6ZSAtIDE7CisgICAgICAgICAgICBnZW5lcmF0ZV9vbmVfcmFuZ2Uoc3BhY2VzLCBscmFuZ2UsIHJyYW5nZSwgZnAsIGVzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bG93ZXItbGluZGV4OyBpPD11cHBlci1saW5kZXg7IGkrPXN0cmlkZSkgeworICAgICAgICAgICAgICAgIGxyYW5nZSA9IGJhc2UgKyBpKnNpemU7CisgICAgICAgICAgICAgICAgcnJhbmdlID0gbHJhbmdlICsgc2l6ZSAtIDE7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfb25lX3JhbmdlKHNwYWNlcywgbHJhbmdlLCBycmFuZ2UsIGZwLCBlc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaW50IGk9bG93ZXItbGluZGV4OyBpPD11cHBlci1saW5kZXg7IGkrPXN0cmlkZSkgeworICAgICAgICAgICAgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICAgICAgICAgICAgICBzcGFjZXMsIGJhc2UraSpzaXplLCByYW5rLTEsIGRkcCsxLCBmcCwgZXNpemUpOworCisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX21lbV9yYW5nZXMoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZiwKKyAgICBmcHAgZnAKKykKK3sKKyAgICB1aW50NjRfdCBlc2l6ZTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgIiVzICAgICIKKyAgICAgICAgImdlbmVyYXRlX21lbV9yYW5nZXMoYWRwPSVwLCBkZXJlZj0lZCwgZnApXG4iLAorICAgICAgICBzcGFjZXMsIGFkcCwgZGVyZWYpOworICAgIGxhc3RfbGVmdCA9IC0xOworICAgIGxhc3RfcmlnaHQgPSAtMjsKKworICAgIC8vIEVsZW1lbnQgc2l6ZSBpcyBkZXJpdmVkIGZyb20gbGFzdCBkaW1lbnNpb24KKyAgICBlc2l6ZSA9IGFkcC0+ZGltW2FkcC0+cmFuay0xXS5zaXplOworCisgICAgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXIgdGhlIGJhc2UgYWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YQorICAgICAgICAvLyBGb3IgY19jZWFuX3Zhcl9wdHIgdGhlIGJhc2UgYWRkciBpcyBkZXJlZmVyZW5jZWQgdG8gZ2V0IHRvIHRoZSBkYXRhCisgICAgICAgIHNwYWNlcywgZGVyZWYgPyAqKCh1aW50NjRfdCopKGFkcC0+YmFzZSkpIDogYWRwLT5iYXNlLAorICAgICAgICBhZHAtPnJhbmssICZhZHAtPmRpbVswXSwgZnAsIGVzaXplKTsKKyAgICAoKmZwKShzcGFjZXMsIGxhc3RfbGVmdCwgbGFzdF9yaWdodCwgZXNpemUpOworfQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoCisgICAgY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgaW50NjRfdCAmbGVuZ3RoCispCit7CisgICAgaW50NjRfdCByYW5rID0gYWRwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IHNpemUgPSBhZHAtPmRpbVtyYW5rXS5zaXplOworICAgIGludDY0X3Qgcl9vZmYgPSAwOyAvLyBvZmZzZXQgZnJvbSByaWdodCBib3VuZGFyeQorCisgICAgLy8gZmluZCB0aGUgcmlnaHRtb3N0IGRpbWVuc2lvbiB3aGljaCB0YWtlcyBqdXN0IHBhcnQgb2YgaXRzCisgICAgLy8gcmFuZ2UuIFdlIGRlZmluZSBpdCBpZiB0aGUgc2l6ZSBvZiBsZWZ0IHJhbmsgaXMgbm90IGVxdWFsCisgICAgLy8gdGhlIHJhbmdlJ3MgbGVuZ3RoIGJldHdlZW4gdXBwZXIgYW5kIGxvd2VyIGJvdW5nYXJpZXMKKyAgICB3aGlsZSAocmFuayA+IDApIHsKKyAgICAgICAgc2l6ZSAqPSAoYWRwLT5kaW1bcmFua10udXBwZXIgLSBhZHAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgICAgICBpZiAoc2l6ZSAhPSBhZHAtPmRpbVtyYW5rIC0gMV0uc2l6ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmFuay0tOworICAgIH0KKworICAgIG9mZnNldCA9IChhZHAtPmRpbVtyYW5rXS5sb3dlciAtIGFkcC0+ZGltW3JhbmtdLmxpbmRleCkgKgorICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmtdLnNpemU7CisKKyAgICAvLyBmaW5kIGdhcHMgYm90aCBmcm9tIHRoZSBsZWZ0IC0gb2Zmc2V0IGFuZCBmcm9tIHRoZSByaWdodCAtIHJfb2ZmCisgICAgZm9yIChyYW5rLS07IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIG9mZnNldCArPSAoYWRwLT5kaW1bcmFua10ubG93ZXIgLSBhZHAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmtdLnNpemU7CisgICAgICAgIHJfb2ZmICs9IGFkcC0+ZGltW3JhbmtdLnNpemUgLQorICAgICAgICAgICAgICAgICAoYWRwLT5kaW1bcmFuayArIDFdLnVwcGVyIC0gYWRwLT5kaW1bcmFuayArIDFdLmxpbmRleCArIDEpICoKKyAgICAgICAgICAgICAgICAgYWRwLT5kaW1bcmFuayArIDFdLnNpemU7CisgICAgfQorICAgIGxlbmd0aCA9IChhZHAtPmRpbVswXS51cHBlciAtIGFkcC0+ZGltWzBdLmxpbmRleCArIDEpICoKKyAgICAgICAgICAgICBhZHAtPmRpbVswXS5zaXplIC0gb2Zmc2V0IC0gcl9vZmY7Cit9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCit2b2lkIHByaW50X3JhbmdlKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBsb3csCisgICAgdWludDY0X3QgaGlnaCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBjaGFyIG51bWJlclszMl07CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICIlcyAgICAgICAgcHJpbnRfcmFuZ2UobG93PSVwLCBoaWdoPSVwLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWxvdywgKHZvaWQqKWhpZ2gsIGVzaXplKTsKKworICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPCA0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICB2YWx1ZXM6XG4iLCBzcGFjZXMpOworICAgIGludCBjb3VudCA9IDA7CisgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpCisgICAgeworICAgICAgICBzd2l0Y2ggKGVzaXplKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoY2hhciAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIlZCAiLCAqKChzaG9ydCAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIlZCAiLCAqKChpbnQgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIjB4JTAxNnggIiwgKigodWludDY0X3QgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RyY2F0KGJ1ZmZlciwgbnVtYmVyKTsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID09IDEwKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgICVzXG4iLCBzcGFjZXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgJXNcbiIsIHNwYWNlcywgYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgX19hcnJfZGVzY19kdW1wKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZgorKQoreworICAgIE9GRkxPQURfVFJBQ0UoMiwgIiVzJXMgQ0VBTiBleHByZXNzaW9uICVwXG4iLCBzcGFjZXMsIG5hbWUsIGFkcCk7CisKKyAgICBpZiAoYWRwICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiJXMgICAgYmFzZT0lbGx4LCByYW5rPSVsbGRcbiIsCisgICAgICAgICAgICBzcGFjZXMsIGFkcC0+YmFzZSwgYWRwLT5yYW5rKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkcC0+cmFuazsgaSsrKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAgICBkaW1lbnNpb24gJWQ6IHNpemU9JWxsZCwgbGluZGV4PSVsbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxvd2VyPSVsbGQsIHVwcGVyPSVsbGQsIHN0cmlkZT0lbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMsIGksIGFkcC0+ZGltW2ldLnNpemUsIGFkcC0+ZGltW2ldLmxpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0ubG93ZXIsIGFkcC0+ZGltW2ldLnVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtpXS5zdHJpZGUpOworICAgICAgICB9CisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyIHRoZSBiYXNlIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXJfcHRyIHRoZSBiYXNlIGFkZHIgaXMgZGVyZWZlcmVuY2VkIHRvIGdldCB0byB0aGUgZGF0YQorICAgICAgICBnZW5lcmF0ZV9tZW1fcmFuZ2VzKHNwYWNlcywgYWRwLCBkZXJlZiwgJnByaW50X3JhbmdlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRwpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oIGIvcmMxL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjFmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmgKQEAgLTAsMCArMSw5NiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIENFQU5fVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIENFQU5fVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gQ0VBTiBleHByZXNzaW9uIHJlcHJlc2VudGF0aW9uCitzdHJ1Y3QgZGltX2Rlc2MgeworICAgIGludDY0X3Qgc2l6ZTsgICAgICAgLy8gTGVuZ3RoIG9mIGRhdGEgdHlwZQorICAgIGludDY0X3QgbGluZGV4OyAgICAgLy8gTG93ZXIgaW5kZXgKKyAgICBpbnQ2NF90IGxvd2VyOyAgICAgIC8vIExvd2VyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHVwcGVyOyAgICAgIC8vIFVwcGVyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHN0cmlkZTsgICAgIC8vIFN0cmlkZQorfTsKKworc3RydWN0IGFycl9kZXNjIHsKKyAgICBpbnQ2NF90IGJhc2U7ICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGludDY0X3QgcmFuazsgICAgICAgLy8gUmFuayBvZiBhcnJheQorICAgIGRpbV9kZXNjIGRpbVsxXTsKK307CisKK3N0cnVjdCBDZWFuUmVhZERpbSB7CisgICAgaW50NjRfdCBjb3VudDsgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbgorICAgIGludDY0X3Qgc2l6ZTsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24uCit9OworCitzdHJ1Y3QgQ2VhblJlYWRSYW5nZXMgeworICAgIHZvaWQgKiAgcHRyOworICAgIGludDY0X3QgY3VycmVudF9udW1iZXI7ICAgLy8gdGhlIG51bWJlciBvZiByYW5nZXMgcmVhZAorICAgIGludDY0X3QgcmFuZ2VfbWF4X251bWJlcjsgLy8gbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcmFuZ2VzCisgICAgaW50NjRfdCByYW5nZV9zaXplOyAgICAgICAvLyBzaXplIG9mIG1heCBjb250aWd1b3VzIHJhbmdlCisgICAgaW50ICAgICBsYXN0X25vbmNvbnRfaW5kOyAvLyBzaXplIG9mIERpbSBhcnJheQorICAgIGludDY0X3QgaW5pdF9vZmZzZXQ7ICAgICAgLy8gb2Zmc2V0IG9mIDEtc3QgZWxlbWVudCBmcm9tIGFycmF5IGxlZnQgYm91bmQKKyAgICBDZWFuUmVhZERpbSBEaW1bMV07Cit9OworCisvLyBhcnJheSBkZXNjcmlwdG9yIGxlbmd0aAorI2RlZmluZSBfX2Fycl9kZXNjX2xlbmd0aChyYW5rKSBcCisgICAgKHNpemVvZihpbnQ2NF90KSArIHNpemVvZihkaW1fZGVzYykgKiAocmFuaykpCisKKy8vIHJldHVybnMgb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQKK3ZvaWQgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZsZW5ndGgpOworCisvLyBkZWZpbmUgaWYgZGF0YSBhcnJheSBkZXNjcmliZWQgYnkgYXJndW1lbnQgaXMgY29udGlndW91cyBvbmUKK2Jvb2wgaXNfYXJyX2Rlc2NfY29udGlndW91cyhjb25zdCBhcnJfZGVzYyAqYXApOworCisvLyBhbGxvY2F0ZSBlbGVtZW50IG9mIENlYW5SZWFkUmFuZ2VzIHR5cGUgaW5pdGlhbGl6ZWQKKy8vIHRvIHJlYWQgY29uc2VxdWVudGx5IGNvbnRpZ3VvdXMgcmFuZ2VzIGRlc2NyaWJlZCBieSAiYXAiIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gY2hlY2sgaWYgcmFuZ2VzIGRlc2NyaWJlZCBieSAxIGFyZ3VtZW50IGNvdWxkIGJlIHRyYW5zZmVycmVkIGludG8gcmFuZ2VzCisvLyBkZXNjcmliZWQgYnkgMi1uZCBvbmUKK2Jvb2wgY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzEsCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzIKKyk7CisKKy8vIGZpcnN0IGFyZ3VtZW50IC0gcmV0dXJuZWQgdmFsdWUgYnkgY2FsbCB0byBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjLgorLy8gcmV0dXJucyB0cnVlIGlmIG9mZnNldCBhbmQgbGVuZ3RoIG9mIG5leHQgcmFuZ2UgaXMgc2V0IHN1Y2Nlc3NmdWx5LgorLy8gcmV0dXJucyBmYWxzZSBpZiB0aGUgcmFuZ2VzIGlzIG92ZXIuCitib29sIGdldF9uZXh0X3JhbmdlKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcsCisgICAgaW50NjRfdCAqb2Zmc2V0CispOworCisvLyByZXR1cm5zIG51bWJlciBvZiB0cmFuc2ZlcnJlZCBieXRlcworaW50NjRfdCBjZWFuX2dldF90cmFuc2Zfc2l6ZShDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nKTsKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisvLyBwcmludHMgYXJyYXkgZGVzY3JpcHRvciBjb250ZW50cyB0byBzdGRlcnIKK3ZvaWQgICAgX19hcnJfZGVzY19kdW1wKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZmVyZW5jZSk7CisjZWxzZQorI2RlZmluZSBfX2Fycl9kZXNjX2R1bXAoCisgICAgc3BhY2VzLAorICAgIG5hbWUsCisgICAgYWRwLAorICAgIGRlcmVmZXJlbmNlKQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworI2VuZGlmIC8vIENFQU5fVVRJTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhjN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcApAQCAtMCwwICsxLDM1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgQ09JIGhvc3QgaW50ZXJmYWNlCisKKyNpbmNsdWRlICJjb2lfY2xpZW50LmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF9jb21tb24uaCIKKworbmFtZXNwYWNlIENPSSB7CisKKyNkZWZpbmUgQ09JX1ZFUlNJT04xICAgICJDT0lfMS4wIgorI2RlZmluZSBDT0lfVkVSU0lPTjIgICAgIkNPSV8yLjAiCisKK2Jvb2wgICAgICAgICAgICBpc19hdmFpbGFibGU7CitzdGF0aWMgdm9pZCogICAgbGliX2hhbmRsZTsKKworLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gQ09JIGxpYnJhcnkKK0NPSVJFU1VMVCAoKkVuZ2luZUdldENvdW50KShDT0lfSVNBX1RZUEUsIHVpbnQzMl90Kik7CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRIYW5kbGUpKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopOworCitDT0lSRVNVTFQgKCpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSkoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIGludCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JUFJPQ0VTUyopOworQ09JUkVTVUxUICgqUHJvY2Vzc0Rlc3Ryb3kpKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosIHVpbnQzMl90Kik7CitDT0lSRVNVTFQgKCpQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzKShDT0lQUk9DRVNTLCB1aW50MzJfdCwgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRlVOQ1RJT04qKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkpKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMpKHVpbnQzMl90LCBjb25zdCB2b2lkKiosIGNvbnN0IHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCBjb25zdCB1aW50NjRfdCopOworCitDT0lSRVNVTFQgKCpQaXBlbGluZUNyZWF0ZSkoQ09JUFJPQ0VTUywgQ09JX0NQVV9NQVNLLCB1aW50MzJfdCwgQ09JUElQRUxJTkUqKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lRGVzdHJveSkoQ09JUElQRUxJTkUpOworQ09JUkVTVUxUICgqUGlwZWxpbmVSdW5GdW5jdGlvbikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUJVRkZFUiosIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopOworCitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGUpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCosIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiopOworQ09JUkVTVUxUICgqQnVmZmVyRGVzdHJveSkoQ09JQlVGRkVSKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlck1hcCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIENPSV9NQVBfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosIHZvaWQqKik7CitDT0lSRVNVTFQgKCpCdWZmZXJVbm1hcCkoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJXcml0ZSkoQ09JQlVGRkVSLCB1aW50NjRfdCwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJSZWFkKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB2b2lkKiwgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyQ29weSkoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyR2V0U2lua0FkZHJlc3MpKENPSUJVRkZFUiwgdWludDY0X3QqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlclNldFN0YXRlKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworCitDT0lSRVNVTFQgKCpFdmVudFdhaXQpKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsIHVpbnQ4X3QsIHVpbnQzMl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKTsKKwordWludDY0X3QgICgqUGVyZkdldEN5Y2xlRnJlcXVlbmN5KSh2b2lkKTsKKworYm9vbCBpbml0KHZvaWQpCit7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImxpYmNvaV9ob3N0LnNvLjAiOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAiY29pX2hvc3QuZGxsIjsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkxvYWRpbmcgQ09JIGxpYnJhcnkgJXMgLi4uXG4iLCBsaWJfbmFtZSk7CisgICAgbGliX2hhbmRsZSA9IERMX29wZW4obGliX25hbWUpOworICAgIGlmIChsaWJfaGFuZGxlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGxvYWQgdGhlIGxpYnJhcnlcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRW5naW5lR2V0Q291bnQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUVuZ2luZUdldENvdW50IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoRW5naW5lR2V0Q291bnQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0Q291bnQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRW5naW5lR2V0SGFuZGxlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUVuZ2luZUdldEhhbmRsZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldEhhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFbmdpbmVHZXRIYW5kbGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lFTkdJTkUsIGNvbnN0IGNoYXIqLCBjb25zdCB2b2lkKiwgdWludDY0X3QsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LCBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JUFJPQ0VTUyopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NEZXN0cm95ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgaW50MzJfdCwgdWludDhfdCwgaW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0Rlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwgQ09JRlVOQ1RJT04qKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSIsIENPSV9WRVJTSU9OMik7CisgICAgaWYgKFByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZUNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBpcGVsaW5lQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVDcmVhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGlwZWxpbmVDcmVhdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXN0cm95ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZURlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQaXBlbGluZURlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGlwZWxpbmVEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lUnVuRnVuY3Rpb24gPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sIHVpbnQzMl90LCBjb25zdCBDT0lCVUZGRVIqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQxNl90LCB2b2lkKiwgdWludDE2X3QsIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBpcGVsaW5lUnVuRnVuY3Rpb24iLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQaXBlbGluZVJ1bkZ1bmN0aW9uID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lUnVuRnVuY3Rpb24iKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDcmVhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckRlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckRlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyTWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIENPSV9NQVBfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlck1hcCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlck1hcCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJNYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyVW5tYXAgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lNQVBJTlNUQU5DRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyVW5tYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJVbm1hcCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJVbm1hcCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJXcml0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyV3JpdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJXcml0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJXcml0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJSZWFkID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyUmVhZCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlclJlYWQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyUmVhZCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDb3B5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckNvcHkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDb3B5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNvcHkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyR2V0U2lua0FkZHJlc3MgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyR2V0U2lua0FkZHJlc3MgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyR2V0U2lua0FkZHJlc3MiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyU2V0U3RhdGUgPQorICAgICAgICAoQ09JUkVTVUxUKCopKENPSUJVRkZFUiwgQ09JUFJPQ0VTUywgQ09JX0JVRkZFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX01PVkVfRkxBRywgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJTZXRTdGF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlclNldFN0YXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclNldFN0YXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEV2ZW50V2FpdCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiwgdWludDMyX3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JRXZlbnRXYWl0IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoRXZlbnRXYWl0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUV2ZW50V2FpdCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQZXJmR2V0Q3ljbGVGcmVxdWVuY3kgPQorICAgICAgICAodWludDY0X3QgKCopKHZvaWQpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQZXJmR2V0Q3ljbGVGcmVxdWVuY3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmaW5pKHZvaWQpCit7CisgICAgaXNfYXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICBpZiAobGliX2hhbmRsZSAhPSAwKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBETF9jbG9zZShsaWJfaGFuZGxlKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgbGliX2hhbmRsZSA9IDA7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBDT0kKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3NWE4YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBvZmZsb2FkIGxpYnJhcnkgYW5kIHRoZSBDT0kgQVBJIG9uIHRoZSBob3N0CisKKyNpZm5kZWYgQ09JX0NMSUVOVF9IX0lOQ0xVREVECisjZGVmaW5lIENPSV9DTElFTlRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y29tbW9uL0NPSVBlcmZfY29tbW9uLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUVuZ2luZV9zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JUHJvY2Vzc19zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JUGlwZWxpbmVfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUJ1ZmZlcl9zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JRXZlbnRfc291cmNlLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIi4uL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3V0aWwuaCIKKworI2RlZmluZSBNSUNfRU5HSU5FU19NQVggICAgIDEyOAorCisjaWYgTUlDX0VOR0lORVNfTUFYIDwgQ09JX01BWF9JU0FfTUlDX0RFVklDRVMKKyNlcnJvciBNSUNfRU5HSU5FU19NQVggbmVlZCB0byBiZSBpbmNyZWFzZWQKKyNlbmRpZgorCisvLyBDT0kgbGlicmFyeSBpbnRlcmZhY2UKK25hbWVzcGFjZSBDT0kgeworCitleHRlcm4gYm9vbCBpbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmluaSh2b2lkKTsKKworZXh0ZXJuIGJvb2wgaXNfYXZhaWxhYmxlOworCisvLyBwb2ludGVycyB0byBmdW5jdGlvbnMgZnJvbSBDT0kgbGlicmFyeQorZXh0ZXJuIENPSVJFU1VMVCAoKkVuZ2luZUdldENvdW50KShDT0lfSVNBX1RZUEUsIHVpbnQzMl90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5KShDT0lFTkdJTkUsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lQUk9DRVNTKik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0Rlc3Ryb3kpKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90KiwgdWludDMyX3QqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzKShDT0lQUk9DRVNTLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSkoQ09JUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NSZWdpc3RlckxpYnJhcmllcykodWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90Kik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZUNyZWF0ZSkoQ09JUFJPQ0VTUywgQ09JX0NQVV9NQVNLLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lQSVBFTElORSopOworZXh0ZXJuIENPSVJFU1VMVCAoKlBpcGVsaW5lRGVzdHJveSkoQ09JUElQRUxJTkUpOworZXh0ZXJuIENPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lCVUZGRVIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQxNl90LCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90LCBDT0lFVkVOVCopOworCitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyTWFwKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX01BUF9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCosIENPSU1BUElOU1RBTkNFKiwgdm9pZCoqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJVbm1hcCkoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJXcml0ZSkoQ09JQlVGRkVSLCB1aW50NjRfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJSZWFkKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJDb3B5KShDT0lCVUZGRVIsIENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyU2V0U3RhdGUpKENPSUJVRkZFUiwgQ09JUFJPQ0VTUywgQ09JX0JVRkZFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKkV2ZW50V2FpdCkodWludDE2X3QsIGNvbnN0IENPSUVWRU5UKiwgaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QsIHVpbnQzMl90KiwgdWludDMyX3QqKTsKKworZXh0ZXJuIHVpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK30gLy8gbmFtZXNwYWNlIENPSQorCisjZW5kaWYgLy8gQ09JX0NMSUVOVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2U2YzJkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgQ09JIGludGVyZmFjZSBvbiB0aGUgdGFyZ2V0CisKKyNpbmNsdWRlICJjb2lfc2VydmVyLmgiCisKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfdGltZXIuaCIKKyNpZmRlZiBNWU9fU1VQUE9SVAorI2luY2x1ZGUgIi4uL29mZmxvYWRfbXlvX3RhcmdldC5oIiAgICAgIC8vIGZvciBfX29mZmxvYWRfbXlvTGliSW5pdC9GaW5pCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9jb21wdXRlKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZChidWZmZXJfY291bnQsIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY19kYXRhLCBtaXNjX2RhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9kYXRhLCByZXR1cm5fZGF0YV9sZW4pOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX2luaXQoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIHN0cnVjdCBpbml0X2RhdGEgeworICAgICAgICBpbnQgIGRldmljZV9pbmRleDsKKyAgICAgICAgaW50ICBkZXZpY2VzX3RvdGFsOworICAgICAgICBpbnQgIGNvbnNvbGVfbGV2ZWw7CisgICAgICAgIGludCAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgfSAqZGF0YSA9IChzdHJ1Y3QgaW5pdF9kYXRhKikgbWlzY19kYXRhOworCisgICAgLy8gc2V0IGRldmljZSBpbmRleCBhbmQgbnVtYmVyIG9mIHRvdGFsIGRldmljZXMKKyAgICBtaWNfaW5kZXggPSBkYXRhLT5kZXZpY2VfaW5kZXg7CisgICAgbWljX2VuZ2luZXNfdG90YWwgPSBkYXRhLT5kZXZpY2VzX3RvdGFsOworCisgICAgLy8gaW5pdGlhbGl6ZSB0cmFjZSBsZXZlbAorICAgIGNvbnNvbGVfZW5hYmxlZCA9IGRhdGEtPmNvbnNvbGVfbGV2ZWw7CisgICAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBkYXRhLT5vZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworICAgIC8vIHJldHVybiBiYWNrIHRoZSBwcm9jZXNzIGlkCisgICAgKigocGlkX3QqKSByZXR1cm5fZGF0YSkgPSBnZXRwaWQoKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl92YXJfdGFibGVfc2l6ZSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgc3RydWN0IFBhcmFtcyB7CisgICAgICAgIGludDY0X3QgbmVsZW1zOworICAgICAgICBpbnQ2NF90IGxlbmd0aDsKKyAgICB9ICpwYXJhbXM7CisKKyAgICBwYXJhbXMgPSBzdGF0aWNfY2FzdDxQYXJhbXMqPihyZXR1cm5fZGF0YSk7CisgICAgcGFyYW1zLT5sZW5ndGggPSBfX29mZmxvYWRfdmFycy50YWJsZV9zaXplKHBhcmFtcy0+bmVsZW1zKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl92YXJfdGFibGVfY29weSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgX19vZmZsb2FkX3ZhcnMudGFibGVfY29weShidWZmZXJzWzBdLCAqc3RhdGljX2Nhc3Q8aW50NjRfdCo+KG1pc2NfZGF0YSkpOworfQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKy8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBvZiBteW9pTGliSW5pdC9GaW5pIGNhbGxzCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX215b2luaXQoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF9teW9MaWJJbml0KCk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfbXlvZmluaSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgX19vZmZsb2FkX215b0xpYkZpbmkoKTsKK30KKyNlbmRpZiAvLyBNWU9fU1VQUE9SVApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmggYi9yYzEvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQ0ZDllCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvL1RoZSBpbnRlcmZhY2UgYmV0d2VlbiBvZmZsb2FkIGxpYnJhcnkgYW5kIHRoZSBDT0kgQVBJIG9uIHRoZSB0YXJnZXQuCisKKyNpZm5kZWYgQ09JX1NFUlZFUl9IX0lOQ0xVREVECisjZGVmaW5lIENPSV9TRVJWRVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y29tbW9uL0NPSUVuZ2luZV9jb21tb24uaD4KKyNpbmNsdWRlIDxjb21tb24vQ09JUGVyZl9jb21tb24uaD4KKyNpbmNsdWRlIDxzaW5rL0NPSVByb2Nlc3Nfc2luay5oPgorI2luY2x1ZGUgPHNpbmsvQ09JUGlwZWxpbmVfc2luay5oPgorI2luY2x1ZGUgPHNpbmsvQ09JQnVmZmVyX3NpbmsuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiLi4vbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvLyB3cmFwcGVycyBmb3IgQ09JIEFQSQorI2RlZmluZSBQaXBlbGluZVN0YXJ0RXhlY3V0aW5nUnVuRnVuY3Rpb25zKCkgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBQcm9jZXNzV2FpdEZvclNodXRkb3duKCkgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBCdWZmZXJBZGRSZWYoYnVmKSBcCisgICAgeyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lCdWZmZXJBZGRSZWYoYnVmKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19idWZfYWRkX3JlZiwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBCdWZmZXJSZWxlYXNlUmVmKGJ1ZikgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JQnVmZmVyUmVsZWFzZVJlZihidWYpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2J1Zl9yZWxlYXNlX3JlZiwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBFbmdpbmVHZXRJbmRleChpbmRleCkgXAorICAgIHsgXAorICAgICAgICBDT0lfSVNBX1RZUEUgaXNhX3R5cGU7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUVuZ2luZUdldEluZGV4KCZpc2FfdHlwZSwgaW5kZXgpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2dldF9lbmdpbmVfaW5kZXgsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNlbmRpZiAvLyBDT0lfU0VSVkVSX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM0MzBiCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjb21waWxlcl9pZl9ob3N0LmgiCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIEdsb2JhbCBjb3VudGVyIG9uIGhvc3QuIAorLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGlmIFAyT1BUX29mZmxvYWRfZG9fZGF0YV9wZXJzaXN0ZW5jZSA9PSAyLgorLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaWRlbnRpZnkgb2ZmbG9hZCBjb25zdHJ1Y3RzIGNvbnRhaW5lZCBpbiBvbmUgcHJvY2VkdXJlLgorLy8gSW5jcmVtZW50IG9mIE9GRkxPQURfQ0FMTF9DT1VOVCBpcyBpbnNlcnRlZCBhdCBlbnRyaWVzIG9mIEhPU1Qgcm91dGluZXMgd2l0aAorLy8gb2ZmbG9hZCBjb25zdHJ1Y3RzLgorc3RhdGljIGludCBvZmZsb2FkX2NhbGxfY291bnQgPSAwOworCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSgKKyAgICBUQVJHRVRfVFlQRSAgICAgIHRhcmdldF90eXBlLAorICAgIGludCAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgICAgICAgICAgICAgIGlzX29wdGlvbmFsLAorICAgIF9PZmZsb2FkX3N0YXR1cyogc3RhdHVzLAorICAgIGNvbnN0IGNoYXIqICAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgIGxpbmUKKykKK3sKKyAgICBib29sIHJldHZhbDsKKyAgICBPRkZMT0FEIG9mbGQ7CisKKyAgICAvLyBpbml0aWFsaXplIHN0YXR1cworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBzdGF0dXMtPnJlc3VsdCA9IE9GRkxPQURfVU5BVkFJTEFCTEU7CisgICAgICAgIHN0YXR1cy0+ZGV2aWNlX251bWJlciA9IC0xOworICAgICAgICBzdGF0dXMtPmRhdGFfc2VudCA9IDA7CisgICAgICAgIHN0YXR1cy0+ZGF0YV9yZWNlaXZlZCA9IDA7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIGxpYnJheSBpcyBpbml0aWFsaXplZAorICAgIHJldHZhbCA9IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKworICAgIC8vIE9GRkxPQURfVElNRVJfSU5JVCBtdXN0IGZvbGxvdyBjYWxsIHRvIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEgPSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIC8vIGluaXRpYWxpemUgYWxsIGRldmljZXMgaXMgaW5pdF90eXBlIGlzIG9uX29mZmxvYWRfYWxsCisgICAgaWYgKHJldHZhbCAmJiBfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkX2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisKKyAgICBpZiAodGFyZ2V0X3R5cGUgPT0gVEFSR0VUX0hPU1QpIHsKKyAgICAgICAgLy8gSG9zdCBhbHdheXMgYXZhaWxhYmxlCisgICAgICAgIHJldHZhbCA9IHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKHRhcmdldF90eXBlID09IFRBUkdFVF9NSUMpIHsKKyAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gLTEpIHsKKyAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdGhlIGRldmljZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IHRhcmdldF9udW1iZXIgJSBtaWNfZW5naW5lc190b3RhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZXZpY2UgMAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgICAgICAgICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT1JTTDo6dHJ5X3Jlc2VydmUodGFyZ2V0X251bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFPUlNMOjpyZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRldmljZQorICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZCkgeworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworICAgICAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1t0YXJnZXRfbnVtYmVyXS5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBDUFUKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyIDwgMCB8fCAhcmV0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc19vcHRpb25hbCAmJiBzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZGV2aWNlX251bWJlcik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBvZmxkID0gbmV3IE9mZmxvYWREZXNjcmlwdG9yKHRhcmdldF9udW1iZXIsIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfb3B0aW9uYWwsIGZhbHNlLCB0aW1lcl9kYXRhKTsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgdGFyZ2V0X251bWJlcik7CisgICAgICAgIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyh0aW1lcl9kYXRhKTsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyLCBjX29mZmxvYWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRpbmcgb2ZmbG9hZDogdGFyZ2V0X3R5cGUgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciA9ICVkLCBpc19vcHRpb25hbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIGlzX29wdGlvbmFsKTsKKworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb2ZsZCA9IE5VTEw7CisKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworICAgICAgICBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEodGltZXJfZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mbGQ7Cit9CisKK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSgKKyAgICBjb25zdCBpbnQqICBkZXZpY2VfbnVtLAorICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgdWludDY0X3QgICAgbGluZQorKQoreworICAgIGludCB0YXJnZXRfbnVtYmVyOworCisgICAgLy8gbWFrZSBzdXJlIGxpYnJheSBpcyBpbml0aWFsaXplZCBhbmQgYXQgbGVhc3Qgb25lIGRldmljZSBpcyBhdmFpbGFibGUKKyAgICBpZiAoIV9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKSkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIE9GRkxPQURfVElNRVJfSU5JVCBtdXN0IGZvbGxvdyBjYWxsIHRvIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSA9IE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWRfYWxsKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgLy8gdXNlIGRlZmF1bHQgZGV2aWNlIG51bWJlciBpZiBpdCBpcyBub3QgcHJvdmlkZWQKKyAgICBpZiAoZGV2aWNlX251bSAhPSAwKSB7CisgICAgICAgIHRhcmdldF9udW1iZXIgPSAqZGV2aWNlX251bTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRhcmdldF9udW1iZXIgPSBfX29tcF9kZXZpY2VfbnVtOworICAgIH0KKworICAgIC8vIGRldmljZSBudW1iZXIgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUKKyAgICBpZiAodGFyZ2V0X251bWJlciA8IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29tcF9pbnZhbGlkX2RldmljZV9udW0pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIHNob3VsZCB3ZSBkbyB0aGlzIGZvciBPcGVuTVA/CisgICAgdGFyZ2V0X251bWJlciAlPSBtaWNfZW5naW5lc190b3RhbDsKKworICAgIC8vIHJlc2VydmUgZGV2aWNlIGluIE9SU0wKKyAgICBpZiAoIU9SU0w6OnJlc2VydmUodGFyZ2V0X251bWJlcikpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZShzKQorICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZCkgeworICAgICAgICBtaWNfZW5naW5lc1t0YXJnZXRfbnVtYmVyXS5pbml0KCk7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgT0ZGTE9BRCBvZmxkID0KKyAgICAgICAgbmV3IE9mZmxvYWREZXNjcmlwdG9yKHRhcmdldF9udW1iZXIsIDAsIHRydWUsIHRydWUsIHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgdGFyZ2V0X251bWJlcik7CisKKyAgICBPZmZsb2FkX1JlcG9ydF9Qcm9sb2codGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIsIGNfb2ZmbG9hZF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0aW5nIE9wZW5NUCBvZmZsb2FkLCBkZXZpY2UgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcik7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgcmV0dXJuIG9mbGQ7Cit9CisKK2ludCBvZmZsb2FkX29mZmxvYWRfd3JhcCgKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBib29sIHJldCA9IG9mbGQtPm9mZmxvYWQobmFtZSwgaXNfZW1wdHksIHZhcnMsIHZhcnMyLCBudW1fdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHMsIG51bV93YWl0cywgc2lnbmFsLCBlbnRyeV9pZCwgc3RhY2tfYWRkcik7CisgICAgaWYgKCFyZXQgfHwgc2lnbmFsID09IDApIHsKKyAgICAgICAgZGVsZXRlIG9mbGQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDEoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsCispCit7CisgICAgcmV0dXJuIG9mZmxvYWRfb2ZmbG9hZF93cmFwKG9mbGQsIG5hbWUsIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJzLCB2YXJzLCB2YXJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd2FpdHMsIHdhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCwgTlVMTCwgTlVMTCk7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgcmV0dXJuIG9mZmxvYWRfb2ZmbG9hZF93cmFwKG9mbGQsIG5hbWUsIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJzLCB2YXJzLCB2YXJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd2FpdHMsIHdhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICpzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICAvLyBzaWduYWwgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBub3cKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsX25ldyA9IChzaWduYWwgIT0gMCkgPyAmc2lnbmFsIDogMDsKKyAgICBjb25zdCB2b2lkICoqd2FpdHNfbmV3ID0gMDsKKyAgICBpbnQgbnVtX3dhaXRzX25ldyA9IDA7CisKKyAgICAvLyByZW1vdmUgTlVMTCB2YWx1ZXMgZnJvbSB0aGUgbGlzdCBvZiBzaWduYWxzIHRvIHdhaXQgZm9yCisgICAgaWYgKG51bV93YWl0cyA+IDApIHsKKyAgICAgICAgd2FpdHNfbmV3ID0gKGNvbnN0IHZvaWQqKikgYWxsb2NhKHNpemVvZih2b2lkKikgKiBudW1fd2FpdHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV93YWl0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAod2FpdHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIHdhaXRzX25ld1tudW1fd2FpdHNfbmV3KytdID0gd2FpdHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0ZGTE9BRF9PRkZMT0FEMShvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzX25ldywgd2FpdHNfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9uZXcpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX0NBTExfQ09VTlQoKQoreworICAgIG9mZmxvYWRfY2FsbF9jb3VudCsrOworICAgIHJldHVybiBvZmZsb2FkX2NhbGxfY291bnQ7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oIGIvcmMxL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM0YzUxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIGludGVyZmFjZSBiZXR3ZWVuIGNvbXBpbGVyLWdlbmVyYXRlZCBob3N0IGNvZGUgYW5kIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBDT01QSUxFUl9JRl9IT1NUX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKworI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9hY3F1aXJlKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9hY3F1aXJlMSkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEICAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkKQorI2RlZmluZSBPRkZMT0FEX09GRkxPQUQxICAgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWQxKQorI2RlZmluZSBPRkZMT0FEX09GRkxPQUQyICAgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWQyKQorI2RlZmluZSBPRkZMT0FEX0NBTExfQ09VTlQgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWRfY2FsbF9jb3VudCkKKworCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUKKyAgICBcYnJpZWYgQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSB0YXJnZXQuCisgICAgXHBhcmFtIHRhcmdldF90eXBlICAgVGhlIHR5cGUgb2YgdGFyZ2V0LgorICAgIFxwYXJhbSB0YXJnZXRfbnVtYmVyIFRoZSBkZXZpY2UgbnVtYmVyLgorICAgIFxwYXJhbSBpc19vcHRpb25hbCAgIFdoZXRoZXIgQ1BVIGZhbGwtYmFjayBpcyBhbGxvd2VkLgorICAgIFxwYXJhbSBzdGF0dXMgICAgICAgIEFkZHJlc3Mgb2YgdmFyaWFibGUgdG8gaG9sZCBvZmZsb2FkIHN0YXR1cy4KKyAgICBccGFyYW0gZmlsZSAgICAgICAgICBGaWxlbmFtZSBpbiB3aGljaCB0aGlzIG9mZmxvYWQgb2NjdXJyZWQuCisgICAgXHBhcmFtIGxpbmUgICAgICAgICAgTGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUgdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorKi8KK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKAorICAgIFRBUkdFVF9UWVBFICAgICAgdGFyZ2V0X3R5cGUsCisgICAgaW50ICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLAorICAgIGludCAgICAgICAgICAgICAgaXNfb3B0aW9uYWwsCisgICAgX09mZmxvYWRfc3RhdHVzKiBzdGF0dXMsCisgICAgY29uc3QgY2hhciogICAgICBmaWxlLAorICAgIHVpbnQ2NF90ICAgICAgICAgbGluZQorKTsKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMQorICAgIFxicmllZiBBY3F1aXJlIHRoZSB0YXJnZXQgZm9yIG9mZmxvYWQgKE9wZW5NUCkuCisgICAgXHBhcmFtIGRldmljZV9udW1iZXIgRGV2aWNlIG51bWJlciBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgXHBhcmFtIGZpbGUgICAgICAgICAgRmlsZW5hbWUgaW4gd2hpY2ggdGhpcyBvZmZsb2FkIG9jY3VycmVkCisgICAgXHBhcmFtIGxpbmUgICAgICAgICAgTGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUgdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorKi8KK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSgKKyAgICBjb25zdCBpbnQqICAgICAgZGV2aWNlX251bWJlciwKKyAgICBjb25zdCBjaGFyKiAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgbGluZQorKTsKKworLyohIFxmbiBPRkZMT0FEX09GRkxPQUQxCisgICAgXGJyaWVmIFJ1biBmdW5jdGlvbiBvbiB0YXJnZXQgdXNpbmcgaW50ZXJmYWNlIGZvciBvbGQgZGF0YSBwZXJzaXN0ZW5jZS4KKyAgICBccGFyYW0gbyBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFLgorICAgIFxwYXJhbSBuYW1lIE5hbWUgb2Ygb2ZmbG9hZCBlbnRyeSBwb2ludC4KKyAgICBccGFyYW0gaXNfZW1wdHkgSWYgbm8gY29kZSB0byBleGVjdXRlIChlLmcuIG9mZmxvYWRfdHJhbnNmZXIpCisgICAgXHBhcmFtIG51bV92YXJzIE51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycy4KKyAgICBccGFyYW0gdmFycyBQb2ludGVyIHRvIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIHZhcnMyIFBvaW50ZXIgdG8gVmFyRGVzYzIgYXJyYXkuCisgICAgXHBhcmFtIG51bV93YWl0cyBOdW1iZXIgb2YgIndhaXQiIHZhbHVlcy4KKyAgICBccGFyYW0gd2FpdHMgUG9pbnRlciB0byBhcnJheSBvZiB3YWl0IHZhbHVlcy4KKyAgICBccGFyYW0gc2lnbmFsIFBvaW50ZXIgdG8gc2lnbmFsIHZhbHVlIG9yIE5VTEwuCisqLworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEMSgKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqKiBzaWduYWwKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9PRkZMT0FEMgorICAgIFxicmllZiBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IHVzaW5nIGludGVyZmFjZSBmb3IgbmV3IGRhdGEgcGVyc2lzdGVuY2UuCisgICAgXHBhcmFtIG8gT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyAgICBccGFyYW0gbmFtZSBOYW1lIG9mIG9mZmxvYWQgZW50cnkgcG9pbnQuCisgICAgXHBhcmFtIGlzX2VtcHR5IElmIG5vIGNvZGUgdG8gZXhlY3V0ZSAoZS5nLiBvZmZsb2FkX3RyYW5zZmVyKQorICAgIFxwYXJhbSBudW1fdmFycyBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcnMgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJzMiBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorICAgIFxwYXJhbSBudW1fd2FpdHMgTnVtYmVyIG9mICJ3YWl0IiB2YWx1ZXMuCisgICAgXHBhcmFtIHdhaXRzIFBvaW50ZXIgdG8gYXJyYXkgb2Ygd2FpdCB2YWx1ZXMuCisgICAgXHBhcmFtIHNpZ25hbCBQb2ludGVyIHRvIHNpZ25hbCB2YWx1ZSBvciBOVUxMLgorICAgIFxwYXJhbSBlbnRyeV9pZCBBIHNpZ25hdHVyZSBmb3IgdGhlIGZ1bmN0aW9uIGRvaW5nIHRoZSBvZmZsb2FkLgorICAgIFxwYXJhbSBzdGFja19hZGRyIFRoZSBzdGFjayBmcmFtZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBkb2luZyBvZmZsb2FkLgorKi8KK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDIoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispOworCisvLyBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IChvYnNvbGV0ZSkuCisvLyBAcGFyYW0gbyAgICBPRkZMT0FEIG9iamVjdAorLy8gQHBhcmFtIG5hbWUgZnVuY3Rpb24gbmFtZQorZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCA9IDAsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkciA9IE5VTEwKKyk7CisKKy8vIEdsb2JhbCBjb3VudGVyIG9uIGhvc3QuCisvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgaWYgUDJPUFRfb2ZmbG9hZF9kb19kYXRhX3BlcnNpc3RlbmNlID09IDIuCisvLyBUaGUgdmFyaWFibGUgdXNlZCB0byBpZGVudGlmeSBvZmZsb2FkIGNvbnN0cnVjdHMgY29udGFpbmVkIGluIG9uZSBwcm9jZWR1cmUuCisvLyBDYWxsIHRvIE9GRkxPQURfQ0FMTF9DT1VOVCgpIGlzIGluc2VydGVkIGF0IEhPU1Qgb24gZW50cnkgb2YgdGhlIHJvdXRpbmUuCitleHRlcm4gIkMiIGludCAgT0ZGTE9BRF9DQUxMX0NPVU5UKCk7CisKKyNlbmRpZiAvLyBDT01QSUxFUl9JRl9IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwIGIvcmMxL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmODJiOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNvbXBpbGVyX2lmX3RhcmdldC5oIgorCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfRU5URVIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGludCB2YXJzX3RvdGFsLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXAsICVkLCAlcCwgJXApXG4iLCBfX2Z1bmNfXywgb2ZsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfdG90YWwsIHZhcnMsIHZhcnMyKTsKKyAgICBvZmxkLT5tZXJnZV92YXJfZGVzY3ModmFycywgdmFyczIsIHZhcnNfdG90YWwpOworICAgIG9mbGQtPnNjYXR0ZXJfY29weWluX2RhdGEoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0xFQVZFKAorICAgIE9GRkxPQUQgb2ZsZAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIG9mbGQpOworICAgIG9mbGQtPmdhdGhlcl9jb3B5b3V0X2RhdGEoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX01BSU4odm9pZCkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRhcmdldCBwYXJ0CisgICAgX19vZmZsb2FkX3RhcmdldF9pbml0KCk7CisKKyAgICAvLyBwYXNzIGNvbnRyb2wgdG8gQ09JCisgICAgUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpOworICAgIFByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkV4aXRpbmcgbWFpbi4uLlxuIik7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmggYi9yYzEvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMmMxYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gY29tcGlsZXItZ2VuZXJhdGVkIHRhcmdldCBjb2RlIGFuZCBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfRU5URVIgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfZW50ZXIpCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0xFQVZFICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2xlYXZlKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9NQUlOICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9tYWluKQorCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0VOVEVSCisgICAgXGJyaWVmIEZpbGwgaW4gdmFyaWFibGUgYWRkcmVzc2VzIHVzaW5nIFZhckRlc2MgYXJyYXkuCisgICAgXGJyaWVmIFRoZW4gY2FsbCBiYWNrIHRoZSBydW50aW1lIGxpYnJhcnkgdG8gZmV0Y2ggZGF0YS4KKyAgICBccGFyYW0gb2ZsZCAgICAgICAgIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHJ1bnRpbWUuCisgICAgXHBhcmFtIHZhcl9kZXNjX251bSBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcl9kZXNjICAgICBQb2ludGVyIHRvIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIHZhcl9kZXNjMiAgICBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorKi8KK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9FTlRFUigKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgaW50IHZhcl9kZXNjX251bSwKKyAgICBWYXJEZXNjICp2YXJfZGVzYywKKyAgICBWYXJEZXNjMiAqdmFyX2Rlc2MyCispOworCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0xFQVZFCisgICAgXGJyaWVmIENhbGwgYmFjayB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGdhdGhlciBvdXRwdXRzIHVzaW5nIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIG9mbGQgT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyovCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTEVBVkUoCisgICAgT0ZGTE9BRCBvZmxkCispOworCisvLyBFbnRyeSBwb2ludCBmb3IgdGhlIHRhcmdldCBhcHBsaWNhdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9NQUlOKHZvaWQpOworCisjZW5kaWYgLy8gQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ3MjcxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2R2X3V0aWwuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCitib29sIF9fZHZfaXNfY29udGlndW91cyhjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgaWYgKGR2cC0+RmxhZ3MgJiBBcnJEZXNjRmxhZ3NDb250aWd1b3VzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChkdnAtPlJhbmsgIT0gMCkgeworICAgICAgICBpZiAoZHZwLT5EaW1bMF0uTXVsdCAhPSBkdnAtPkxlbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZHZwLT5SYW5rOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkdnAtPkRpbVtpXS5NdWx0ICE9CisgICAgICAgICAgICAgICAgZHZwLT5EaW1baS0xXS5FeHRlbnQgKiBkdnAtPkRpbVtpLTFdLk11bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX19kdl9pc19hbGxvY2F0ZWQoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIHJldHVybiAoZHZwLT5GbGFncyAmIEFyckRlc2NGbGFnc0RlZmluZWQpOworfQorCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICB1aW50NjRfdCBzaXplOworCisgICAgaWYgKGR2cC0+UmFuayA9PSAwKSB7CisgICAgICAgIHNpemUgPSBkdnAtPkxlbjsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgc2l6ZSA9IGR2cC0+TGVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHZwLT5SYW5rOyArK2kpIHsKKyAgICAgICAgc2l6ZSArPSAoZHZwLT5EaW1baV0uRXh0ZW50LTEpICogZHZwLT5EaW1baV0uTXVsdDsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwLCBpbnQ2NF90IGNvdW50KQoreworICAgIGlmIChkdnAtPlJhbmsgPT0gMCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50ICogZHZwLT5EaW1bMF0uTXVsdDsKK30KKworLy8gQ3JlYXRlIENlYW5SZWFkUmFuZ2VzIGRhdGEgZm9yIHJlYWRpbmcgY29udGlndW91cyByYW5nZXMgb2YKKy8vIG5vbmNvbnRpZ3VvdXMgYXJyYXkgZGVmaW5lZCBieSB0aGUgYXJndW1lbnQKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19kdihjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgaW50NjRfdCAgICAgICAgIGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQ7CisgICAgaW50ICAgICAgICAgICAgIHJhbmsgPSBkdnAtPlJhbms7CisgICAgQ2VhblJlYWRSYW5nZXMgKnJlcyA9IE5VTEw7CisKKyAgICBpZiAocmFuayAhPSAwKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgbGVuID0gZHZwLT5MZW47CisgICAgICAgIGlmIChkdnAtPkRpbVswXS5NdWx0ID09IGxlbikgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJhbms7IGkrKykgeworICAgICAgICAgICAgICAgIGxlbiAqPSBkdnAtPkRpbVtpLTFdLkV4dGVudDsKKyAgICAgICAgICAgICAgICBpZiAoZHZwLT5EaW1baV0uTXVsdCAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IChDZWFuUmVhZFJhbmdlcyAqKW1hbGxvYygKKyAgICAgICAgICAgIHNpemVvZihDZWFuUmVhZFJhbmdlcykgKyAocmFuayAtIGkpICogc2l6ZW9mKENlYW5SZWFkRGltKSk7CisgICAgICAgIHJlcyAtPiBsYXN0X25vbmNvbnRfaW5kID0gcmFuayAtIGkgLSAxOworICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIGZvciAoOyBpIDwgcmFuazsgaSsrKSB7CisgICAgICAgICAgICByZXMtPkRpbVtyYW5rIC0gaSAtIDFdLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICByZXMtPkRpbVtyYW5rIC0gaSAtIDFdLnNpemUgPSBkdnAtPkRpbVtpXS5NdWx0OworICAgICAgICAgICAgY291bnQgKj0gZHZwLT5EaW1baV0uRXh0ZW50OworICAgICAgICB9CisgICAgICAgIHJlcyAtPiByYW5nZV9tYXhfbnVtYmVyID0gY291bnQ7CisgICAgICAgIHJlcyAtPiByYW5nZV9zaXplID0gbGVuOworICAgICAgICByZXMgLT4gcHRyID0gKHZvaWQqKWR2cC0+QmFzZTsKKyAgICAgICAgcmVzIC0+IGN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICAgICAgcmVzIC0+IGluaXRfb2Zmc2V0ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmIE9GRkxPQURfREVCVUcgPiAwCit2b2lkIF9fZHZfZGVzY19kdW1wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDMsICIlcyBEViAlcFxuIiwgbmFtZSwgZHZwKTsKKworICAgIGlmIChkdnAgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+QmFzZSAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5MZW4gICAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPk9mZnNldCA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+RmxhZ3MgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5SYW5rICAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPlJlc3J2ZCA9IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+UmFuaywKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPlJlc2VydmVkKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBkdnAtPlJhbms7IGkrKykgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICglZCkgRXh0ZW50PSVsZCwgTXVsdGlwbGllcj0lbGQsIExvd2VyQm91bmQ9JWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5FeHRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RGltW2ldLk11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RGltW2ldLkxvd2VyQm91bmQpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oIGIvcmMxL29mZmxvYWQvc3JjL2R2X3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZhNzdkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL2R2X3V0aWwuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgRFZfVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIERWX1VUSUxfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIERvcGUgdmVjdG9yIGRlY2xhcmF0aW9ucworI2RlZmluZSBBcnJEZXNjTWF4QXJyYXlSYW5rICAgICAgICAgMzEKKworLy8gRG9wZSB2ZWN0b3IgZmxhZ3MKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzRGVmaW5lZCAgICAgICAgIDEKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzTm9kZWFsbG9jICAgICAgIDIKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzQ29udGlndW91cyAgICAgIDQKKwordHlwZWRlZiBpbnQ2NF90IGR2X3NpemU7CisKK3R5cGVkZWYgc3RydWN0IERpbURlc2MgeworICAgIGR2X3NpemUgICAgICAgIEV4dGVudDsgICAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBkdl9zaXplICAgICAgICBNdWx0OyAgICAgICAgLy8gTXVsdGlwbGllciBmb3IgdGhpcyBkaW1lbnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorICAgIGR2X3NpemUgICAgICAgIExvd2VyQm91bmQ7ICAvLyBMb3dlckJvdW5kIG9mIHRoaXMgZGltZW5zaW9uCit9IERpbURlc2MgOworCit0eXBlZGVmIHN0cnVjdCBBcnJEZXNjIHsKKyAgICBkdl9zaXplICAgICAgICBCYXNlOyAgICAgICAgLy8gQmFzZSBhZGRyZXNzCisgICAgZHZfc2l6ZSAgICAgICAgTGVuOyAgICAgICAgIC8vIExlbmd0aCBvZiBkYXRhIHR5cGUsIHVzZWQgb25seSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHN0cmluZ3MuCisgICAgZHZfc2l6ZSAgICAgICAgT2Zmc2V0OworICAgIGR2X3NpemUgICAgICAgIEZsYWdzOyAgICAgICAvLyBGbGFncworICAgIGR2X3NpemUgICAgICAgIFJhbms7ICAgICAgICAvLyBSYW5rIG9mIHBvaW50ZXIKKyAgICBkdl9zaXplICAgICAgICBSZXNlcnZlZDsgICAgLy8gcmVzZXJ2ZWQgZm9yIG9wZW5tcCByZXF1ZXN0cworICAgIERpbURlc2MgRGltW0FyckRlc2NNYXhBcnJheVJhbmtdOworfSBBcnJEZXNjIDsKKwordHlwZWRlZiBBcnJEZXNjKiBwQXJyRGVzYzsKKworYm9vbCBfX2R2X2lzX2NvbnRpZ3VvdXMoY29uc3QgQXJyRGVzYyAqZHZwKTsKKworYm9vbCBfX2R2X2lzX2FsbG9jYXRlZChjb25zdCBBcnJEZXNjICpkdnApOworCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwLCBpbnQ2NF90IG5lbGVtcyk7CisKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19kdihjb25zdCBBcnJEZXNjICpkdnApOworCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKK3ZvaWQgICAgX19kdl9kZXNjX2R1bXAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQXJyRGVzYyAqZHZwKTsKKyNlbHNlIC8vIE9GRkxPQURfREVCVUcKKyNkZWZpbmUgX19kdl9kZXNjX2R1bXAobmFtZSwgZHZwKQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworI2VuZGlmIC8vIERWX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYyBiL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNWY4YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZuZGVmIHZhX2NvcHkKKyNkZWZpbmUgdmFfY29weShkc3QsIHNyYykgKChkc3QpID0gKHNyYykpCisjZW5kaWYKKworI2luY2x1ZGUgImxpYm9mZmxvYWRfbXNnLmgiCisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVycm9yLWhhbmRsaW5nIGZ1bmN0aW9uLCBsaWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgaW5wdXRfdGFnKTsKKworICAgIHN3aXRjaCAoaW5wdXRfdGFnKSB7CisgICAgICAgIGNhc2UgY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZGV2aWNlX251bWJlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19zZW5kX2Z1bmNfcHRyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3NlbmRfZnVuY19wdHIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yZWNlaXZlX2Z1bmNfcHRyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3JlY2VpdmVfZnVuY19wdHIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX21hbGxvYzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX21hbGxvYywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWQxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWQxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfdW5rbm93bl92YXJfdHlwZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBjX3Vua25vd25fdmFyX3R5cGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2Vudl92YXJfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsZWQxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zaWduYWxlZDI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19teW93cmFwcGVyX2NoZWNrcmVzdWx0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19teW90YXJnZXRfY2hlY2tyZXN1bHQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tZXJnZV92YXJfZGVzY3MxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21lcmdlX3Zhcl9kZXNjczEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tZXJnZV92YXJfZGVzY3MyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21lcmdlX3Zhcl9kZXNjczIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdF9yZXQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9yZXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0X3NpZzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0MzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ1OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub19zdGF0aWNfdmFyX2RhdGE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fc3RhdGljX3Zhcl9kYXRhLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fcHRyX2RhdGE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fcHRyX2RhdGEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19nZXRfZW5naW5lX2hhbmRsZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19nZXRfZW5naW5lX2hhbmRsZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2dldF9lbmdpbmVfaW5kZXg6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfY3JlYXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcHJvY2Vzc193YWl0X3NodXRkb3duOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfcHJveHlfZmx1c2g6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19sb2FkX2xpYnJhcnk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbG9hZF9saWJyYXJ5LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfY29pcGlwZV9tYXhfbnVtYmVyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcGlwZWxpbmVfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3J1bl9mdW5jOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGVfb3V0X29mX21lbToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX2Zyb21fbWVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGVfZnJvbV9tZW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfZGVzdHJveToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfZGVzdHJveSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9tYXA6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX21hcCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl91bm1hcDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfdW5tYXAsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfcmVhZDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfcmVhZCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl93cml0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfd3JpdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY29weToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY29weSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9nZXRfYWRkcmVzczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfZ2V0X2FkZHJlc3MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfYWRkX3JlZjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfYWRkX3JlZiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9yZWxlYXNlX3JlZjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfcmVsZWFzZV9yZWYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfc2V0X3N0YXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9zZXRfc3RhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ldmVudF93YWl0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2V2ZW50X3dhaXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY196ZXJvX29yX25lZ19wdHJfbGVuOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19iYWRfcHRyX21lbV9yYW5nZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19iYWRfcHRyX21lbV9yYW5nZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Jhbmdlc19kb250X21hdGNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Jhbmdlc19kb250X21hdGNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZGVzdGluYXRpb25faXNfb3ZlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19zbGljZV9vZl9ub25jb250X2FycmF5LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3I6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wb2ludGVyX2FycmF5X21pc21hdGNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29tcF9pbnZhbGlkX2RldmljZV9udW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Vua25vd25fYmluYXJ5X3R5cGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX211bHRpcGxlX3RhcmdldF9leGVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fdGFyZ2V0X2V4ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ub190YXJnZXRfZXhlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB2YV9lbmQoYXJncyk7Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGVycm9yX3R5cGVzIGlucHV0X3RhZykKK3sKKyAgICBzd2l0Y2ggKGlucHV0X3RhZykgeworICAgICAgICBjYXNlIGNfcmVwb3J0X3RpdGxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGl0bGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9mcm9tX2ZpbGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9mcm9tX2ZpbGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9vZmZsb2FkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfb2ZmbG9hZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2ZpbGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9maWxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbGluZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2xpbmUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9ob3N0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3RhZzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhZykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NwdV90aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY3B1X3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZWNvbmRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2Vjb25kcykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NwdV90b19taWNfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2J5dGVzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfYnl0ZXMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY190aW1lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29weW91dF9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY29weW91dF9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcmVhdGVfYnVmX21pYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZGVzdHJveToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2Rlc3Ryb3kpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXRlX3NpZ25hbDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NpZ25hbDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NpZ25hbCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3dhaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF93YWl0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaW5pdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2luaXQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9pbml0X2Z1bmM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9pbml0X2Z1bmMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9sb2dpY2FsX2NhcmQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9sb2dpY2FsX2NhcmQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfbXlvX2ZwdHI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfbXlvX3NoYXJlZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvYWNxdWlyZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2FjcXVpcmUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9maW5pOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvZmluaSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2luaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9pbml0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvcmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3JlbGVhc2U6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9yZWxlYXNlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWU6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2M6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkZnJlZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2M6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9waHlzaWNhbF9jYXJkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlZ2lzdGVyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGFydDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXJ0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhdGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bnJlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdW5yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3ZhcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3ZhcikpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIoaW50IGkpCit7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZDoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9pbml0aWFsaXplKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmU6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3RhcmdldF9hY3F1aXJlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9idWZmZXJzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfbWlzY19kYXRhKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfYWxsb2NfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9kZXN0cm95X2J1ZmZlcnMpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKGludCBpKQoreworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0czoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0czoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIKKyAgICAgICAgICAgICAgICAobXNnX2NfcmVwb3J0X3RhcmdldF9nYXRoZXJfb3V0cHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmggYi9yYzEvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjE2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oCkBAIC0wLDAgKzEsMjc2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiAhZGVmaW5lZChMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gpCisjZGVmaW5lIExJQk9GRkxPQURfRVJST1JfQ09ERVNfSAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bQoreworICAgIGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUgPSAwLAorICAgIGNfaW52YWxpZF9kZXZpY2VfbnVtYmVyLAorICAgIGNfb2ZmbG9hZDEsCisgICAgY191bmtub3duX3Zhcl90eXBlLAorICAgIGNfc2VuZF9mdW5jX3B0ciwKKyAgICBjX3JlY2VpdmVfZnVuY19wdHIsCisgICAgY19vZmZsb2FkX21hbGxvYywKKyAgICBjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwKKyAgICBjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisgICAgY19vZmZsb2FkX3NpZ25hbGVkMSwKKyAgICBjX29mZmxvYWRfc2lnbmFsZWQyLAorICAgIGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LAorICAgIGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwKKyAgICBjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLAorICAgIGNfbWVyZ2VfdmFyX2Rlc2NzMSwKKyAgICBjX21lcmdlX3Zhcl9kZXNjczIsCisgICAgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwKKyAgICBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9yZXQsCisgICAgY19taWNfcHJvY2Vzc19leGl0X3NpZywKKyAgICBjX21pY19wcm9jZXNzX2V4aXQsCisgICAgY19taWNfaW5pdDMsCisgICAgY19taWNfaW5pdDQsCisgICAgY19taWNfaW5pdDUsCisgICAgY19taWNfaW5pdDYsCisgICAgY19ub19zdGF0aWNfdmFyX2RhdGEsCisgICAgY19ub19wdHJfZGF0YSwKKyAgICBjX2dldF9lbmdpbmVfaGFuZGxlLAorICAgIGNfZ2V0X2VuZ2luZV9pbmRleCwKKyAgICBjX3Byb2Nlc3NfY3JlYXRlLAorICAgIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLAorICAgIGNfcHJvY2Vzc193YWl0X3NodXRkb3duLAorICAgIGNfcHJvY2Vzc19wcm94eV9mbHVzaCwKKyAgICBjX2xvYWRfbGlicmFyeSwKKyAgICBjX3BpcGVsaW5lX2NyZWF0ZSwKKyAgICBjX3BpcGVsaW5lX3J1bl9mdW5jLAorICAgIGNfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzLAorICAgIGNfYnVmX2NyZWF0ZSwKKyAgICBjX2J1Zl9jcmVhdGVfb3V0X29mX21lbSwKKyAgICBjX2J1Zl9jcmVhdGVfZnJvbV9tZW0sCisgICAgY19idWZfZGVzdHJveSwKKyAgICBjX2J1Zl9tYXAsCisgICAgY19idWZfdW5tYXAsCisgICAgY19idWZfcmVhZCwKKyAgICBjX2J1Zl93cml0ZSwKKyAgICBjX2J1Zl9jb3B5LAorICAgIGNfYnVmX2dldF9hZGRyZXNzLAorICAgIGNfYnVmX2FkZF9yZWYsCisgICAgY19idWZfcmVsZWFzZV9yZWYsCisgICAgY19idWZfc2V0X3N0YXRlLAorICAgIGNfZXZlbnRfd2FpdCwKKyAgICBjX3plcm9fb3JfbmVnX3B0cl9sZW4sCisgICAgY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLAorICAgIGNfYmFkX3B0cl9tZW1fcmFuZ2UsCisgICAgY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgIGNfcmFuZ2VzX2RvbnRfbWF0Y2gsCisgICAgY19kZXN0aW5hdGlvbl9pc19vdmVyLAorICAgIGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwKKyAgICBjX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLAorICAgIGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKyAgICBjX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52LAorICAgIGNfb21wX2ludmFsaWRfZGV2aWNlX251bSwKKyAgICBjX3Vua25vd25fYmluYXJ5X3R5cGUsCisgICAgY19tdWx0aXBsZV90YXJnZXRfZXhlcywKKyAgICBjX25vX3RhcmdldF9leGUsCisgICAgY19yZXBvcnRfaG9zdCwKKyAgICBjX3JlcG9ydF90YXJnZXQsCisgICAgY19yZXBvcnRfdGl0bGUsCisgICAgY19yZXBvcnRfZnJvbV9maWxlLAorICAgIGNfcmVwb3J0X2ZpbGUsCisgICAgY19yZXBvcnRfbGluZSwKKyAgICBjX3JlcG9ydF90YWcsCisgICAgY19yZXBvcnRfc2Vjb25kcywKKyAgICBjX3JlcG9ydF9ieXRlcywKKyAgICBjX3JlcG9ydF9taWMsCisgICAgY19yZXBvcnRfY3B1X3RpbWUsCisgICAgY19yZXBvcnRfY3B1X3RvX21pY19kYXRhLAorICAgIGNfcmVwb3J0X21pY190aW1lLAorICAgIGNfcmVwb3J0X21pY190b19jcHVfZGF0YSwKKyAgICBjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUsCisgICAgY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLAorICAgIGNfcmVwb3J0X29mZmxvYWQsCisgICAgY19yZXBvcnRfd190YWcsCisgICAgY19yZXBvcnRfc3RhdGUsCisgICAgY19yZXBvcnRfc3RhcnQsCisgICAgY19yZXBvcnRfaW5pdCwKKyAgICBjX3JlcG9ydF9sb2dpY2FsX2NhcmQsCisgICAgY19yZXBvcnRfcGh5c2ljYWxfY2FyZCwKKyAgICBjX3JlcG9ydF9yZWdpc3RlciwKKyAgICBjX3JlcG9ydF9pbml0X2Z1bmMsCisgICAgY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0LAorICAgIGNfcmVwb3J0X2NyZWF0ZV9idWZfbWljLAorICAgIGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSwKKyAgICBjX3JlcG9ydF9jb3B5aW5fZGF0YSwKKyAgICBjX3JlcG9ydF9zdGF0ZV9zaWduYWwsCisgICAgY19yZXBvcnRfc2lnbmFsLAorICAgIGNfcmVwb3J0X3dhaXQsCisgICAgY19yZXBvcnRfY29tcHV0ZSwKKyAgICBjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisgICAgY19yZXBvcnRfdmFyLAorICAgIGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX3JlcG9ydF9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfdW5yZWdpc3RlciwKKyAgICBjX3JlcG9ydF9kZXN0cm95LAorICAgIGNfcmVwb3J0X215b2luaXQsCisgICAgY19yZXBvcnRfbXlvcmVnaXN0ZXIsCisgICAgY19yZXBvcnRfbXlvZmluaSwKKyAgICBjX3JlcG9ydF9taWNfbXlvX3NoYXJlZCwKKyAgICBjX3JlcG9ydF9taWNfbXlvX2ZwdHIsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGZyZWUsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICBjX3JlcG9ydF9teW9hY3F1aXJlLAorICAgIGNfcmVwb3J0X215b3JlbGVhc2UsCisgICAgY19jb2lwaXBlX21heF9udW1iZXIKK30gZXJyb3JfdHlwZXM7CisKK2VudW0gT2ZmbG9hZEhvc3RQaGFzZSB7CisgICAgLy8gVG90YWwgdGltZSBvbiBob3N0IGZvciBlbnRpcmUgb2ZmbG9hZAorICAgIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQgPSAwLAorCisgICAgLy8gVGltZSB0byBsb2FkIHRhcmdldCBiaW5hcnkKKyAgICBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplLAorCisgICAgLy8gVGltZSB0byBhY3F1aXJlIGxyYiBhdmFpbGFiaWxpdHkgZHluYW1pY2FsbHkKKyAgICBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSwKKworICAgIC8vIFRpbWUgdG8gd2FpdCBmb3IgZGVwZW5kZW5jaWVzCisgICAgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBwb2ludGVyIGJ1ZmZlcnMsIGluaXRpYXRlIHdyaXRlcyBmb3IgcG9pbnRlcnMKKyAgICAvLyBhbmQgY2FsY3VsYXRlIHNpemUgb2YgY29weWluL2NvcHlvdXQgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycywKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycywKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhbGl6ZSBtaXNjIGRhdGEKKyAgICBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIGNvcHlpbi9jb3B5b3V0IGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byBpbml0aWF0ZSB3cml0ZXMgZnJvbSBob3N0IHBvaW50ZXJzIHRvIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzLAorCisgICAgLy8gVGltZSB0byBHYXRoZXIgSU4gZGF0YSBvZiBvZmZsb2FkIGludG8gYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cywKKworICAgIC8vIFRpbWUgdG8gbWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gdW5tYXAgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHN0YXJ0IHJlbW90ZSBmdW5jdGlvbiBjYWxsIHRoYXQgZG9lcyBjb21wdXRhdGlvbiBvbiBscmIKKyAgICBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlLAorCisgICAgLy8gVGltZSB0byB3YWl0IGZvciBjb21wdXRlIHRvIGZpbmlzaAorICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhdGUgcmVhZHMgZnJvbSBwb2ludGVyIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzLAorCisgICAgLy8gVGltZSB0byB1cGRhdGUgaG9zdCB2YXJpYWJlbHMgd2l0aCBPVVQgZGF0YSBmcm9tIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cywKKworICAgIC8vIFRpbWUgdG8gbWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHVubWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gd2FpdCByZWFkcyBmcm9tIGJ1ZmZlcnMgdG8gZmluaXNoCisgICAgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzLAorCisgICAgLy8gVGltZSB0byBkZXN0cm95IGJ1ZmZlcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZAorICAgIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycywKKworICAgIC8vIExBU1QgVElNRSBNT05JVE9SCisgICAgY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlCit9OworCitlbnVtIE9mZmxvYWRUYXJnZXRQaGFzZSB7CisgICAgLy8gVG90YWwgdGltZSBzcGVudCBvbiB0aGUgdGFyZ2V0CisgICAgY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lID0gMCwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhbGl6ZSBvZmZsb2FkIGRlc2NyaXB0b3IKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAsCisKKyAgICAvLyBUaW1lIHRvIGZpbmQgdGFyZ2V0IGVudHJ5IHBvaW50IGluIGxvb2t1cCB0YWJsZQorICAgIGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXAsCisKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW5kIGV4ZWN1dGluZyBvZmZsb2FkIGVudHJ5CisgICAgY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgdGFyZ2V0IHZhcmlhYmxlcyB3aXRoIElOIHZhbHVlcyBmcm9tIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMsCisKKyAgICAvLyBUaW1lIHRvIGFkZCBidWZmZXIgcmVmZXJlbmNlIGZvciBwb2ludGVyIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcywKKworICAgIC8vIFRvdGFsIHRpbWUgb24gbHJiIGZvciBjb21wdXRhdGlvbgorICAgIGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSwKKworICAgIC8vIE9uIGxyYiwgdGltZSB0byBjb3B5IE9VVCBpbnRvIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMsCisKKyAgICAvLyBUaW1lIHRvIHJlbGVhc2UgYnVmZmVyIHJlZmVyZW5jZXMKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMsCisKKyAgICAvLyBMQVNUIFRJTUUgTU9OSVRPUgorICAgIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KGVycm9yX3R5cGVzIGlucHV0X3RhZywgLi4uKTsKK3ZvaWQgX19saWJvZmZsb2FkX3JlcG9ydF9zdXBwb3J0KGVycm9yX3R5cGVzIGlucHV0X3RhZywgLi4uKTsKK2NoYXIgY29uc3QgKm9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGludCBtc2dDb2RlKTsKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGVycm9yX3R5cGVzIGlucHV0X3RhZyk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9ob3N0X3N0YWdlX3N0cihpbnQgaSk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKGludCBpKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNkZWZpbmUgdGVzdF9tc2dfY2F0KG5tLCBtc2cpIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0IFRFU1QgZm9yICVzIFxuIFx0Iiwgbm0pOyBcCisgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQobXNnKTsKKworI2RlZmluZSB0ZXN0X21zZ19jYXQxKG5tLCBtc2csIC4uLikgXAorICAgIGZwcmludGYoc3RkZXJyLCAiXHQgVEVTVCBmb3IgJXMgXG4gXHQiLCBubSk7IFwKKyAgICBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChtc2csIF9fVkFfQVJHU19fKTsKKwordm9pZCB3cml0ZV9tZXNzYWdlKEZJTEUgKiBmaWxlLCBpbnQgbXNnQ29kZSwgdmFfbGlzdCBhcmdzX3ApOworCisjZGVmaW5lIExJQk9GRkxPQURfRVJST1IgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBMSUJPRkZMT0FEX0FCT1JUIFwKKyAgICAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoMCwgX1dSSVRFX0FCT1JUX01TRyk7IFwKKyAgICAgICAgIGFib3J0KCkKKyNlbHNlCisjZGVmaW5lIExJQk9GRkxPQURfQUJPUlQgXAorICAgICAgICAgYWJvcnQoKQorI2VuZGlmCisKKyNlbmRpZiAvLyAhZGVmaW5lZChMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gpCmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYyBiL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjAzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYwpAQCAtMCwwICsxLDM1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQnJpbmcgaW4gdGhlIHN0YXRpYyBzdHJpbmcgdGFibGUgYW5kIHRoZSBlbnVtZXJhdGlvbnMgZm9yIGluZGV4aW5nIGludG8KKy8vIGl0LgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX21zZy5oIgorCisjIGRlZmluZSBEWU5BUlRfU1RERVJSX1BVVFMoX19tZXNzYWdlX3RleHRfXykgZnB1dHMoKF9fbWVzc2FnZV90ZXh0X18pLHN0ZGVycikKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBOb3cgdGhlIGNvZGUgZm9yIGFjY2Vzc2luZyB0aGUgbWVzc2FnZSBjYXRhbG9ncworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworICAgIHZvaWQgd3JpdGVfbWVzc2FnZShGSUxFICogZmlsZSwgaW50IG1zZ0NvZGUpIHsKKyAgICAgICAgZnB1dHMoTUVTU0FHRV9UQUJMRV9OQU1FWyBtc2dDb2RlIF0sIGZpbGUpOworICAgICAgICBmZmx1c2goZmlsZSk7CisgICAgfQorCisgICAgY2hhciBjb25zdCAqb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoaW50IG1zZ0NvZGUpIHsKKyAgICAgICAgcmV0dXJuIE1FU1NBR0VfVEFCTEVfTkFNRVsgbXNnQ29kZSBdOworICAgIH0KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oIGIvcmMxL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NDVmOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oCkBAIC0wLDAgKzEsMzI2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBmaWxlOiBsaWJvZmZsb2FkX21zZy5oCitlbnVtIHsKKwlfX2R1bW15X18gPSAwLAorCW1zZ19jX2RldmljZV9pc19ub3RfYXZhaWxhYmxlLAorCW1zZ19jX2ludmFsaWRfZGV2aWNlX251bWJlciwKKwltc2dfY19zZW5kX2Z1bmNfcHRyLAorCW1zZ19jX3JlY2VpdmVfZnVuY19wdHIsCisJbXNnX2Nfb2ZmbG9hZF9tYWxsb2MsCisJbXNnX2Nfb2ZmbG9hZDEsCisJbXNnX2NfdW5rbm93bl92YXJfdHlwZSwKKwltc2dfY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisJbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKwltc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisJbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDEsCisJbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIsCisJbXNnX2NfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwKKwltc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQsCisJbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsCisJbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSwKKwltc2dfY19tZXJnZV92YXJfZGVzY3MyLAorCW1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxLAorCW1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0LAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXRfc2lnLAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXQsCisJbXNnX2NfbWljX2luaXQzLAorCW1zZ19jX21pY19pbml0NCwKKwltc2dfY19taWNfaW5pdDUsCisJbXNnX2NfbWljX2luaXQ2LAorCW1zZ19jX25vX3N0YXRpY192YXJfZGF0YSwKKwltc2dfY19ub19wdHJfZGF0YSwKKwltc2dfY19nZXRfZW5naW5lX2hhbmRsZSwKKwltc2dfY19nZXRfZW5naW5lX2luZGV4LAorCW1zZ19jX3Byb2Nlc3NfY3JlYXRlLAorCW1zZ19jX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywKKwltc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sCisJbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCwKKwltc2dfY19sb2FkX2xpYnJhcnksCisJbXNnX2NfcGlwZWxpbmVfY3JlYXRlLAorCW1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jLAorCW1zZ19jX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywKKwltc2dfY19idWZfY3JlYXRlLAorCW1zZ19jX2J1Zl9jcmVhdGVfb3V0X29mX21lbSwKKwltc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtLAorCW1zZ19jX2J1Zl9kZXN0cm95LAorCW1zZ19jX2J1Zl9tYXAsCisJbXNnX2NfYnVmX3VubWFwLAorCW1zZ19jX2J1Zl9yZWFkLAorCW1zZ19jX2J1Zl93cml0ZSwKKwltc2dfY19idWZfY29weSwKKwltc2dfY19idWZfZ2V0X2FkZHJlc3MsCisJbXNnX2NfYnVmX2FkZF9yZWYsCisJbXNnX2NfYnVmX3JlbGVhc2VfcmVmLAorCW1zZ19jX2J1Zl9zZXRfc3RhdGUsCisJbXNnX2NfZXZlbnRfd2FpdCwKKwltc2dfY196ZXJvX29yX25lZ19wdHJfbGVuLAorCW1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUsCisJbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UsCisJbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKwltc2dfY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwKKwltc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKwltc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtLAorCW1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUsCisJbXNnX2NfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsCisJbXNnX2Nfbm9fdGFyZ2V0X2V4ZSwKKwltc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLAorCW1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUsCisJbXNnX2NfcmVwb3J0X2hvc3QsCisJbXNnX2NfcmVwb3J0X21pYywKKwltc2dfY19yZXBvcnRfdGl0bGUsCisJbXNnX2NfcmVwb3J0X3NlY29uZHMsCisJbXNnX2NfcmVwb3J0X2J5dGVzLAorCW1zZ19jX3JlcG9ydF9jcHVfdGltZSwKKwltc2dfY19yZXBvcnRfbWljX3RpbWUsCisJbXNnX2NfcmVwb3J0X3RhZywKKwltc2dfY19yZXBvcnRfZnJvbV9maWxlLAorCW1zZ19jX3JlcG9ydF9maWxlLAorCW1zZ19jX3JlcG9ydF9saW5lLAorCW1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEsCisJbXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSwKKwltc2dfY19yZXBvcnRfb2ZmbG9hZCwKKwltc2dfY19yZXBvcnRfd190YWcsCisJbXNnX2NfcmVwb3J0X3N0YXRlLAorCW1zZ19jX3JlcG9ydF9zdGFydCwKKwltc2dfY19yZXBvcnRfaW5pdCwKKwltc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkLAorCW1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkLAorCW1zZ19jX3JlcG9ydF9yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfaW5pdF9mdW5jLAorCW1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QsCisJbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljLAorCW1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCwKKwltc2dfY19yZXBvcnRfc2lnbmFsLAorCW1zZ19jX3JlcG9ydF93YWl0LAorCW1zZ19jX3JlcG9ydF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYywKKwltc2dfY19yZXBvcnRfdmFyLAorCW1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhLAorCW1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfY29weW91dF9kYXRhLAorCW1zZ19jX3JlcG9ydF91bnJlZ2lzdGVyLAorCW1zZ19jX3JlcG9ydF9kZXN0cm95LAorCW1zZ19jX3JlcG9ydF9teW9pbml0LAorCW1zZ19jX3JlcG9ydF9teW9yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfbXlvZmluaSwKKwltc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQsCisJbXNnX2NfcmVwb3J0X21pY19teW9fZnB0ciwKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKwltc2dfY19yZXBvcnRfbXlvYWNxdWlyZSwKKwltc2dfY19yZXBvcnRfbXlvcmVsZWFzZSwKKwltc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUsCisJbXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSwKKwltc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycywKKwltc2dfY19yZXBvcnRfaG9zdF9hbGxvY19idWZmZXJzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSwKKwltc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzLAorCW1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2NhdHRlcl9vdXRwdXRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcywKKwltc2dfY19yZXBvcnRfaG9zdF9kZXN0cm95X2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzLAorCW1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyLAorCW1zZ19jX3Jhbmdlc19kb250X21hdGNoLAorCW1zZ19jX2Rlc3RpbmF0aW9uX2lzX292ZXIsCisJbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwKKwltc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorCWxhc3RNc2cgPSAxNTIsCisJZmlyc3RNc2cgPSAxCit9OworCisKKyNpZiAhZGVmaW5lZChNRVNTQUdFX1RBQkxFX05BTUUpCisjICAgIGRlZmluZSBNRVNTQUdFX1RBQkxFX05BTUUgX19saWJvZmZsb2FkX21lc3NhZ2VfdGFibGUKKyNlbmRpZgorCitzdGF0aWMgY2hhciBjb25zdCAqIE1FU1NBR0VfVEFCTEVfTkFNRVtdID0geworCS8qICAgMCBfX2R1bW15X18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlVuLXVzZWQgbWVzc2FnZSIsCisJLyogICAxIG1zZ19jX2RldmljZV9pc19ub3RfYXZhaWxhYmxlICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IG9mZmxvYWQgdG8gTUlDIC0gZGV2aWNlIGlzIG5vdCBhdmFpbGFibGUiLAorCS8qICAgMiBtc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGV4cGVjdGVkIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAtMSIsCisJLyogICAzIG1zZ19jX3NlbmRfZnVuY19wdHIgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZnVuY3Rpb24gbmFtZSBmb3IgYWRkcmVzcyAlcCIsCisJLyogICA0IG1zZ19jX3JlY2VpdmVfZnVuY19wdHIgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgYWRkcmVzcyBvZiBmdW5jdGlvbiAlcyIsCisJLyogICA1IG1zZ19jX29mZmxvYWRfbWFsbG9jICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIChyZXF1ZXN0ZWQ9JWxsZCBieXRlcywgYWxpZ24gJWxsZCkiLAorCS8qICAgNiBtc2dfY19vZmZsb2FkMSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRldmljZSAlZCBkb2VzIG5vdCBoYXZlIGEgcGVuZGluZyBzaWduYWwgZm9yIHdhaXQoJXApIiwKKwkvKiAgIDcgbXNnX2NfdW5rbm93bl92YXJfdHlwZSAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmtub3duIHZhcmlhYmxlIHR5cGUgJWQiLAorCS8qICAgOCBtc2dfY19pbnZhbGlkX2Vudl92YXJfdmFsdWUgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgaW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yICVzIiwKKwkvKiAgIDkgbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IHNwZWNpZnkgYW4gaW50ZWdlciB2YWx1ZSBmb3IgJXMiLAorCS8qICAxMCBtc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgJXMgc2V0dGluZzsgdXNlIGEgdmFsdWUgaW4gcmFuZ2UgMS0zIiwKKwkvKiAgMTEgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDEgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBpbnZhbGlkIGRldmljZSBudW1iZXIgJWQgc3BlY2lmaWVkIGluIF9PZmZsb2FkX3NpZ25hbGVkIiwKKwkvKiAgMTIgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBpbnZhbGlkIHNpZ25hbCAlcCBzcGVjaWZpZWQgZm9yIF9PZmZsb2FkX3NpZ25hbGVkIiwKKwkvKiAgMTMgbXNnX2NfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiAlcyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCisJLyogIDE0IG1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogJXMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAxNSBtc2dfY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIG9mZmxvYWQgZW50cnkgJXMiLAorCS8qICAxNiBtc2dfY19tZXJnZV92YXJfZGVzY3MxICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVuZXhwZWN0ZWQgbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzIiwKKwkvKiAgMTcgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIHZhcmlhYmxlIHR5cGUiLAorCS8qICAxOCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSAgICAgICAgICAgKi8gIm9mZmxvYWRfZXJyb3I6IE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlZ2luIHdpdGggYW4gYWxwYWJldGljIGNoYXJhY3RlciIsCisJLyogIDE5IG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyICAgICAgICAgICAqLyAib2ZmbG9hZF9lcnJvcjogTUlDIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggkT2SIiwKKwkvKiAgMjAgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9yZXQgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgdW5leHBlY3RlZGx5IGV4aXRlZCB3aXRoIGNvZGUgJWQiLAorCS8qICAyMSBtc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZyAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJWQgKCVzKSIsCisJLyogIDIyIG1zZ19jX21pY19wcm9jZXNzX2V4aXQgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHdhcyB1bmV4cGVjdGVkbHkgdGVybWluYXRlZCIsCisJLyogIDIzIG1zZ19jX21pY19pbml0MyAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBpZ25vcmluZyBNSUNfU1RBQ0tTSVpFIHNldHRpbmc7IHVzZSBhIHZhbHVlID49IDE2SyBhbmQgYSBtdWx0aXBsZSBvZiA0SyIsCisJLyogIDI0IG1zZ19jX21pY19pbml0NCAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdGhyZWFkIGtleSBjcmVhdGUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAyNSBtc2dfY19taWNfaW5pdDUgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogc3BlY2lmeSBPRkZMT0FEX0RFVklDRVMgYXMgY29tbWEtc2VwYXJhdGVkIHBoeXNpY2FsIGRldmljZSBudW1iZXJzIG9yICdub25lJyIsCisJLyogIDI2IG1zZ19jX21pY19pbml0NiAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBPRkZMT0FEX0RFVklDRVMgZGV2aWNlIG51bWJlciAlZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGh5c2ljYWwgZGV2aWNlIiwKKwkvKiAgMjcgbXNnX2Nfbm9fc3RhdGljX3Zhcl9kYXRhICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWNhbGx5IGFsbG9jYXRlZCB2YXJpYWJsZSAlcCIsCisJLyogIDI4IG1zZ19jX25vX3B0cl9kYXRhICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggcG9pbnRlciB2YXJpYWJsZSAlcCIsCisJLyogIDI5IG1zZ19jX2dldF9lbmdpbmVfaGFuZGxlICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBkZXZpY2UgJWQgaGFuZGxlIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMwIG1zZ19jX2dldF9lbmdpbmVfaW5kZXggICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBwaHlzaWNhbCBpbmRleCBmb3IgbG9naWNhbCBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzEgbXNnX2NfcHJvY2Vzc19jcmVhdGUgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgc3RhcnQgcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMyIG1zZ19jX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcyAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBmdW5jdGlvbiBoYW5kbGVzIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzMgbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB3YWl0IGZvciBwcm9jZXNzIHNodXRkb3duIGZhaWxlZCBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzQgbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmx1c2ggcHJvY2VzcyBvdXRwdXQgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM1IG1zZ19jX2xvYWRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGxvYWQgbGlicmFyeSB0byB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM2IG1zZ19jX3BpcGVsaW5lX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBwaXBlbGluZSBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM3IG1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGV4ZWN1dGUgZnVuY3Rpb24gb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzOCBtc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBzdGFydCBleGVjdXRpbmcgcGlwZWxpbmUgZnVuY3Rpb24gb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzOSBtc2dfY19idWZfY3JlYXRlICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MCBtc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0gICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIG9uIGRldmljZSAlZCwgb3V0IG9mIG1lbW9yeSIsCisJLyogIDQxIG1zZ19jX2J1Zl9jcmVhdGVfZnJvbV9tZW0gICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBidWZmZXIgZnJvbSBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQyIG1zZ19jX2J1Zl9kZXN0cm95ICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIGRlc3Ryb3kgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQzIG1zZ19jX2J1Zl9tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIG1hcCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDQgbXNnX2NfYnVmX3VubWFwICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgdW5tYXAgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ1IG1zZ19jX2J1Zl9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHJlYWQgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ2IG1zZ19jX2J1Zl93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHdyaXRlIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NyBtc2dfY19idWZfY29weSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBjb3B5IGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0OCBtc2dfY19idWZfZ2V0X2FkZHJlc3MgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgYnVmZmVyIGFkZHJlc3Mgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ5IG1zZ19jX2J1Zl9hZGRfcmVmICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHJldXNlIGJ1ZmZlciBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUwIG1zZ19jX2J1Zl9yZWxlYXNlX3JlZiAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHJlbGVhc2UgYnVmZmVyIG1lbW9yeSBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTEgbXNnX2NfYnVmX3NldF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgc2V0IHN0YXRlIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MiBtc2dfY19ldmVudF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHdhaXQgZm9yIGV2ZW50IHRvIGJlY29tZSBzaWduYWxlZCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTMgbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBtZW1vcnkgYWxsb2NhdGlvbiBvZiBuZWdhdGl2ZSBsZW5ndGggaXMgbm90IHN1cHBvcnRlZCIsCisJLyogIDU0IG1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogZGF0YSB0cmFuc2ZlciBvZiB6ZXJvIG9yIG5lZ2F0aXZlIHNpemUgaXMgbm90IHN1cHBvcnRlZCIsCisJLyogIDU1IG1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYWRkcmVzcyByYW5nZSBwYXJ0aWFsbHkgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBhbGxvY2F0aW9uIiwKKwkvKiAgNTYgbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcyAgICAgICovICJvZmZsb2FkIGVycm9yOiBzaXplIG9mIHRoZSBzb3VyY2UgJWQgZGlmZmVycyBmcm9tIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uICVkIiwKKwkvKiAgNTcgbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBvZmZsb2FkIGRhdGEgdHJhbnNmZXIgc3VwcG9ydHMgb25seSBhIHNpbmdsZSBjb250aWd1b3VzIG1lbW9yeSByYW5nZSBwZXIgdmFyaWFibGUiLAorCS8qICA1OCBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgJXMgc2V0dGluZzsgdXNlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUiLAorCS8qICA1OSBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRldmljZSBudW1iZXIgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUiLAorCS8qICA2MCBtc2dfY191bmtub3duX2JpbmFyeV90eXBlICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVuZXhwZWN0ZWQgZW1iZWRkZWQgdGFyZ2V0IGJpbmFyeSB0eXBlLCBleHBlY3RlZCBlaXRoZXIgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeSIsCisJLyogIDYxIG1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbW9yZSB0aGF0IG9uZSB0YXJnZXQgZXhlY3V0YWJsZSBmb3VuZCIsCisJLyogIDYyIG1zZ19jX25vX3RhcmdldF9leGUgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdGFyZ2V0IGV4ZWN1dGFibGUgaXMgbm90IGF2YWlsYWJsZSIsCisJLyogIDYzIG1zZ19jX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB0aW1lciBub2RlIiwKKwkvKiAgNjQgbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmtub3duIHRyYWNlIG5vZGUiLAorCS8qICA2NSBtc2dfY19yZXBvcnRfaG9zdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIkhPU1QiLAorCS8qICA2NiBtc2dfY19yZXBvcnRfbWljICAgICAgICAgICAgICAgICAgICAgICAgKi8gIk1JQyIsCisJLyogIDY3IG1zZ19jX3JlcG9ydF90aXRsZSAgICAgICAgICAgICAgICAgICAgICAqLyAidGltZXIgZGF0YSAgICAgICAoc2VjKSIsCisJLyogIDY4IG1zZ19jX3JlcG9ydF9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAqLyAiKHNlY29uZHMpIiwKKwkvKiAgNjkgbXNnX2NfcmVwb3J0X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICovICIoYnl0ZXMpIiwKKwkvKiAgNzAgbXNnX2NfcmVwb3J0X2NwdV90aW1lICAgICAgICAgICAgICAgICAgICovICJDUFUgVGltZSIsCisJLyogIDcxIG1zZ19jX3JlcG9ydF9taWNfdGltZSAgICAgICAgICAgICAgICAgICAqLyAiTUlDIFRpbWUiLAorCS8qICA3MiBtc2dfY19yZXBvcnRfdGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlRhZyIsCisJLyogIDczIG1zZ19jX3JlcG9ydF9mcm9tX2ZpbGUgICAgICAgICAgICAgICAgICAqLyAiT2ZmbG9hZCBmcm9tIGZpbGUiLAorCS8qICA3NCBtc2dfY19yZXBvcnRfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgKi8gIkZpbGUiLAorCS8qICA3NSBtc2dfY19yZXBvcnRfbGluZSAgICAgICAgICAgICAgICAgICAgICAgKi8gIkxpbmUiLAorCS8qICA3NiBtc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhICAgICAgICAgICAgKi8gIkNQVS0+TUlDIERhdGEiLAorCS8qICA3NyBtc2dfY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhICAgICAgICAgICAgKi8gIk1JQy0+Q1BVIERhdGEiLAorCS8qICA3OCBtc2dfY19yZXBvcnRfb2ZmbG9hZCAgICAgICAgICAgICAgICAgICAgKi8gIk9mZmxvYWQiLAorCS8qICA3OSBtc2dfY19yZXBvcnRfd190YWcgICAgICAgICAgICAgICAgICAgICAgKi8gIlRhZyAlZCIsCisJLyogIDgwIG1zZ19jX3JlcG9ydF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLyAiU3RhdGUiLAorCS8qICA4MSBtc2dfY19yZXBvcnRfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgKi8gIlN0YXJ0IHRhcmdldCIsCisJLyogIDgyIG1zZ19jX3JlcG9ydF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAqLyAiSW5pdGlhbGl6ZSIsCisJLyogIDgzIG1zZ19jX3JlcG9ydF9sb2dpY2FsX2NhcmQgICAgICAgICAgICAgICAqLyAibG9naWNhbCBjYXJkIiwKKwkvKiAgODQgbXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQgICAgICAgICAgICAgICovICJwaHlzaWNhbCBjYXJkIiwKKwkvKiAgODUgbXNnX2NfcmVwb3J0X3JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovICJSZWdpc3RlciBzdGF0aWMgZGF0YSB0YWJsZXMiLAorCS8qICA4NiBtc2dfY19yZXBvcnRfaW5pdF9mdW5jICAgICAgICAgICAgICAgICAgKi8gIlNldHVwIHRhcmdldCBlbnRyeSIsCisJLyogIDg3IG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QgICAgICAgICAgICAqLyAiQ3JlYXRlIGhvc3QgYnVmZmVyIiwKKwkvKiAgODggbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljICAgICAgICAgICAgICovICJDcmVhdGUgdGFyZ2V0IGJ1ZmZlciIsCisJLyogIDg5IG1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSAgICAgICAgICAqLyAiU2VuZCBwb2ludGVyIGRhdGEiLAorCS8qICA5MCBtc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEgICAgICAgICAgKi8gIkhvc3QtPnRhcmdldCBwb2ludGVyIGRhdGEiLAorCS8qICA5MSBtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhICAgICAgICAgKi8gIkdhdGhlciBjb3B5aW4gZGF0YSIsCisJLyogIDkyIG1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSAgICAgICAgICAgICAgICAqLyAiSG9zdC0+dGFyZ2V0IGNvcHlpbiBkYXRhIiwKKwkvKiAgOTMgbXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCAgICAgICAgICAgICAgICovICJTaWduYWwiLAorCS8qICA5NCBtc2dfY19yZXBvcnRfc2lnbmFsICAgICAgICAgICAgICAgICAgICAgKi8gInNpZ25hbCA6IiwKKwkvKiAgOTUgbXNnX2NfcmVwb3J0X3dhaXQgICAgICAgICAgICAgICAgICAgICAgICovICJ3YWl0cyAgOiIsCisJLyogIDk2IG1zZ19jX3JlcG9ydF9jb21wdXRlICAgICAgICAgICAgICAgICAgICAqLyAiRXhlY3V0ZSB0YXNrIG9uIHRhcmdldCIsCisJLyogIDk3IG1zZ19jX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSAgICAgICAqLyAiUmVjZWl2ZSBwb2ludGVyIGRhdGEiLAorCS8qICA5OCBtc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhICAgICAgKi8gIlRhcmdldC0+aG9zdCBwb2ludGVyIGRhdGEiLAorCS8qICA5OSBtc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMgICAgICAgICAgKi8gIlN0YXJ0IHRhcmdldCBlbnRyeSIsCisJLyogMTAwIG1zZ19jX3JlcG9ydF92YXIgICAgICAgICAgICAgICAgICAgICAgICAqLyAiVmFyIiwKKwkvKiAxMDEgbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEgICAgICAgICovICJTY2F0dGVyIGNvcHlpbiBkYXRhIiwKKwkvKiAxMDIgbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEgICAgICAgICovICJHYXRoZXIgY29weW91dCBkYXRhIiwKKwkvKiAxMDMgbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhICAgICAgICovICJTY2F0dGVyIGNvcHlvdXQgZGF0YSIsCisJLyogMTA0IG1zZ19jX3JlcG9ydF9jb3B5b3V0X2RhdGEgICAgICAgICAgICAgICAqLyAiVGFyZ2V0LT5ob3N0IGNvcHlvdXQgZGF0YSIsCisJLyogMTA1IG1zZ19jX3JlcG9ydF91bnJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLyAiVW5yZWdpc3RlciBkYXRhIHRhYmxlcyIsCisJLyogMTA2IG1zZ19jX3JlcG9ydF9kZXN0cm95ICAgICAgICAgICAgICAgICAgICAqLyAiRGVzdHJveSIsCisJLyogMTA3IG1zZ19jX3JlcG9ydF9teW9pbml0ICAgICAgICAgICAgICAgICAgICAqLyAiSW5pdGlhbGl6ZSBNWU8iLAorCS8qIDEwOCBtc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8gIlJlZ2lzdGVyIE1ZTyB0YWJsZXMiLAorCS8qIDEwOSBtc2dfY19yZXBvcnRfbXlvZmluaSAgICAgICAgICAgICAgICAgICAgKi8gIkZpbmFsaXplIE1ZTyIsCisJLyogMTEwIG1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCAgICAgICAgICAgICAqLyAiTUlDIE1ZTyBzaGFyZWQgdGFibGUgcmVnaXN0ZXIiLAorCS8qIDExMSBtc2dfY19yZXBvcnRfbWljX215b19mcHRyICAgICAgICAgICAgICAgKi8gIk1JQyBNWU8gZnB0ciB0YWJsZSByZWdpc3RlciIsCisJLyogMTEyIG1zZ19jX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MgICAgICAgICAgICAqLyAiTVlPIHNoYXJlZCBtYWxsb2MiLAorCS8qIDExMyBtc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSAgICAgICAgICAgICAgKi8gIk1ZTyBzaGFyZWQgZnJlZSIsCisJLyogMTE0IG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jICAgICAqLyAiTVlPIHNoYXJlZCBhbGlnbmVkIG1hbGxvYyIsCisJLyogMTE1IG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSAgICAgICAqLyAiTVlPIHNoYXJlZCBhbGlnbmVkIGZyZWUiLAorCS8qIDExNiBtc2dfY19yZXBvcnRfbXlvYWNxdWlyZSAgICAgICAgICAgICAgICAgKi8gIk1ZTyBhY3F1aXJlIiwKKwkvKiAxMTcgbXNnX2NfcmVwb3J0X215b3JlbGVhc2UgICAgICAgICAgICAgICAgICovICJNWU8gcmVsZWFzZSIsCisJLyogMTE4IG1zZ19jX3JlcG9ydF9ob3N0X3RvdGFsX29mZmxvYWRfdGltZSAgICAqLyAiaG9zdDogdG90YWwgb2ZmbG9hZCB0aW1lIiwKKwkvKiAxMTkgbXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSAgICAgICAgICAgICovICJob3N0OiBpbml0aWFsaXplIHRhcmdldCIsCisJLyogMTIwIG1zZ19jX3JlcG9ydF9ob3N0X3RhcmdldF9hY3F1aXJlICAgICAgICAqLyAiaG9zdDogYWNxdWlyZSB0YXJnZXQiLAorCS8qIDEyMSBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMgICAgICAgICAgICAgKi8gImhvc3Q6IHdhaXQgZGVwZW5kZW5jaWVzIiwKKwkvKiAxMjIgbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycyAgICAgICAgICovICJob3N0OiBzZXR1cCBidWZmZXJzIiwKKwkvKiAxMjMgbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycyAgICAgICAgICovICJob3N0OiBhbGxvY2F0ZSBidWZmZXJzIiwKKwkvKiAxMjQgbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfbWlzY19kYXRhICAgICAgICovICJob3N0OiBzZXR1cCBtaXNjX2RhdGEiLAorCS8qIDEyNSBtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciAgICAgKi8gImhvc3Q6IGFsbG9jYXRlIGJ1ZmZlciIsCisJLyogMTI2IG1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMgICAgICAgICAqLyAiaG9zdDogc2VuZCBwb2ludGVycyIsCisJLyogMTI3IG1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMgICAgICAgICAqLyAiaG9zdDogZ2F0aGVyIGlucHV0cyIsCisJLyogMTI4IG1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciAgICAqLyAiaG9zdDogbWFwIElOIGRhdGEgYnVmZmVyIiwKKwkvKiAxMjkgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIgICovICJob3N0OiB1bm1hcCBJTiBkYXRhIGJ1ZmZlciIsCisJLyogMTMwIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUgICAgICAgICAqLyAiaG9zdDogaW5pdGlhdGUgY29tcHV0ZSIsCisJLyogMTMxIG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSAgICAgICAgICAqLyAiaG9zdDogd2FpdCBjb21wdXRlIiwKKwkvKiAxMzIgbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyAgICovICJob3N0OiBpbml0aWF0ZSBwb2ludGVyIHJlYWRzIiwKKwkvKiAxMzMgbXNnX2NfcmVwb3J0X2hvc3Rfc2NhdHRlcl9vdXRwdXRzICAgICAgICovICJob3N0OiBzY2F0dGVyIG91dHB1dHMiLAorCS8qIDEzNCBtc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyICAgKi8gImhvc3Q6IG1hcCBPVVQgZGF0YSBidWZmZXIiLAorCS8qIDEzNSBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIgKi8gImhvc3Q6IHVubWFwIE9VVCBkYXRhIGJ1ZmZlciIsCisJLyogMTM2IG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyAgICAqLyAiaG9zdDogd2FpdCBwb2ludGVyIHJlYWRzIiwKKwkvKiAxMzcgbXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzICAgICAgICovICJob3N0OiBkZXN0cm95IGJ1ZmZlcnMiLAorCS8qIDEzOCBtc2dfY19yZXBvcnRfdGFyZ2V0X3RvdGFsX3RpbWUgICAgICAgICAgKi8gInRhcmdldDogdG90YWwgdGltZSIsCisJLyogMTM5IG1zZ19jX3JlcG9ydF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCAgICAqLyAidGFyZ2V0OiBzZXR1cCBvZmZsb2FkIGRlc2NyaXB0b3IiLAorCS8qIDE0MCBtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwICAgICAgICAgKi8gInRhcmdldDogZW50cnkgbG9va3VwIiwKKwkvKiAxNDEgbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX3RpbWUgICAgICAgICAgICovICJ0YXJnZXQ6IGVudHJ5IHRpbWUiLAorCS8qIDE0MiBtc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzICAgICAgKi8gInRhcmdldDogc2NhdHRlciBpbnB1dHMiLAorCS8qIDE0MyBtc2dfY19yZXBvcnRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyAgICAgKi8gInRhcmdldDogYWRkIGJ1ZmZlciByZWZlcmVuY2UiLAorCS8qIDE0NCBtc2dfY19yZXBvcnRfdGFyZ2V0X2NvbXB1dGUgICAgICAgICAgICAgKi8gInRhcmdldDogY29tcHV0ZSIsCisJLyogMTQ1IG1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMgICAgICAqLyAidGFyZ2V0OiBnYXRoZXIgb3V0cHV0cyIsCisJLyogMTQ2IG1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyAqLyAidGFyZ2V0OiByZW1vdmUgYnVmZmVyIHJlZmVyZW5jZSIsCisJLyogMTQ3IG1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyICAgICAgICAgICAqLyAibnVtYmVyIG9mIGhvc3QgdGhyZWFkcyBkb2luZyBvZmZsb2FkIGV4Y2VlZHMgbWF4aW11bSBvZiAlZCIsCisJLyogMTQ4IG1zZ19jX3Jhbmdlc19kb250X21hdGNoICAgICAgICAgICAgICAgICAqLyAicmFuZ2VzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3QgbWF0Y2ggdG9nZXRoZXIiLAorCS8qIDE0OSBtc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyICAgICAgICAgICAgICAgKi8gImluc3VmZmljaWVudCBkZXN0aW5hdGlvbiBtZW1vcnkgdG8gdHJhbnNmZXIgc291cmNlIiwKKwkvKiAxNTAgbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSAgICAgICAgICAgICovICJhIG5vbi1jb250aWd1b3VzIHNsaWNlIG1heSBiZSB0YWtlbiBvZiBjb250aWd1b3VzIGFycmF5cyBvbmx5IiwKKwkvKiAxNTEgbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCAgICAgICAgICAgICovICJudW1iZXIgb2YgJXMgZWxlbWVudHMgaXMgbGVzcyB0aGFuIGRlc2NyaWJlZCBieSB0aGUgc291cmNlIiwKK307CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAgYi9yYzEvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyZTRkZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9taWNfbGliLmY5MApAQCAtMCwwICsxLDQ0MSBAQAorIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISAqIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IHRoZSBJbnRlbChyKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgZnJlZSBmb3JtIEZvcnRyYW4gc291cmNlIC0gc2hvdWxkIGJlIG5hbWVkIC5mOTAKKyEgbGluZXMgYXJlIGxvbmdlciB0aGFuIDcyIGNoYXJhY3RlcnMKKworbW9kdWxlIG1pY19saWIKK3VzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworaW50ZWdlciwgcGFyYW1ldGVyOjogdGFyZ2V0X21pYz0yCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiBkZWZhdWx0X3RhcmdldF90eXBlPXRhcmdldF9taWMKK2ludGVnZXIsIHBhcmFtZXRlcjo6IGRlZmF1bHRfdGFyZ2V0X251bWJlcj0wCisKK2VudW0sIGJpbmQoQykKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfU1VDQ0VTUyAgPSAwCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX0RJU0FCTEVEICAgICAgICAgICEgb2ZmbG9hZCBpcyBkaXNhYmxlZAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9VTkFWQUlMQUJMRSAgICAgICAhIGNhcmQgaXMgbm90IGF2YWlsYWJsZQorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9PVVRfT0ZfTUVNT1JZICAgICAhIG5vdCBlbm91Z2ggbWVtb3J5IG9uIGRldmljZQorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9QUk9DRVNTX0RJRUQgICAgICAhIHRhcmdldCBwcm9jZXNzIGhhcyBkaWVkCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX0VSUk9SICAgICAgICAgICAgICEgdW5zcGVjaWZpZWQgZXJyb3IKK2VuZCBlbnVtCisKK3R5cGUsIGJpbmQgKEMpIDo6IG9mZmxvYWRfc3RhdHVzCisgICAgaW50ZWdlcihraW5kPWNfaW50KSAgICA6OiAgcmVzdWx0ICAgICAgICAgID0gT0ZGTE9BRF9ESVNBQkxFRAorICAgIGludGVnZXIoa2luZD1jX2ludCkgICAgOjogIGRldmljZV9udW1iZXIgICA9IC0xCisgICAgaW50ZWdlcihraW5kPWNfc2l6ZV90KSA6OiAgZGF0YV9zZW50ICAgICAgID0gMAorICAgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogIGRhdGFfcmVjZWl2ZWQgICA9IDAKK2VuZCB0eXBlIG9mZmxvYWRfc3RhdHVzCisKK2ludGVyZmFjZQorZnVuY3Rpb24gb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXMiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKyFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworCitmdW5jdGlvbiBvZmZsb2FkX3NpZ25hbGVkKHRhcmdldF9udW1iZXIsIHNpZ25hbCkgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9zaWduYWxlZCIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9zaWduYWxlZAorICBpbXBvcnQgOjogY19pbnQsIGNfaW50NjRfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSA6OiBvZmZsb2FkX3NpZ25hbGVkCisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnQ2NF90KSwgdmFsdWUgOjogc2lnbmFsCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfc2lnbmFsZWQKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX3NpZ25hbGVkCisKK3N1YnJvdXRpbmUgb2ZmbG9hZF9yZXBvcnQodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX3JlcG9ydCIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9yZXBvcnQKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB2YWwKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9yZXBvcnQKK2VuZCBzdWJyb3V0aW5lIG9mZmxvYWRfcmVwb3J0CisKK2Z1bmN0aW9uIG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorCitmdW5jdGlvbiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlciIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKworISBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGhyZWFkcykgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9udW1fcHJvY3NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9keW5hbWljX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90aHJlYWRzKSAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pY190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9keW5hbWljX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9keW5hbWljX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9keW5hbWljX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X25lc3RlZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBuZXN0ZWQKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X25lc3RlZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbmVzdGVkX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZF90YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9zY2hlZHVsZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBraW5kLCBtb2RpZmllcgorZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZV90YXJnZXQKKworc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGtpbmQsIG1vZGlmaWVyCitlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldAorCishIGxvY2sgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2luaXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9pbml0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX3NldF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfdW5zZXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrX3RhcmdldAorCitmdW5jdGlvbiBvbXBfdGVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Rlc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF90ZXN0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9ja190YXJnZXQKKworISBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldAorCishIGttcCBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9zdGFja3NpemVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHNpemUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgdGltZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBtb2RlCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfbGlicmFyeV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfbGlicmFyeV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfbGlicmFyeV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5X3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9kZWZhdWx0c190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfY2hhcgorIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IGRlZmF1bHRzKCopCisgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldAorCishIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQKKworc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldAorCitmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9hZmZpbml0eV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgcHJvYworICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgcHJvYworICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2VuZCBpbnRlcmZhY2UKK2VuZCBtb2R1bGUgbWljX2xpYgpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWQuaCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5MTRiNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkLmgKQEAgLTAsMCArMSw0NzQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgT2ZmbG9hZCBBUEkuCisgKi8KKworI2lmbmRlZiBPRkZMT0FEX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9IX0lOQ0xVREVECisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFRBUkdFVF9BVFRSSUJVVEUgX19kZWNsc3BlYyh0YXJnZXQobWljKSkKKworLyoKKyAqICBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKyAqLwordHlwZWRlZiBlbnVtIFRBUkdFVF9UWVBFIHsKKyAgICBUQVJHRVRfTk9ORSwgICAgLyogVW5kZWZpbmUgdGFyZ2V0ICovCisgICAgVEFSR0VUX0hPU1QsICAgIC8qIEhvc3QgdXNlZCBhcyB0YXJnZXQgKi8KKyAgICBUQVJHRVRfTUlDICAgICAgLyogTUlDIHRhcmdldCAqLworfSBUQVJHRVRfVFlQRTsKKworLyoKKyAqICBUaGUgZGVmYXVsdCB0YXJnZXQgdHlwZS4KKyAqLworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9UWVBFIFRBUkdFVF9NSUMKKworLyoKKyAqICBUaGUgZGVmYXVsdCB0YXJnZXQgbnVtYmVyLgorICovCisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX05VTUJFUiAwCisKKy8qCisgKiAgT2ZmbG9hZCBzdGF0dXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgT0ZGTE9BRF9TVUNDRVNTID0gMCwKKyAgICBPRkZMT0FEX0RJU0FCTEVELCAgICAgICAgICAgICAgIC8qIG9mZmxvYWQgaXMgZGlzYWJsZWQgKi8KKyAgICBPRkZMT0FEX1VOQVZBSUxBQkxFLCAgICAgICAgICAgIC8qIGNhcmQgaXMgbm90IGF2YWlsYWJsZSAqLworICAgIE9GRkxPQURfT1VUX09GX01FTU9SWSwgICAgICAgICAgLyogbm90IGVub3VnaCBtZW1vcnkgb24gZGV2aWNlICovCisgICAgT0ZGTE9BRF9QUk9DRVNTX0RJRUQsICAgICAgICAgICAvKiB0YXJnZXQgcHJvY2VzcyBoYXMgZGllZCAqLworICAgIE9GRkxPQURfRVJST1IgICAgICAgICAgICAgICAgICAgLyogdW5zcGVjaWZpZWQgZXJyb3IgKi8KK30gX09mZmxvYWRfcmVzdWx0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgX09mZmxvYWRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAvKiByZXN1bHQsIHNlZSBhYm92ZSAqLworICAgIGludCAgICAgICAgICAgICBkZXZpY2VfbnVtYmVyOyAgLyogZGV2aWNlIG51bWJlciAqLworICAgIHNpemVfdCAgICAgICAgICBkYXRhX3NlbnQ7ICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gdGhlIHRhcmdldCAqLworICAgIHNpemVfdCAgICAgICAgICBkYXRhX3JlY2VpdmVkOyAgLyogbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGJ5IGhvc3QgKi8KK30gX09mZmxvYWRfc3RhdHVzOworCisjZGVmaW5lIE9GRkxPQURfU1RBVFVTX0lOSVQoeCkgXAorICAgICgoeCkucmVzdWx0ID0gT0ZGTE9BRF9ESVNBQkxFRCkKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19JTklUSUFMSVpFUiBcCisgICAgeyBPRkZMT0FEX0RJU0FCTEVELCAtMSwgMCwgMCB9CisKKy8qIE9mZmxvYWQgcnVudGltZSBpbnRlcmZhY2VzICovCisKK2V4dGVybiBpbnQgX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXModm9pZCk7CitleHRlcm4gaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpOworZXh0ZXJuIGludCBfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcih2b2lkKTsKKworZXh0ZXJuIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHZvaWQgKnB0cik7CisKK2V4dGVybiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CitleHRlcm4gdm9pZCAgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpOworCitleHRlcm4gaW50IF9PZmZsb2FkX3NpZ25hbGVkKGludCBpbmRleCwgdm9pZCAqc2lnbmFsKTsKK2V4dGVybiB2b2lkIF9PZmZsb2FkX3JlcG9ydChpbnQgdmFsKTsKKworLyogT3Blbk1QIEFQSSAqLworCitleHRlcm4gdm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pOworZXh0ZXJuIGludCAgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKTsKK2V4dGVybiBpbnQgIG9tcF9nZXRfbnVtX2RldmljZXModm9pZCk7CisKKy8qIE9wZW5NUCBBUEkgd3JhcHBlcnMgKi8KKworLyogU2V0IG51bV90aHJlYWRzIG9uIHRhcmdldCAqLworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCisvKiBHZXQgbWF4X3RocmVhZHMgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKKy8qIEdldCBudW1fcHJvY3MgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBTZXQgZHluYW1pYyBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCisvKiBHZXQgZHluYW1pYyBmcm9tIHRhcmdldCAqLworZXh0ZXJuIGludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBTZXQgbmVzdGVkIG9uIHRhcmdldCAqLworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBuZXN0ZWQKKyk7CisKKy8qIEdldCBuZXN0ZWQgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3Qga2luZCwKKyAgICBpbnQgbW9kaWZpZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKyk7CisKKy8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wX2xvY2tfdCBsb2NrOworfSBvbXBfbG9ja190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiBpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKKy8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcF9uZXN0X2xvY2tfdCBsb2NrOworfSBvbXBfbmVzdF9sb2NrX3RhcmdldF90OworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiBpbnQgb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNpemUKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKTsKKworZXh0ZXJuIHNpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispOworCitleHRlcm4gaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBtb2RlCispOworCitleHRlcm4gaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNoYXIgY29uc3QgKmRlZmF1bHRzCispOworCisvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190IG1hc2s7Cit9IGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90OworCitleHRlcm4gdm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gdm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIGludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworCisvKiBOYW1lc3BhY2UgZm9yIHRoZSBzaGFyZWRfYWxsb2NhdG9yLiAqLworbmFtZXNwYWNlIF9fb2ZmbG9hZCB7CisgIC8qIFRoaXMgZm9sbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBmb3Igc3RkOjphbGxvY2F0b3IuICovCisgIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHRlbXBsYXRlLiAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvcjsKKworICAvKiBTcGVjaWFsaXphdGlvbiBmb3Igc2hhcmVkX2FsbG9jYXRvcjx2b2lkPi4gKi8KKyAgdGVtcGxhdGUgPD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgKnBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2b2lkICpjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc3RydWN0IHJlYmluZCB7IHR5cGVkZWYgc2hhcmVkX2FsbG9jYXRvcjxVPiBvdGhlcjsgfTsKKyAgfTsKKworICAvKiBEZWZpbml0aW9uIG9mIHNoYXJlZF9hbGxvY2F0b3I8VD4uICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBzaGFyZWRfYWxsb2NhdG9yIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAqcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IFQgICAqY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQgICAgICAgICAmcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgVCAgICZjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0cnVjdCByZWJpbmQgeyB0eXBlZGVmIHNoYXJlZF9hbGxvY2F0b3I8VT4gb3RoZXI7IH07CisgICAgc2hhcmVkX2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisgICAgc2hhcmVkX2FsbG9jYXRvcihjb25zdCBzaGFyZWRfYWxsb2NhdG9yJikgdGhyb3coKSB7IH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc2hhcmVkX2FsbG9jYXRvcihjb25zdCBzaGFyZWRfYWxsb2NhdG9yPFU+JikgdGhyb3coKSB7IH0KKyAgICB+c2hhcmVkX2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisgICAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSB4KSBjb25zdCB7IHJldHVybiAmeDsgfQorICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKyAgICBwb2ludGVyIGFsbG9jYXRlKAorICAgICAgc2l6ZV90eXBlLCBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbik7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSB7CisgICAgICByZXR1cm4gc2l6ZV90eXBlKC0xKS9zaXplb2YoVCk7CisgICAgfSAvKiBtYXhfc2l6ZSAqLworICAgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgcCwgY29uc3QgVCYgYXJnKSB7CisgICAgICA6Om5ldyAocCkgVChhcmcpOworICAgIH0gLyogY29uc3RydWN0ICovCisgICAgdm9pZCBkZXN0cm95KHBvaW50ZXIgcCkgeworICAgICAgcC0+flQoKTsKKyAgICB9IC8qIGRlc3Ryb3kgKi8KKyAgfTsKKworICAvKiBEZWZpbml0aW9uIGZvciBhbGxvY2F0ZS4gKi8KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHR5cGVuYW1lIHNoYXJlZF9hbGxvY2F0b3I8VD46OnBvaW50ZXIKKyAgc2hhcmVkX2FsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2hhcmVkX2FsbG9jYXRvcjxUPjo6c2l6ZV90eXBlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIpIHsKKyAgICAvKiBBbGxvY2F0ZSBmcm9tIHNoYXJlZCBtZW1vcnkuICovCisgICAgdm9pZCAqcHRyID0gX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzKnNpemVvZihUKSk7CisgICAgaWYgKHB0ciA9PSAwKSBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHBvaW50ZXI+KHB0cik7CisgIH0gLyogYWxsb2NhdGUgKi8KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdm9pZCBzaGFyZWRfYWxsb2NhdG9yPFQ+OjpkZWFsbG9jYXRlKHBvaW50ZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9hbGxvY2F0b3I8VD46OnNpemVfdHlwZSkgeworICAgIC8qIEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUocCk7CisgIH0gLyogZGVhbGxvY2F0ZSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMT4gJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDI+ICYpIHRocm93KCkgeworICAgIHJldHVybiB0cnVlOworICB9ICAvKiBvcGVyYXRvcj09ICovCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QxPiAmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMj4gJikgdGhyb3coKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9ICAvKiBvcGVyYXRvciE9ICovCit9ICAvKiBfX29mZmxvYWQgKi8KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogT0ZGTE9BRF9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgxYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPG1tX21hbGxvYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisKK3ZvaWQgX19kdW1wX2J5dGVzKAorICAgIGludCB0cmFjZV9sZXZlbCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGludCBsZW4KKykKK3sKKyAgICBpZiAoY29uc29sZV9lbmFibGVkID4gdHJhY2VfbGV2ZWwpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYXJyID0gKGNvbnN0IHVpbnQ4X3QqKSBkYXRhOworICAgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICAgICAgY2hhciAqYnVmZmVycDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICBidWZmZXJwID0gYnVmZmVyOworICAgICAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVycCwgIiUwMngiLCAqYXJyKyspOworICAgICAgICAgICAgYnVmZmVycCArPSAyOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmICgoY291bnQmMykgPT0gMCkgeworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVycCwgIiAiKTsKKyAgICAgICAgICAgICAgICBidWZmZXJwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvdW50JjYzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSh0cmFjZV9sZXZlbCwgIiVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnAgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSh0cmFjZV9sZXZlbCwgIiVzXG4iLCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworLy8gVGhlIE1hcnNoYWxsZXIgYW5kIGFzc29jaWF0ZWQgcm91dGluZXMKKwordm9pZCBNYXJzaGFsbGVyOjpzZW5kX2RhdGEoCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQ2NF90IGxlbmd0aAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgInNlbmRfZGF0YSglcCwgJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW5ndGgpOworICAgIG1lbWNweShidWZmZXJfcHRyLCBkYXRhLCAoc2l6ZV90KWxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCit2b2lkIE1hcnNoYWxsZXI6OnJlY2VpdmVfZGF0YSgKKyAgICB2b2lkICpkYXRhLAorICAgIGludDY0X3QgbGVuZ3RoCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAicmVjZWl2ZV9kYXRhKCVwLCAlbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGxlbmd0aCk7CisgICAgbWVtY3B5KGRhdGEsIGJ1ZmZlcl9wdHIsIChzaXplX3QpbGVuZ3RoKTsKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIFNlbmQgZnVuY3Rpb24gcG9pbnRlcgordm9pZCBNYXJzaGFsbGVyOjpzZW5kX2Z1bmNfcHRyKAorICAgIGNvbnN0IHZvaWQqIGRhdGEKKykKK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKworICAgIGlmIChkYXRhICE9IDApIHsKKyAgICAgICAgbmFtZSA9IF9fb2ZmbG9hZF9mdW5jcy5maW5kX25hbWUoZGF0YSk7CisgICAgICAgIGlmIChuYW1lID09IDApIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgICAgICBfX29mZmxvYWRfZnVuY3MuZHVtcCgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCisKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zZW5kX2Z1bmNfcHRyLCBkYXRhKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmZmVyX3B0ciwgbmFtZSwgbGVuZ3RoKTsKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIFJlY2VpdmUgZnVuY3Rpb24gcG9pbnRlcgordm9pZCBNYXJzaGFsbGVyOjpyZWNlaXZlX2Z1bmNfcHRyKAorICAgIGNvbnN0IHZvaWQqKiBkYXRhCispCit7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisKKyAgICBuYW1lID0gKGNvbnN0IGNoYXIqKSBidWZmZXJfcHRyOworICAgIGlmIChuYW1lWzBdICE9ICdcMCcpIHsKKyAgICAgICAgKmRhdGEgPSBfX29mZmxvYWRfZnVuY3MuZmluZF9hZGRyKG5hbWUpOworICAgICAgICBpZiAoKmRhdGEgPT0gMCkgeworI2lmIE9GRkxPQURfREVCVUcgPiAwCisgICAgICAgICAgICBpZiAoY29uc29sZV9lbmFibGVkID4gMikgeworICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9mdW5jcy5kdW1wKCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRyA+IDAKKworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlY2VpdmVfZnVuY19wdHIsIG5hbWUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggPSBzdHJsZW4obmFtZSkgKyAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKmRhdGEgPSAwOworICAgICAgICBsZW5ndGggPSAxOworICAgIH0KKworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKworLy8gRW5kIG9mIHRoZSBNYXJzaGFsbGVyIGFuZCBhc3NvY2lhdGVkIHJvdXRpbmVzCisKK2V4dGVybiB2b2lkICpPRkZMT0FEX01BTExPQygKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgYWxpZ24KKykKK3sKKyAgICB2b2lkICpwdHI7CisgICAgaW50ICAgZXJyOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisKKyAgICBpZiAoYWxpZ24gPCBzaXplb2Yodm9pZCopKSB7CisgICAgICAgIGFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICB9CisKKyAgICBwdHIgPSBfbW1fbWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICBpZiAocHRyID09IE5VTEwpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfbWFsbG9jLCBzaXplLCBhbGlnbik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgcmV0dXJuZWQgJXBcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgcmV0dXJuIHB0cjsKK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYjhiYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgcGFydHMgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSBjb21tb24gdG8gaG9zdCBhbmQgdGFyZ2V0CisqLworCisjaWZuZGVmIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90cmFjZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlICJjZWFuX3V0aWwuaCIKKyNpbmNsdWRlICJkdl91dGlsLmgiCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8vIFRoZSBkZWJ1ZyByb3V0aW5lcworCisvLyBIb3N0IGNvbnNvbGUgYW5kIGZpbGUgbG9nZ2luZworZXh0ZXJuIGludCBjb25zb2xlX2VuYWJsZWQ7CitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworCisjZGVmaW5lIE9GRkxPQURfRE9fVFJBQ0UgKG9mZmxvYWRfcmVwb3J0X2xldmVsID09IDMpCisKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXg7CitleHRlcm4gaW50IG9mZmxvYWRfbnVtYmVyOworI2lmICFIT1NUX0xJQlJBUlkKK2V4dGVybiBpbnQgbWljX2luZGV4OworI2VuZGlmCisKKyNpZiBIT1NUX0xJQlJBUlkKK3ZvaWQgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhKTsKK3ZvaWQgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhKTsKK3ZvaWQgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSk7Cit2b2lkIE9mZmxvYWRfVGltZXJfUHJpbnQodm9pZCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIFwKKyAgICAgICAgX19zeW5jX2FkZF9hbmRfZmV0Y2goJm9mZmxvYWRfbnVtYmVyLCAxKQorI2Vsc2UKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgXAorICAgICAgICBfSW50ZXJsb2NrZWRJbmNyZW1lbnQocmVpbnRlcnByZXRfY2FzdDxsb25nKj4oJm9mZmxvYWRfbnVtYmVyKSkKKyNlbmRpZgorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfVEFHX1BSRUZJWCgpIFwKKyAgICAgICAgcHJpbnRmKCIlczogICIsIHByZWZpeCk7CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19QUklOVF9QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXM6ICAiLCBwcmVmaXgpOworI2Vsc2UKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19QUklOVF9QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXMlZDogICIsIHByZWZpeCwgbWljX2luZGV4KTsKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworI2RlZmluZSBPRkZMT0FEX1RSQUNFKHRyYWNlX2xldmVsLCAuLi4pICBcCisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+PSB0cmFjZV9sZXZlbCkgeyBcCisgICAgICAgIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCk7IFwKKyAgICAgICAgcHJpbnRmKF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfVFJBQ0UobGV2ZWwsIC4uLikgXAorICAgIE9GRkxPQURfVFJBQ0UobGV2ZWwsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUKGxldmVsLCBvZmZsb2FkX251bWJlciwgc3RhZ2UsIC4uLikgXAorICAgIGlmIChPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgb2ZmbG9hZF9zdGFnZV9wcmludChzdGFnZSwgb2ZmbG9hZF9udW1iZXIsIF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKGxldmVsLCBvZmZsb2FkX251bWJlciwgc3RhZ2UsIC4uLikgXAorICAgIGlmIChPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgb2ZmbG9hZF9zdGFnZV9wcmludChzdGFnZSwgb2ZmbG9hZF9udW1iZXIsIF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9IFwKKyAgICBpZiAoIU9GRkxPQURfRE9fVFJBQ0UpIHsgXAorICAgICAgICBPRkZMT0FEX1RSQUNFKGxldmVsLCBfX1ZBX0FSR1NfXykgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMobGV2ZWwsIGEsIGIpIFwKKyAgICBfX2R1bXBfYnl0ZXMobGV2ZWwsIGEsIGIpCisKK2V4dGVybiB2b2lkIF9fZHVtcF9ieXRlcygKKyAgICBpbnQgbGV2ZWwsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQgbGVuCispOworCisjZWxzZQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfTE9HKGxldmVsLCAuLi4pCisjZGVmaW5lIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUyhsZXZlbCwgYSwgYikKKworI2VuZGlmCisKKy8vIFJ1bnRpbWUgaW50ZXJmYWNlCisKKyNkZWZpbmUgT0ZGTE9BRF9QUkVGSVgoYSkgX19vZmZsb2FkXyMjYQorCisjZGVmaW5lIE9GRkxPQURfTUFMTE9DICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgobWFsbG9jKQorI2RlZmluZSBPRkZMT0FEX0ZSRUUoYSkgICAgICAgICAgIF9tbV9mcmVlKGEpCisKKy8vIEZvcndhcmQgZnVuY3Rpb25zCisKK2V4dGVybiB2b2lkICpPRkZMT0FEX01BTExPQyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKTsKKworLy8gVGhlIE1hcnNoYWxsZXIKKworLy8hIFxlbnVtIEluZGljYXRvciBmb3IgdGhlIHR5cGUgb2YgZW50cnkgb24gYW4gb2ZmbG9hZCBpdGVtIGxpc3QuCitlbnVtIE9mZmxvYWRJdGVtVHlwZSB7CisgICAgY19kYXRhID0gICAxLCAgICAgICAvLyE8IFBsYWluIGRhdGEKKyAgICBjX2RhdGFfcHRyLCAgICAgICAgIC8vITwgUG9pbnRlciBkYXRhCisgICAgY19mdW5jX3B0ciwgICAgICAgICAvLyE8IEZ1bmN0aW9uIHBvaW50ZXIKKyAgICBjX3ZvaWRfcHRyLCAgICAgICAgIC8vITwgdm9pZCoKKyAgICBjX3N0cmluZ19wdHIsICAgICAgIC8vITwgQyBzdHJpbmcKKyAgICBjX2R2LCAgICAgICAgICAgICAgIC8vITwgRG9wZSB2ZWN0b3IgdmFyaWFibGUKKyAgICBjX2R2X2RhdGEsICAgICAgICAgIC8vITwgRG9wZS12ZWN0b3IgZGF0YQorICAgIGNfZHZfZGF0YV9zbGljZSwgICAgLy8hPCBEb3BlLXZlY3RvciBkYXRhJ3Mgc2xpY2UKKyAgICBjX2R2X3B0ciwgICAgICAgICAgIC8vITwgRG9wZS12ZWN0b3IgdmFyaWFibGUgcG9pbnRlcgorICAgIGNfZHZfcHRyX2RhdGEsICAgICAgLy8hPCBEb3BlLXZlY3RvciBwb2ludGVyIGRhdGEKKyAgICBjX2R2X3B0cl9kYXRhX3NsaWNlLC8vITwgRG9wZS12ZWN0b3IgcG9pbnRlciBkYXRhJ3Mgc2xpY2UKKyAgICBjX2NlYW5fdmFyLCAgICAgICAgIC8vITwgQ0VBTiB2YXJpYWJsZQorICAgIGNfY2Vhbl92YXJfcHRyLCAgICAgLy8hPCBQb2ludGVyIHRvIENFQU4gdmFyaWFibGUKKyAgICBjX2RhdGFfcHRyX2FycmF5LCAgIC8vITwgUG9pbnRlciB0byBkYXRhIHBvaW50ZXIgYXJyYXkKKyAgICBjX2Z1bmNfcHRyX2FycmF5LCAgIC8vITwgUG9pbnRlciB0byBmdW5jdGlvbiBwb2ludGVyIGFycmF5CisgICAgY192b2lkX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gdm9pZCogcG9pbnRlciBhcnJheQorICAgIGNfc3RyaW5nX3B0cl9hcnJheSAgLy8hPCBQb2ludGVyIHRvIGNoYXIqIHBvaW50ZXIgYXJyYXkKK307CisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfUFRSKHQpICgodCkgPT0gY19zdHJpbmdfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kYXRhX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfY2Vhbl92YXJfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdl9wdHIpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfU0NBTEFSKHQpICgodCkgPT0gY19kYXRhIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY192b2lkX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfY2Vhbl92YXIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2KQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX0RWX0RBVEEodCkgKCh0KSA9PSBjX2R2X2RhdGEgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdl9wdHJfZGF0YSkKKworI2RlZmluZSBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHQpICgodCkgPT0gY19kdl9kYXRhX3NsaWNlIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyX2RhdGFfc2xpY2UpCisKKworLy8hIFxlbnVtIFNwZWNpZnkgZGlyZWN0aW9uIHRvIGNvcHkgb2ZmbG9hZGVkIHZhcmlhYmxlLgorZW51bSBPZmZsb2FkUGFyYW1ldGVyVHlwZSB7CisgICAgY19wYXJhbWV0ZXJfdW5rbm93biA9IC0xLCAvLyE8IFVua25vd24gY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfbm9jb3B5LCAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAibm9jb3B5IiBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9pbiwgICAgICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJpbiIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfb3V0LCAgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAib3V0IiBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9pbm91dCAgICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJpbm91dCIgY2xhdXNlCit9OworCisvLyEgQW4gT2ZmbG9hZCBWYXJpYWJsZSBkZXNjcmlwdG9yCitzdHJ1Y3QgVmFyRGVzYyB7CisgICAgLy8hIE9mZmxvYWRJdGVtVHlwZXMgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZHN0IDogNDsgLy8hPCBPZmZsb2FkSXRlbVR5cGUgb2YgZGVzdGluYXRpb24KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3JjIDogNDsgLy8hPCBPZmZsb2FkSXRlbVR5cGUgb2Ygc291cmNlCisgICAgICAgIH07CisgICAgICAgIHVpbnQ4X3QgYml0czsKKyAgICB9IHR5cGU7CisKKyAgICAvLyEgT2ZmbG9hZFBhcmFtZXRlclR5cGUgdGhhdCBkZXNjcmliZXMgZGlyZWN0aW9uIG9mIGRhdGEgdHJhbnNmZXIKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGluICA6IDE7IC8vITwgU2V0IGlmIElOIG9yIElOT1VUCisgICAgICAgICAgICB1aW50OF90IG91dCA6IDE7IC8vITwgU2V0IGlmIE9VVCBvciBJTk9VVAorICAgICAgICB9OworICAgICAgICB1aW50OF90IGJpdHM7CisgICAgfSBkaXJlY3Rpb247CisKKyAgICB1aW50OF90IGFsbG9jX2lmOyAgICAgICAgLy8hPCBhbGxvY19pZiBtb2RpZmllciB2YWx1ZQorICAgIHVpbnQ4X3QgZnJlZV9pZjsgICAgICAgICAvLyE8IGZyZWVfaWYgbW9kaWZpZXIgdmFsdWUKKyAgICB1aW50MzJfdCBhbGlnbjsgICAgICAgICAgLy8hPCBNSUMgYWxpZ25tZW50IHJlcXVlc3RlZCBmb3IgcG9pbnRlciBkYXRhCisgICAgLy8hIE5vdCB1c2VkIGJ5IGNvbXBpbGVyOyBzZXQgdG8gMAorICAgIC8qISBVc2VkIGJ5IHJ1bnRpbWUgYXMgb2Zmc2V0IHRvIGRhdGEgZnJvbSBzdGFydCBvZiBNSUMgYnVmZmVyICovCisgICAgdWludDMyX3QgbWljX29mZnNldDsKKyAgICAvLyEgRmxhZ3MgZGVzY3JpYmluZyB0aGlzIHZhcmlhYmxlCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgLy8hIHNvdXJjZSB2YXJpYWJsZSBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGF0aWMgOiAxOworICAgICAgICAgICAgLy8hIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGhhcyBwZXJzaXN0ZW50IHN0b3JhZ2UKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YXRpY19kc3RuIDogMTsKKyAgICAgICAgICAgIC8vISBoYXMgbGVuZ3RoIGZvciBjX2R2ICYmIGNfZHZfcHRyCisgICAgICAgICAgICB1aW50MzJfdCBoYXNfbGVuZ3RoIDogMTsKKyAgICAgICAgICAgIC8vISBwZXJzaXN0ZWQgbG9jYWwgc2NhbGFyIGlzIGluIHN0YWNrIGJ1ZmZlcgorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhY2tfYnVmIDogMTsKKyAgICAgICAgICAgIC8vISBidWZmZXIgYWRkcmVzcyBpcyBzZW50IGluIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfYWRkciA6IDE7CisgICAgICAgICAgICAvLyEgYWxsb2MgZGlzcGxhY2VtZW50IGlzIHNlbnQgaW4gZGF0YQorICAgICAgICAgICAgdWludDMyX3QgYWxsb2NfZGlzcCA6IDE7CisgICAgICAgICAgICAvLyEgc291cmNlIGRhdGEgaXMgbm9uY29udGlndW91cworICAgICAgICAgICAgdWludDMyX3QgaXNfbm9uY29udF9zcmMgOiAxOworICAgICAgICAgICAgLy8hIGRlc3RpbmF0aW9uIGRhdGEgaXMgbm9uY29udGlndW91cworICAgICAgICAgICAgdWludDMyX3QgaXNfbm9uY29udF9kc3QgOiAxOworICAgICAgICB9OworICAgICAgICB1aW50MzJfdCBiaXRzOworICAgIH0gZmxhZ3M7CisgICAgLy8hIE5vdCB1c2VkIGJ5IGNvbXBpbGVyOyBzZXQgdG8gMAorICAgIC8qISBVc2VkIGJ5IHJ1bnRpbWUgYXMgb2Zmc2V0IHRvIGJhc2UgZnJvbSBkYXRhIHN0b3JlZCBpbiBhIGJ1ZmZlciAqLworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIC8vISBFbGVtZW50IGJ5dGUtc2l6ZSBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCisgICAgLyohIEZvciBkb3BlLXZlY3RvciwgdGhlIHNpemUgb2YgdGhlIGRvcGUtdmVjdG9yICAgICAgKi8KKyAgICBpbnQ2NF90IHNpemU7CisgICAgdW5pb24geworICAgICAgICAvLyEgU2V0IHRvIDAgZm9yIGFycmF5IGV4cHJlc3Npb25zIGFuZCBkb3BlLXZlY3RvcnMKKyAgICAgICAgLyohIFNldCB0byAxIGZvciBzY2FsYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiEgU2V0IHRvIHZhbHVlIG9mIGxlbmd0aCBtb2RpZmllciBmb3IgcG9pbnRlcnMgICovCisgICAgICAgIGludDY0X3QgY291bnQ7CisgICAgICAgIC8vISBEaXNwbGFjZW1lbnQgbm90IHVzZWQgYnkgY29tcGlsZXIKKyAgICAgICAgaW50NjRfdCBkaXNwOworICAgIH07CisKKyAgICAvLyEgVGhpcyBmaWVsZCBub3QgdXNlZCBieSBPcGVuTVAgNC4wCisgICAgLyohIFRoZSBhbGxvYyBzZWN0aW9uIGV4cHJlc3Npb24gaW4gI3ByYWdtYSBvZmZsb2FkICAgKi8KKyAgICB1bmlvbiB7CisgICAgICAgdm9pZCAqYWxsb2M7CisgICAgICAgaW50NjRfdCBwdHJfYXJyX29mZnNldDsKKyAgICB9OworCisgICAgLy8hIFRoaXMgZmllbGQgbm90IHVzZWQgYnkgT3Blbk1QIDQuMAorICAgIC8qISBUaGUgaW50byBzZWN0aW9uIGV4cHJlc3Npb24gaW4gI3ByYWdtYSBvZmZsb2FkICAgICovCisgICAgLyohIEZvciBjX2RhdGFfcHRyX2FycmF5IHRoaXMgaXMgdGhlIGludG8gcHRyIGFycmF5ICAgKi8KKyAgICB2b2lkICppbnRvOworCisgICAgLy8hIEZvciBhbiBvcmRpbmFyeSB2YXJpYWJsZSwgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUKKyAgICAvKiEgRm9yIGNfY2Vhbl92YXIgKEMvQysrIGFycmF5IGV4cHJlc3Npb24pLAorICAgICAgICBwb2ludGVyIHRvIGFycl9kZXNjLCB3aGljaCBpcyBhbiBhcnJheSBkZXNjcmlwdG9yLiAqLworICAgIC8qISBGb3IgY19kYXRhX3B0cl9hcnJheSAoYXJyYXkgb2YgZGF0YSBwb2ludGVycyksCisgICAgICAgIHBvaW50ZXIgdG8gcHRyX2FycmF5X2Rlc2NyaXB0b3IsCisgICAgICAgIHdoaWNoIGlzIGEgZGVzY3JpcHRvciBmb3IgcG9pbnRlciBhcnJheSB0cmFuc2ZlcnMuICovCisgICAgdm9pZCAqcHRyOworfTsKKworLy8hIEF1eGlsaWFyeSBzdHJ1Y3QgdXNlZCB3aGVuIC1nIGlzIGVuYWJsZWQgdGhhdCBob2xkcyB2YXJpYWJsZSBuYW1lcworc3RydWN0IFZhckRlc2MyIHsKKyAgICBjb25zdCBjaGFyICpzbmFtZTsgLy8hPCBTb3VyY2UgbmFtZQorICAgIGNvbnN0IGNoYXIgKmRuYW1lOyAvLyE8IERlc3RpbmF0aW9uIG5hbWUgKHdoZW4gImludG8iIGlzIHVzZWQpCit9OworCisvKiEgV2hlbiB0aGUgT2ZmbG9hZEl0ZW1UeXBlIGlzIGNfZGF0YV9wdHJfYXJyYXkKKyAgICB0aGUgcHRyIGZpZWxkIG9mIHRoZSBtYWluIGRlc2NyaXB0b3IgcG9pbnRzIHRvIHRoaXMgc3RydWN0LiAgICAgICAgICAqLworLyohIFRoZSB0eXBlIGluIFZhckRlc2MxIG1lcmVseSBzYXlzIGNfY2Vhbl9kYXRhX3B0ciwgYnV0IHRoZSBwb2ludGVyCisgICAgdHlwZSBjYW4gYmUgY19kYXRhX3B0ciwgY19mdW5jX3B0ciwgY192b2lkX3B0ciwgb3IgY19zdHJpbmdfcHRyLgorICAgIFRoZXJlZm9yZSB0aGUgYWN0dWFsIHBvaW50ZXIgdHlwZSBpcyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgVmFyRGVzYzMuICovCisvKiEgSWYgZmxhZ19hbGlnbl9pc19hcnJheS9mbGFnX2FsbG9jX2lmX2lzX2FycmF5L2ZsYWdfZnJlZV9pZl9pc19hcnJheQorICAgIGlzIDAgdGhlbiBhbGlnbm1lbnQvYWxsb2NfaWYvZnJlZV9pZiBhcmUgc3BlY2lmaWVkIGluIFZhckRlc2MxLiAgICAgICovCisvKiEgSWYgZmxhZ19hbGlnbl9pc19hcnJheS9mbGFnX2FsbG9jX2lmX2lzX2FycmF5L2ZsYWdfZnJlZV9pZl9pc19hcnJheQorICAgIGlzIDEgdGhlbiBhbGlnbl9hcnJheS9hbGxvY19pZl9hcnJheS9mcmVlX2lmX2FycmF5IHNwZWNpZnkKKyAgICB0aGUgc2V0IG9mIGFsaWdubWVudC9hbGxvY19pZi9mcmVlX2lmIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIEZvciB0aGUgb3RoZXIgZmllbGRzLCBpZiBuZWl0aGVyIHRoZSBzY2FsYXIgbm9yIHRoZSBhcnJheSBmbGFnCisgICAgaXMgc2V0LCB0aGVuIHRoYXQgbW9kaWZpZXIgd2FzIG5vdCBzcGVjaWZpZWQuIElmIHRoZSBiaXRzIGFyZSBzZXQKKyAgICB0aGV5IHNwZWNpZnkgd2hpY2ggbW9kaWZpZXIgd2FzIHNldCBhbmQgd2hldGhlciBpdCB3YXMgYQorICAgIHNjYWxhciBvciBhbiBhcnJheSBleHByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgVmFyRGVzYzMKK3sKKyAgICB2b2lkICpwdHJfYXJyYXk7ICAgICAgICAvLyE8IFBvaW50ZXIgdG8gYXJyX2Rlc2Mgb2YgYXJyYXkgb2YgcG9pbnRlcnMKKyAgICB2b2lkICphbGlnbl9hcnJheTsgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqYWxsb2NfaWZfYXJyYXk7ICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmZyZWVfaWZfYXJyYXk7ICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpleHRlbnRfc3RhcnQ7ICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZXh0ZW50X2VsZW1lbnRzOyAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmludG9fc3RhcnQ7ICAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICppbnRvX2VsZW1lbnRzOyAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqYWxsb2Nfc3RhcnQ7ICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX2VsZW1lbnRzOyAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICAvKiEgRmxhZ3MgdGhhdCBkZXNjcmliZSB0aGUgcG9pbnRlciB0eXBlIGFuZCB3aGV0aGVyIGVhY2ggZmllbGQKKyAgICAgICAgaXMgYSBzY2FsYXIgdmFsdWUgb3IgYW4gYXJyYXkgZXhwcmVzc2lvbi4gICAgICAgICovCisgICAgLyohIEZpcnN0IDYgYml0cyBhcmUgcG9pbnRlciBhcnJheSBlbGVtZW50IHR5cGU6CisgICAgICAgIGNfZGF0YV9wdHIsIGNfZnVuY19wdHIsIGNfdm9pZF9wdHIsIGNfc3RyaW5nX3B0ciAqLworICAgIC8qISBUaGVuIHNpbmdsZSBiaXRzIHNwZWNpZnk6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsaWduX2FycmF5IGlzIGFuIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19pZl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgZnJlZV9pZl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICovCisgICAgLyohICAgICBpbnRvX3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgICAqLworICAgIC8qISAgICAgaW50b19zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2Nfc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgKi8KKyAgICB1aW50MzJfdCBhcnJheV9maWVsZHM7Cit9OworY29uc3QgaW50IGZsYWdfYWxpZ25faXNfYXJyYXkgPSA2OworY29uc3QgaW50IGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkgPSA3OworY29uc3QgaW50IGZsYWdfZnJlZV9pZl9pc19hcnJheSA9IDg7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfc3RhcnRfaXNfc2NhbGFyID0gOTsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSA9IDEwOworY29uc3QgaW50IGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX3NjYWxhciA9IDExOworY29uc3QgaW50IGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5ID0gMTI7Citjb25zdCBpbnQgZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhciA9IDEzOworY29uc3QgaW50IGZsYWdfaW50b19zdGFydF9pc19hcnJheSA9IDE0OworY29uc3QgaW50IGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIgPSAxNTsKK2NvbnN0IGludCBmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkgPSAxNjsKK2NvbnN0IGludCBmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhciA9IDE3OworY29uc3QgaW50IGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkgPSAxODsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX3NjYWxhciA9IDE5OworY29uc3QgaW50IGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkgPSAyMDsKKworLy8gVGhlIE1hcnNoYWxsZXIKK2NsYXNzIE1hcnNoYWxsZXIKK3sKK3ByaXZhdGU6CisgICAgLy8gU3RhcnQgYWRkcmVzcyBvZiBidWZmZXIKKyAgICBjaGFyICpidWZmZXJfc3RhcnQ7CisKKyAgICAvLyBDdXJyZW50IHBvaW50ZXIgd2l0aGluIGJ1ZmZlcgorICAgIGNoYXIgKmJ1ZmZlcl9wdHI7CisKKyAgICAvLyBQaHlzaWNhbCBzaXplIG9mIGRhdGEgc2VudCAoaW5jbHVkaW5nIGZsYWdzKQorICAgIGxvbmcgbG9uZyBidWZmZXJfc2l6ZTsKKworICAgIC8vIFVzZXIgZGF0YSBzZW50L3JlY2VpdmVkCisgICAgbG9uZyBsb25nIHRmcl9zaXplOworCitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBNYXJzaGFsbGVyKCkgOgorICAgICAgICBidWZmZXJfc3RhcnQoMCksIGJ1ZmZlcl9wdHIoMCksCisgICAgICAgIGJ1ZmZlcl9zaXplKDApLCB0ZnJfc2l6ZSgwKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gY291bnQgb2YgdXNlciBkYXRhIHNlbnQvcmVjZWl2ZWQKKyAgICBsb25nIGxvbmcgZ2V0X3Rmcl9zaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0ZnJfc2l6ZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBidWZmZXIKKyAgICBjaGFyICpnZXRfYnVmZmVyX3N0YXJ0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJfc3RhcnQ7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGN1cnJlbnQgc2l6ZSBvZiBkYXRhIGluIGJ1ZmZlcgorICAgIGxvbmcgbG9uZyBnZXRfYnVmZmVyX3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9zaXplOworICAgIH0KKworICAgIC8vIFNldCBidWZmZXIgcG9pbnRlcgorICAgIHZvaWQgaW5pdF9idWZmZXIoCisgICAgICAgIGNoYXIgKmQsCisgICAgICAgIGxvbmcgbG9uZyBzCisgICAgKQorICAgIHsKKyAgICAgICAgYnVmZmVyX3N0YXJ0ID0gYnVmZmVyX3B0ciA9IGQ7CisgICAgICAgIGJ1ZmZlcl9zaXplID0gczsKKyAgICB9CisKKyAgICAvLyBTZW5kIGRhdGEKKyAgICB2b2lkIHNlbmRfZGF0YSgKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgaW50NjRfdCBsZW5ndGgKKyAgICApOworCisgICAgLy8gUmVjZWl2ZSBkYXRhCisgICAgdm9pZCByZWNlaXZlX2RhdGEoCisgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgIGludDY0X3QgbGVuZ3RoCisgICAgKTsKKworICAgIC8vIFNlbmQgZnVuY3Rpb24gcG9pbnRlcgorICAgIHZvaWQgc2VuZF9mdW5jX3B0cigKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YQorICAgICk7CisKKyAgICAvLyBSZWNlaXZlIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICB2b2lkIHJlY2VpdmVfZnVuY19wdHIoCisgICAgICAgIGNvbnN0IHZvaWQqKiBkYXRhCisgICAgKTsKK307CisKKy8vIEVuZCBvZiB0aGUgTWFyc2hhbGxlcgorCisvLyBUaGUgb2ZmbG9hZGVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IuCisvLyBTZW50IGZyb20gaG9zdCB0byB0YXJnZXQgdG8gc3BlY2lmeSB3aGljaCBmdW5jdGlvbiB0byBydW4uCisvLyBBbHNvLCBzZXRzIGNvbnNvbGUgYW5kIGZpbGUgdHJhY2luZyBsZXZlbHMuCitzdHJ1Y3QgRnVuY3Rpb25EZXNjcmlwdG9yCit7CisgICAgLy8gSW5wdXQgZGF0YSBzaXplLgorICAgIGxvbmcgbG9uZyBpbl9kYXRhbGVuOworCisgICAgLy8gT3V0cHV0IGRhdGEgc2l6ZS4KKyAgICBsb25nIGxvbmcgb3V0X2RhdGFsZW47CisKKyAgICAvLyBXaGV0aGVyIHRyYWNlIGlzIHJlcXVlc3RlZCBvbiBjb25zb2xlLgorICAgIC8vIEEgdmFsdWUgb2YgMSBwcm9kdWNlcyBvbmx5IGZ1bmN0aW9uIG5hbWUgYW5kIGRhdGEgc2VudC9yZWNlaXZlZC4KKyAgICAvLyBWYWx1ZXMgPiAxIHByb2R1Y2UgY29waW91cyB0cmFjZSBpbmZvcm1hdGlvbi4KKyAgICB1aW50OF90IGNvbnNvbGVfZW5hYmxlZDsKKworICAgIC8vIEZsYWcgY29udHJvbGxpbmcgdGltaW5nIG9uIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAvLyBWYWx1ZXMgPiAwIGVuYWJsZSB0aW1pbmcgb24gc2luay4KKyAgICB1aW50OF90IHRpbWVyX2VuYWJsZWQ7CisKKyAgICBpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgaW50IG9mZmxvYWRfbnVtYmVyOworCisgICAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgaW50IHZhcnNfbnVtOworCisgICAgLy8gaW5vdXQgZGF0YSBvZmZzZXQgaWYgZGF0YSBpcyBwYXNzZWQgYXMgbWlzYy9yZXR1cm4gZGF0YQorICAgIC8vIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgemVyby4KKyAgICBpbnQgZGF0YV9vZmZzZXQ7CisKKyAgICAvLyBUaGUgbmFtZSBvZiB0aGUgb2ZmbG9hZGVkIGZ1bmN0aW9uCisgICAgY2hhciBkYXRhW107Cit9OworCisvLyB0eXBlZGVmIE9GRkxPQUQuCisvLyBQb2ludGVyIHRvIE9mZmxvYWREZXNjcmlwdG9yLgordHlwZWRlZiBzdHJ1Y3QgT2ZmbG9hZERlc2NyaXB0b3IgKk9GRkxPQUQ7CisKKyNlbmRpZiAvLyBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjliNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcApAQCAtMCwwICsxLDUzMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9lbmdpbmUuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKworY29uc3QgY2hhciogRW5naW5lOjptX2Z1bmNfbmFtZXNbRW5naW5lOjpjX2Z1bmNzX3RvdGFsXSA9Cit7CisgICAgInNlcnZlcl9jb21wdXRlIiwKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICJzZXJ2ZXJfbXlvaW5pdCIsCisgICAgInNlcnZlcl9teW9maW5pIiwKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorICAgICJzZXJ2ZXJfaW5pdCIsCisgICAgInNlcnZlcl92YXJfdGFibGVfc2l6ZSIsCisgICAgInNlcnZlcl92YXJfdGFibGVfY29weSIKK307CisKKy8vIFN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBzaWduYWxzLiBGaXggZm9yIENRMjMzNTkzCitjb25zdCBjaGFyKiBFbmdpbmU6OmNfc2lnbmFsX25hbWVzW0VuZ2luZTo6Y19zaWduYWxfbWF4XSA9Cit7CisgICAgIlVua25vd24gU0lHTkFMIiwKKyAgICAiU0lHSFVQIiwgICAgLyogIDEsIEhhbmd1cCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHSU5UIiwgICAgLyogIDIsIEludGVycnVwdCAoQU5TSSkuICAqLworICAgICJTSUdRVUlUIiwgICAvKiAgMywgUXVpdCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHSUxMIiwgICAgLyogIDQsIElsbGVnYWwgaW5zdHJ1Y3Rpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHVFJBUCIsICAgLyogIDUsIFRyYWNlIHRyYXAgKFBPU0lYKS4gICovCisgICAgIlNJR0FCUlQiLCAgIC8qICA2LCBBYm9ydCAoQU5TSSkuICAqLworICAgICJTSUdCVVMiLCAgICAvKiAgNywgQlVTIGVycm9yICg0LjIgQlNEKS4gICovCisgICAgIlNJR0ZQRSIsICAgIC8qICA4LCBGbG9hdGluZy1wb2ludCBleGNlcHRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHS0lMTCIsICAgLyogIDksIEtpbGwsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworICAgICJTSUdVU1IxIiwgICAvKiAxMCwgVXNlci1kZWZpbmVkIHNpZ25hbCAxIChQT1NJWCkuICAqLworICAgICJTSUdTRUdWIiwgICAvKiAxMSwgU2VnbWVudGF0aW9uIHZpb2xhdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdVU1IyIiwgICAvKiAxMiwgVXNlci1kZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkuICAqLworICAgICJTSUdQSVBFIiwgICAvKiAxMywgQnJva2VuIHBpcGUgKFBPU0lYKS4gICovCisgICAgIlNJR0FMUk0iLCAgIC8qIDE0LCBBbGFybSBjbG9jayAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVEVSTSIsICAgLyogMTUsIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1NUS0ZMVCIsIC8qIDE2LCBTdGFjayBmYXVsdC4gICovCisgICAgIlNJR0NITEQiLCAgIC8qIDE3LCBDaGlsZCBzdGF0dXMgaGFzIGNoYW5nZWQgKFBPU0lYKS4gICovCisgICAgIlNJR0NPTlQiLCAgIC8qIDE4LCBDb250aW51ZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHU1RPUCIsICAgLyogMTksIFN0b3AsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworICAgICJTSUdUU1RQIiwgICAvKiAyMCwgS2V5Ym9hcmQgc3RvcCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFRJTiIsICAgLyogMjEsIEJhY2tncm91bmQgcmVhZCBmcm9tIHR0eSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFRPVSIsICAgLyogMjIsIEJhY2tncm91bmQgd3JpdGUgdG8gdHR5IChQT1NJWCkuICAqLworICAgICJTSUdVUkciLCAgICAvKiAyMywgVXJnZW50IGNvbmRpdGlvbiBvbiBzb2NrZXQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHWENQVSIsICAgLyogMjQsIENQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworICAgICJTSUdYRlNaIiwgICAvKiAyNSwgRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKS4gICovCisgICAgIlNJR1ZUQUxSTSIsIC8qIDI2LCBWaXJ0dWFsIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisgICAgIlNJR1BST0YiLCAgIC8qIDI3LCBQcm9maWxpbmcgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHV0lOQ0giLCAgLyogMjgsIFdpbmRvdyBzaXplIGNoYW5nZSAoNC4zIEJTRCwgU3VuKS4gICovCisgICAgIlNJR0lPIiwgICAgIC8qIDI5LCBJL08gbm93IHBvc3NpYmxlICg0LjIgQlNEKS4gICovCisgICAgIlNJR1BXUiIsICAgIC8qIDMwLCBQb3dlciBmYWlsdXJlIHJlc3RhcnQgKFN5c3RlbSBWKS4gICovCisgICAgIlNJR1NZUyIgICAgIC8qIDMxLCBCYWQgc3lzdGVtIGNhbGwuICAqLworfTsKKwordm9pZCBFbmdpbmU6OmluaXQodm9pZCkKK3sKKyAgICBpZiAoIW1fcmVhZHkpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKG1fbG9jayk7CisKKyAgICAgICAgaWYgKCFtX3JlYWR5KSB7CisgICAgICAgICAgICAvLyBzdGFydCBwcm9jZXNzIGlmIG5vdCBkb25lIHlldAorICAgICAgICAgICAgaWYgKG1fcHJvY2VzcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5pdF9wcm9jZXNzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgcGVuZ2luZyBpbWFnZXMKKyAgICAgICAgICAgIGxvYWRfbGlicmFyaWVzKCk7CisKKyAgICAgICAgICAgIC8vIGFuZCAocmUpYnVpbGQgcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgaW5pdF9wdHJfZGF0YSgpOworCisgICAgICAgICAgICAvLyBpdCBpcyByZWFkeSBub3cKKyAgICAgICAgICAgIG1fcmVhZHkgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6aW5pdF9wcm9jZXNzKHZvaWQpCit7CisgICAgQ09JRU5HSU5FIGVuZ2luZTsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIGNvbnN0IGNoYXIgKiplbnZpcm9uOworCisgICAgLy8gY3JlYXRlIGVudmlyb25tZW50IGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MKKyAgICBlbnZpcm9uID0gKGNvbnN0IGNoYXIqKikgbWljX2Vudl92YXJzLmNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKG1faW5kZXgpOworICAgIGlmIChlbnZpcm9uICE9IDApIHsKKyAgICAgICAgZm9yIChjb25zdCBjaGFyICoqcCA9IGVudmlyb247ICpwICE9IDA7IHArKykgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiRW52IFZhciBmb3IgY2FyZCAlZDogJXNcbiIsIG1faW5kZXgsICpwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBleGVjdXRpb24gY29udGV4dCBpbiB0aGUgc3BlY2lmaWVkIGRldmljZQorICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkdldHRpbmcgZGV2aWNlICVkIChlbmdpbmUgJWQpIGhhbmRsZVxuIiwgbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGh5c2ljYWxfaW5kZXgpOworICAgIHJlcyA9IENPSTo6RW5naW5lR2V0SGFuZGxlKENPSV9JU0FfS05DLCBtX3BoeXNpY2FsX2luZGV4LCAmZW5naW5lKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2dldF9lbmdpbmVfaGFuZGxlLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gVGFyZ2V0IGV4ZWN1dGFibGUgc2hvdWxkIGJlIGF2YWlsYWJsZSBieSB0aGUgdGltZSB3aGVuIHdlCisgICAgLy8gYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBkZXZpY2UKKyAgICBpZiAoX190YXJnZXRfZXhlID09IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX25vX3RhcmdldF9leGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwKKyAgICAgICAgIkxvYWRpbmcgdGFyZ2V0IGV4ZWN1dGFibGUgXCIlc1wiIGZyb20gJXAsIHNpemUgJWxsZFxuIiwKKyAgICAgICAgX190YXJnZXRfZXhlLT5uYW1lLCBfX3RhcmdldF9leGUtPmRhdGEsIF9fdGFyZ2V0X2V4ZS0+c2l6ZSk7CisKKyAgICByZXMgPSBDT0k6OlByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICBlbmdpbmUsICAgICAgICAgICAgICAgICAvLyBpbl9FbmdpbmUKKyAgICAgICAgX190YXJnZXRfZXhlLT5uYW1lLCAgICAgLy8gaW5fcEJpbmFyeU5hbWUKKyAgICAgICAgX190YXJnZXRfZXhlLT5kYXRhLCAgICAgLy8gaW5fcEJpbmFyeUJ1ZmZlcgorICAgICAgICBfX3RhcmdldF9leGUtPnNpemUsICAgICAvLyBpbl9CaW5hcnlCdWZmZXJMZW5ndGgsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGluX0FyZ2MKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gaW5fcHBBcmd2CisgICAgICAgIGVudmlyb24gPT0gMCwgICAgICAgICAgIC8vIGluX0R1cEVudgorICAgICAgICBlbnZpcm9uLCAgICAgICAgICAgICAgICAvLyBpbl9wcEFkZGl0aW9uYWxFbnYKKyAgICAgICAgbWljX3Byb3h5X2lvLCAgICAgICAgICAgLy8gaW5fUHJveHlBY3RpdmUKKyAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QsICAgICAgLy8gaW5fUHJveHlmc1Jvb3QKKyAgICAgICAgbWljX2J1ZmZlcl9zaXplLCAgICAgICAgLy8gaW5fQnVmZmVyU3BhY2UKKyAgICAgICAgbWljX2xpYnJhcnlfcGF0aCwgICAgICAgLy8gaW5fTGlicmFyeVNlYXJjaFBhdGgKKyAgICAgICAgX190YXJnZXRfZXhlLT5vcmlnaW4sICAgLy8gaW5fRmlsZU9mT3JpZ2luCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+b2Zmc2V0LCAgIC8vIGluX0ZpbGVPZk9yaWdpbk9mZnNldAorICAgICAgICAmbV9wcm9jZXNzICAgICAgICAgICAgICAvLyBvdXRfcFByb2Nlc3MKKyAgICApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcHJvY2Vzc19jcmVhdGUsIG1faW5kZXgsIHJlcyk7CisKKyAgICAvLyBnZXQgZnVuY3Rpb24gaGFuZGxlcworICAgIHJlcyA9IENPSTo6UHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyhtX3Byb2Nlc3MsIGNfZnVuY3NfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY19uYW1lcywgbV9mdW5jcyk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsIG1faW5kZXgsIHJlcyk7CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZSBzaWRlCisgICAgcGlkX3QgcGlkID0gaW5pdF9kZXZpY2UoKTsKKworICAgIC8vIEZvciBJREIKKyAgICBpZiAoX19kYmdfaXNfYXR0YWNoZWQpIHsKKyAgICAgICAgLy8gVE9ETzogd2UgaGF2ZSBpbi1tZW1vcnkgZXhlY3V0YWJsZSBub3cuCisgICAgICAgIC8vIENoZWNrIHdpdGggSURCIHRlYW0gd2hhdCBzaG91bGQgd2UgcHJvdmlkZSB0aGVtIG5vdz8KKyAgICAgICAgaWYgKHN0cmxlbihfX3RhcmdldF9leGUtPm5hbWUpIDwgTUFYX1RBUkdFVF9OQU1FKSB7CisgICAgICAgICAgICBzdHJjcHkoX19kYmdfdGFyZ2V0X2V4ZV9uYW1lLCBfX3RhcmdldF9leGUtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIF9fZGJnX3RhcmdldF9zb19waWQgPSBwaWQ7CisgICAgICAgIF9fZGJnX3RhcmdldF9pZCA9IG1fcGh5c2ljYWxfaW5kZXg7CisgICAgICAgIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpmaW5pX3Byb2Nlc3MoYm9vbCB2ZXJib3NlKQoreworICAgIGlmIChtX3Byb2Nlc3MgIT0gMCkgeworICAgICAgICB1aW50MzJfdCBzaWc7CisgICAgICAgIGludDhfdCByZXQ7CisKKyAgICAgICAgLy8gZGVzdHJveSB0YXJnZXQgcHJvY2VzcworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJEZXN0cm95aW5nIHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGV4KTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpQcm9jZXNzRGVzdHJveShtX3Byb2Nlc3MsIC0xLCAwLCAmcmV0LCAmc2lnKTsKKyAgICAgICAgbV9wcm9jZXNzID0gMDsKKworICAgICAgICBpZiAocmVzID09IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJEZXZpY2UgcHJvY2Vzczogc2lnbmFsICVkLCBleGl0IGNvZGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZywgcmV0KTsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoCisgICAgICAgICAgICAgICAgICAgICAgICBjX21pY19wcm9jZXNzX2V4aXRfc2lnLCBtX2luZGV4LCBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjX3NpZ25hbF9uYW1lc1tzaWcgPj0gY19zaWduYWxfbWF4ID8gMCA6IHNpZ10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wcm9jZXNzX2V4aXRfcmV0LCBtX2luZGV4LCByZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZm9yIGlkYgorICAgICAgICAgICAgaWYgKF9fZGJnX2lzX2F0dGFjaGVkKSB7CisgICAgICAgICAgICAgICAgX19kYmdfdGFyZ2V0X3NvX3VubG9hZGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcHJvY2Vzc19leGl0LCBtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmxvYWRfbGlicmFyaWVzKCkKK3sKKyAgICAvLyBsb2FkIGxpYnJhcmllcyBjb2xsZWN0ZWQgc28gZmFyCisgICAgZm9yIChUYXJnZXRJbWFnZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9pbWFnZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1faW1hZ2VzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkxvYWRpbmcgbGlicmFyeSBcIiVzXCIgZnJvbSAlcCwgc2l6ZSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5uYW1lLCBpdC0+ZGF0YSwgaXQtPnNpemUpOworCisgICAgICAgIC8vIGxvYWQgbGlicmFyeSB0byB0aGUgZGV2aWNlCisgICAgICAgIENPSUxJQlJBUlkgbGliOworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkobV9wcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljX2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0xPQURMSUJSQVJZX1YxX0ZMQUdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpYik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUyAmJiByZXMgIT0gQ09JX0FMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX2xvYWRfbGlicmFyeSwgbV9pbmRleCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX2ltYWdlcy5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCB0YXJnZXRfZW50cnlfY21wKAorICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICZsLAorICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICZyCispCit7CisgICAgY29uc3QgY2hhciAqbF9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obC5uYW1lKTsKKyAgICBjb25zdCBjaGFyICpyX25hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyLm5hbWUpOworICAgIHJldHVybiBzdHJjbXAobF9uYW1lLCByX25hbWUpIDwgMDsKK30KKworc3RhdGljIGJvb2wgaG9zdF9lbnRyeV9jbXAoCisgICAgY29uc3QgVmFyVGFibGU6OkVudHJ5ICpsLAorICAgIGNvbnN0IFZhclRhYmxlOjpFbnRyeSAqcgorKQoreworICAgIHJldHVybiBzdHJjbXAobC0+bmFtZSwgci0+bmFtZSkgPCAwOworfQorCit2b2lkIEVuZ2luZTo6aW5pdF9wdHJfZGF0YSh2b2lkKQoreworICAgIENPSVJFU1VMVCByZXM7CisgICAgQ09JRVZFTlQgZXZlbnQ7CisKKyAgICAvLyBQcmVwYXJlIHRhYmxlIG9mIGhvc3QgZW50cmllcworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+IGhvc3RfdGFibGUoX19vZmZsb2FkX3ZhcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF92YXJzLmVuZCgpKTsKKworICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgZnVydGhlciBpcyBob3N0IHRhYmxlIGlzIGVtcHR5CisgICAgaWYgKGhvc3RfdGFibGUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCB2YXIgdGFibGUgZW50cmllcyBmcm9tIHRoZSB0YXJnZXQuCisgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBnZXQgc2l6ZSBmb3IgdGhlIGJ1ZmZlciB0byBjb3B5IGRhdGEKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG5lbGVtczsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAgfSBwYXJhbXM7CisKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX3Zhcl90YWJsZV9zaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBidWZmZXIgZm9yIHRhcmdldCBlbnRyaWVzIGFuZCBjb3B5IGRhdGEgdG8gaG9zdAorICAgIENPSUJVRkZFUiBidWZmZXI7CisgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUocGFyYW1zLmxlbmd0aCwgQ09JX0JVRkZFUl9OT1JNQUwsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcHJvY2VzcywgJmJ1ZmZlcik7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgQ09JX0FDQ0VTU19GTEFHUyBmbGFncyA9IENPSV9TSU5LX1dSSVRFOworICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfdmFyX3RhYmxlX2NvcHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmYnVmZmVyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMubmVsZW1zLCBzaXplb2YocGFyYW1zLm5lbGVtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIC8vIHBhdGNoIG5hbWVzIGluIHRhcmdldCBkYXRhCisgICAgVmFyTGlzdDo6QnVmRW50cnkgKnRhcmdldF90YWJsZTsKKyAgICBDT0lNQVBJTlNUQU5DRSBtYXBfaW5zdDsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlck1hcChidWZmZXIsIDAsIHBhcmFtcy5sZW5ndGgsIENPSV9NQVBfUkVBRF9PTkxZLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnRhcmdldF90YWJsZSkpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX21hcCwgcmVzKTsKKworICAgIFZhckxpc3Q6OnRhYmxlX3BhdGNoX25hbWVzKHRhcmdldF90YWJsZSwgcGFyYW1zLm5lbGVtcyk7CisKKyAgICAvLyBhbmQgc29ydCBlbnRyaWVzCisgICAgc3RkOjpzb3J0KHRhcmdldF90YWJsZSwgdGFyZ2V0X3RhYmxlICsgcGFyYW1zLm5lbGVtcywgdGFyZ2V0X2VudHJ5X2NtcCk7CisgICAgc3RkOjpzb3J0KGhvc3RfdGFibGUuYmVnaW4oKSwgaG9zdF90YWJsZS5lbmQoKSwgaG9zdF9lbnRyeV9jbXApOworCisgICAgLy8gbWVyZ2UgaG9zdCBhbmQgdGFyZ2V0IGVudHJpZXMgYW5kIGVudGVyIG1hdGNoaW5nIHZhcnMgbWFwCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVmFyVGFibGU6OkVudHJ5Kj46OmNvbnN0X2l0ZXJhdG9yIGhpID0KKyAgICAgICAgaG9zdF90YWJsZS5iZWdpbigpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+Ojpjb25zdF9pdGVyYXRvciBoZSA9CisgICAgICAgIGhvc3RfdGFibGUuZW5kKCk7CisgICAgY29uc3QgVmFyTGlzdDo6QnVmRW50cnkgKnRpID0gdGFyZ2V0X3RhYmxlOworICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICp0ZSA9IHRhcmdldF90YWJsZSArIHBhcmFtcy5uZWxlbXM7CisKKyAgICB3aGlsZSAoaGkgIT0gaGUgJiYgdGkgIT0gdGUpIHsKKyAgICAgICAgaW50IHJlcyA9IHN0cmNtcCgoKmhpKS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odGktPm5hbWUpKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBhZGQgbWF0Y2hpbmcgZW50cnkgdG8gdmFyIG1hcAorICAgICAgICAgICAgc3RkOjpwYWlyPFB0clNldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICAgICAgbV9wdHJfc2V0Lmluc2VydChQdHJEYXRhKCgqaGkpLT5hZGRyLCAoKmhpKS0+c2l6ZSkpOworCisgICAgICAgICAgICAvLyBzdG9yZSBhZGRyZXNzIGZvciBuZXcgZW50cmllcworICAgICAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHIgPSBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICAgICAgICAgICAgICBwdHItPm1pY19hZGRyID0gdGktPmFkZHI7CisgICAgICAgICAgICAgICAgcHRyLT5pc19zdGF0aWMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoaSsrOworICAgICAgICAgICAgdGkrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBoaSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNsZWFudXAKKyAgICByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl91bm1hcCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6QnVmZmVyRGVzdHJveShidWZmZXIpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX2Rlc3Ryb3ksIHJlcyk7Cit9CisKK0NPSVJFU1VMVCBFbmdpbmU6OmNvbXB1dGUoCisgICAgY29uc3Qgc3RkOjpsaXN0PENPSUJVRkZFUj4gJmJ1ZmZlcnMsCisgICAgY29uc3Qgdm9pZCogICAgICAgICBkYXRhLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgZGF0YV9zaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgcmV0LAorICAgIHVpbnQxNl90ICAgICAgICAgICAgcmV0X3NpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICBudW1fZGVwcywKKyAgICBjb25zdCBDT0lFVkVOVCogICAgIGRlcHMsCisgICAgQ09JRVZFTlQqICAgICAgICAgICBldmVudAorKSAvKiBjb25zdCAqLworeworICAgIENPSUJVRkZFUiAqYnVmczsKKyAgICBDT0lfQUNDRVNTX0ZMQUdTICpmbGFnczsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gY29udmVydCBidWZmZXJzIGxpc3QgdG8gYXJyYXkKKyAgICBpbnQgbnVtX2J1ZnMgPSBidWZmZXJzLnNpemUoKTsKKyAgICBpZiAobnVtX2J1ZnMgPiAwKSB7CisgICAgICAgIGJ1ZnMgPSAoQ09JQlVGRkVSKikgYWxsb2NhKG51bV9idWZzICogc2l6ZW9mKENPSUJVRkZFUikpOworICAgICAgICBmbGFncyA9IChDT0lfQUNDRVNTX0ZMQUdTKikgYWxsb2NhKG51bV9idWZzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ09JX0FDQ0VTU19GTEFHUykpOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8Q09JQlVGRkVSPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBidWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gYnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgYnVmc1tpXSA9ICppdDsKKworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgZml4ZWQKKyAgICAgICAgICAgIGZsYWdzW2krK10gPSBDT0lfU0lOS19XUklURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnVmcyA9IDA7CisgICAgICAgIGZsYWdzID0gMDsKKyAgICB9CisKKyAgICAvLyBzdGFydCBjb21wdXRhdGlvbgorICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfY29tcHV0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZzLCBidWZzLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RlcHMsIGRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCByZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK3BpZF90IEVuZ2luZTo6aW5pdF9kZXZpY2Uodm9pZCkKK3sKKyAgICBzdHJ1Y3QgaW5pdF9kYXRhIHsKKyAgICAgICAgaW50ICBkZXZpY2VfaW5kZXg7CisgICAgICAgIGludCAgZGV2aWNlc190b3RhbDsKKyAgICAgICAgaW50ICBjb25zb2xlX2xldmVsOworICAgICAgICBpbnQgIG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIH0gZGF0YTsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIENPSUVWRU5UIGV2ZW50OworICAgIHBpZF90IHBpZDsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCAwLCBjX29mZmxvYWRfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkluaXRpYWxpemluZyBkZXZpY2Ugd2l0aCBsb2dpY2FsIGluZGV4ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwaHlzaWNhbCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5kZXgsIG1fcGh5c2ljYWxfaW5kZXgpOworCisgICAgLy8gc2V0dXAgbWlzYyBkYXRhCisgICAgZGF0YS5kZXZpY2VfaW5kZXggPSBtX2luZGV4OworICAgIGRhdGEuZGV2aWNlc190b3RhbCA9IG1pY19lbmdpbmVzX3RvdGFsOworICAgIGRhdGEuY29uc29sZV9sZXZlbCA9IGNvbnNvbGVfZW5hYmxlZDsKKyAgICBkYXRhLm9mZmxvYWRfcmVwb3J0X2xldmVsID0gb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX2luaXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgc2l6ZW9mKGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlkLCBzaXplb2YocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworCisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQoMSwgJmV2ZW50LCAtMSwgMSwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19ldmVudF93YWl0LCByZXMpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRGV2aWNlIHByb2Nlc3MgcGlkIGlzICVkXG4iLCBwaWQpOworCisgICAgcmV0dXJuIHBpZDsKK30KKworLy8gZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCB0aHJlYWQKK3N0cnVjdCBUaHJlYWQgeworICAgIFRocmVhZChsb25nKiBhZGRyX2NvaXBpcGVfY291bnRlcikgeworICAgICAgICBtX2FkZHJfY29pcGlwZV9jb3VudGVyID0gYWRkcl9jb2lwaXBlX2NvdW50ZXI7CisgICAgICAgIG1lbXNldChtX3BpcGVsaW5lcywgMCwgc2l6ZW9mKG1fcGlwZWxpbmVzKSk7CisgICAgfQorCisgICAgflRocmVhZCgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIF9fc3luY19zdWJfYW5kX2ZldGNoKG1fYWRkcl9jb2lwaXBlX2NvdW50ZXIsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIF9JbnRlcmxvY2tlZERlY3JlbWVudChtX2FkZHJfY29pcGlwZV9jb3VudGVyKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobV9waXBlbGluZXNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIENPSTo6UGlwZWxpbmVEZXN0cm95KG1fcGlwZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENPSVBJUEVMSU5FIGdldF9waXBlbGluZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcGlwZWxpbmVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2b2lkIHNldF9waXBlbGluZShpbnQgaW5kZXgsIENPSVBJUEVMSU5FIHBpcGVsaW5lKSB7CisgICAgICAgIG1fcGlwZWxpbmVzW2luZGV4XSA9IHBpcGVsaW5lOworICAgIH0KKworICAgIEF1dG9TZXQmIGdldF9hdXRvX3ZhcnMoKSB7CisgICAgICAgIHJldHVybiBtX2F1dG9fdmFyczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgbG9uZyogICAgICAgbV9hZGRyX2NvaXBpcGVfY291bnRlcjsKKyAgICBBdXRvU2V0ICAgICBtX2F1dG9fdmFyczsKKyAgICBDT0lQSVBFTElORSBtX3BpcGVsaW5lc1tNSUNfRU5HSU5FU19NQVhdOworfTsKKworQ09JUElQRUxJTkUgRW5naW5lOjpnZXRfcGlwZWxpbmUodm9pZCkKK3sKKyAgICBUaHJlYWQqIHRocmVhZCA9IChUaHJlYWQqKSB0aHJlYWRfZ2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXkpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKCZtX3Byb2NfbnVtYmVyKTsKKyAgICAgICAgdGhyZWFkX3NldHNwZWNpZmljKG1pY190aHJlYWRfa2V5LCB0aHJlYWQpOworICAgIH0KKworICAgIENPSVBJUEVMSU5FIHBpcGVsaW5lID0gdGhyZWFkLT5nZXRfcGlwZWxpbmUobV9pbmRleCk7CisgICAgaWYgKHBpcGVsaW5lID09IDApIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgaW50IHByb2NfbnVtOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBwcm9jX251bSA9IF9fc3luY19mZXRjaF9hbmRfYWRkKCZtX3Byb2NfbnVtYmVyLCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwcm9jX251bSA9IF9JbnRlcmxvY2tlZEluY3JlbWVudCgmbV9wcm9jX251bWJlcik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgaWYgKHByb2NfbnVtID4gQ09JX1BJUEVMSU5FX01BWF9QSVBFTElORVMpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19jb2lwaXBlX21heF9udW1iZXIsIENPSV9QSVBFTElORV9NQVhfUElQRUxJTkVTKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIHBpcGVsaW5lIGZvciB0aGlzIHRocmVhZAorICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lQ3JlYXRlKG1fcHJvY2VzcywgMCwgbWljX3N0YWNrX3NpemUsICZwaXBlbGluZSk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgICAgIHRocmVhZC0+c2V0X3BpcGVsaW5lKG1faW5kZXgsIHBpcGVsaW5lKTsKKyAgICB9CisgICAgcmV0dXJuIHBpcGVsaW5lOworfQorCitBdXRvU2V0JiBFbmdpbmU6OmdldF9hdXRvX3ZhcnModm9pZCkKK3sKKyAgICBUaHJlYWQqIHRocmVhZCA9IChUaHJlYWQqKSB0aHJlYWRfZ2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXkpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKCZtX3Byb2NfbnVtYmVyKTsKKyAgICAgICAgdGhyZWFkX3NldHNwZWNpZmljKG1pY190aHJlYWRfa2V5LCB0aHJlYWQpOworICAgIH0KKworICAgIHJldHVybiB0aHJlYWQtPmdldF9hdXRvX3ZhcnMoKTsKK30KKwordm9pZCBFbmdpbmU6OmRlc3Ryb3lfdGhyZWFkX2RhdGEodm9pZCAqZGF0YSkKK3sKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkKj4oZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTk2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaApAQCAtMCwwICsxLDQ4MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9FTkdJTkVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJjb2kvY29pX2NsaWVudC5oIgorCisvLyBBZGRyZXNzIHJhbmdlCitjbGFzcyBNZW1SYW5nZSB7CitwdWJsaWM6CisgICAgTWVtUmFuZ2UoKSA6IG1fc3RhcnQoMCksIG1fbGVuZ3RoKDApIHt9CisgICAgTWVtUmFuZ2UoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6IG1fc3RhcnQoYWRkciksIG1fbGVuZ3RoKGxlbikge30KKworICAgIGNvbnN0IHZvaWQqIHN0YXJ0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9zdGFydDsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkKiBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obV9zdGFydCkgKyBtX2xlbmd0aDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2xlbmd0aDsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgZ2l2ZW4gcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBhbm90aGVyIG9uZQorICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgTWVtUmFuZ2UgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVHdvIGFkZHJlc3MgcmFuZ2VzIEFbc3RhcnQsIGVuZCkgYW5kIEJbc3RhcnQsZW5kKSBvdmVybGFwCisgICAgICAgIC8vIGlmIEEuc3RhcnQgPCBCLmVuZCBhbmQgQS5lbmQgPiBCLnN0YXJ0LgorICAgICAgICByZXR1cm4gc3RhcnQoKSA8IG8uZW5kKCkgJiYgZW5kKCkgPiBvLnN0YXJ0KCk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGdpdmVuIHJhbmdlIGNvbnRhaW5zIHRoZSBvdGhlciByYW5nZQorICAgIGJvb2wgY29udGFpbnMoY29uc3QgTWVtUmFuZ2UgJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0KCkgPD0gby5zdGFydCgpICYmIG8uZW5kKCkgPD0gZW5kKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fc3RhcnQ7CisgICAgdWludDY0X3QgICAgbV9sZW5ndGg7Cit9OworCisvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHBvaW50ZXIgdmFyaWFibGUKK2NsYXNzIFB0ckRhdGEgeworcHVibGljOgorICAgIFB0ckRhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6CisgICAgICAgIGNwdV9hZGRyKGFkZHIsIGxlbiksIGNwdV9idWYoMCksCisgICAgICAgIG1pY19hZGRyKDApLCBhbGxvY19kaXNwKDApLCBtaWNfYnVmKDApLCBtaWNfb2Zmc2V0KDApLAorICAgICAgICByZWZfY291bnQoMCksIGlzX3N0YXRpYyhmYWxzZSkKKyAgICB7fQorCisgICAgLy8KKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgLy8KKyAgICBQdHJEYXRhKGNvbnN0IFB0ckRhdGEmIHB0cik6CisgICAgICAgIGNwdV9hZGRyKHB0ci5jcHVfYWRkciksIGNwdV9idWYocHRyLmNwdV9idWYpLAorICAgICAgICBtaWNfYWRkcihwdHIubWljX2FkZHIpLCBhbGxvY19kaXNwKHB0ci5hbGxvY19kaXNwKSwKKyAgICAgICAgbWljX2J1ZihwdHIubWljX2J1ZiksIG1pY19vZmZzZXQocHRyLm1pY19vZmZzZXQpLAorICAgICAgICByZWZfY291bnQocHRyLnJlZl9jb3VudCksIGlzX3N0YXRpYyhwdHIuaXNfc3RhdGljKQorICAgIHt9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQdHJEYXRhICZvKSBjb25zdCB7CisgICAgICAgIC8vIFZhcmlhYmxlcyBhcmUgc29ydGVkIGJ5IHRoZSBDUFUgc3RhcnQgYWRkcmVzcy4KKyAgICAgICAgLy8gT3ZlcmxhcHBpbmcgbWVtb3J5IHJhbmdlcyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICAgICAgcmV0dXJuIChjcHVfYWRkci5zdGFydCgpIDwgby5jcHVfYWRkci5zdGFydCgpKSAmJgorICAgICAgICAgICAgICAgIWNwdV9hZGRyLm92ZXJsYXBzKG8uY3B1X2FkZHIpOworICAgIH0KKworICAgIGxvbmcgYWRkX3JlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hZGQoJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmX2NvdW50KSAtIDE7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyByZW1vdmVfcmVmZXJlbmNlKCkgeworICAgICAgICBpZiAoaXNfc3RhdGljKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19NQVg7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkRGVjcmVtZW50KCZyZWZfY291bnQpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgZ2V0X3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZfY291bnQ7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gQ1BVIGFkZHJlc3MgcmFuZ2UKKyAgICBjb25zdCBNZW1SYW5nZSAgY3B1X2FkZHI7CisKKyAgICAvLyBDUFUgYW5kIE1JQyBidWZmZXJzCisgICAgQ09JQlVGRkVSICAgICAgIGNwdV9idWY7CisgICAgQ09JQlVGRkVSICAgICAgIG1pY19idWY7CisKKyAgICAvLyBwbGFjZWhvbGRlciBmb3IgYnVmZmVyIGFkZHJlc3Mgb24gbWljCisgICAgdWludDY0X3QgICAgICAgIG1pY19hZGRyOworCisgICAgdWludDY0X3QgICAgICAgIGFsbG9jX2Rpc3A7CisKKyAgICAvLyBhZGRpdGlvbmFsIG9mZnNldCB0byBwb2ludGVyIGRhdGEgb24gTUlDIGZvciBpbXByb3ZpbmcgYmFuZHdpZHRoIGZvcgorICAgIC8vIGRhdGEgd2hpY2ggaXMgbm90IDRLIGFsaWduZWQKKyAgICB1aW50MzJfdCAgICAgICAgbWljX29mZnNldDsKKworICAgIC8vIGlmIHRydWUgYnVmZmVycyBhcmUgY3JlYXRlZCBmcm9tIHN0YXRpYyBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgaXNfc3RhdGljOworICAgIG11dGV4X3QgICAgICAgICBhbGxvY19wdHJfZGF0YV9sb2NrOworCitwcml2YXRlOgorICAgIC8vIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGVudHJ5CisgICAgbG9uZyAgICAgICAgICAgIHJlZl9jb3VudDsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PFB0ckRhdGEqPiBQdHJEYXRhTGlzdDsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggYXV0b21hdGljIHZhcmlhYmxlCitjbGFzcyBBdXRvRGF0YSB7CitwdWJsaWM6CisgICAgQXV0b0RhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6CisgICAgICAgIGNwdV9hZGRyKGFkZHIsIGxlbiksIHJlZl9jb3VudCgwKQorICAgIHt9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBBdXRvRGF0YSAmbykgY29uc3QgeworICAgICAgICAvLyBWYXJpYWJsZXMgYXJlIHNvcnRlZCBieSB0aGUgQ1BVIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgIC8vIE92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAgICAgIHJldHVybiAoY3B1X2FkZHIuc3RhcnQoKSA8IG8uY3B1X2FkZHIuc3RhcnQoKSkgJiYKKyAgICAgICAgICAgICAgICFjcHVfYWRkci5vdmVybGFwcyhvLmNwdV9hZGRyKTsKKyAgICB9CisKKyAgICBsb25nIGFkZF9yZWZlcmVuY2UoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hZGQoJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmX2NvdW50KSAtIDE7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyByZW1vdmVfcmVmZXJlbmNlKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZl9jb3VudCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyBnZXRfcmVmZXJlbmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmVmX2NvdW50OworICAgIH0KKworcHVibGljOgorICAgIC8vIENQVSBhZGRyZXNzIHJhbmdlCisgICAgY29uc3QgTWVtUmFuZ2UgY3B1X2FkZHI7CisKK3ByaXZhdGU6CisgICAgLy8gcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgZW50cnkKKyAgICBsb25nIHJlZl9jb3VudDsKK307CisKKy8vIFNldCBvZiBhdXRpbWF0aWMgdmFyaWFibGVzCit0eXBlZGVmIHN0ZDo6c2V0PEF1dG9EYXRhPiBBdXRvU2V0OworCisvLyBUYXJnZXQgaW1hZ2UgZGF0YQorc3RydWN0IFRhcmdldEltYWdlCit7CisgICAgVGFyZ2V0SW1hZ2UoY29uc3QgY2hhciAqX25hbWUsIGNvbnN0IHZvaWQgKl9kYXRhLCB1aW50NjRfdCBfc2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfb3JpZ2luLCB1aW50NjRfdCBfb2Zmc2V0KSA6CisgICAgICAgIG5hbWUoX25hbWUpLCBkYXRhKF9kYXRhKSwgc2l6ZShfc2l6ZSksCisgICAgICAgIG9yaWdpbihfb3JpZ2luKSwgb2Zmc2V0KF9vZmZzZXQpCisgICAge30KKworICAgIC8vIGxpYnJhcnkgbmFtZQorICAgIGNvbnN0IGNoYXIqIG5hbWU7CisKKyAgICAvLyBjb250ZW50cyBhbmQgc2l6ZQorICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgdWludDY0X3QgICAgc2l6ZTsKKworICAgIC8vIGZpbGUgb2Ygb3JpZ2luIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgZmlsZQorICAgIGNvbnN0IGNoYXIqIG9yaWdpbjsKKyAgICB1aW50NjRfdCAgICBvZmZzZXQ7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxUYXJnZXRJbWFnZT4gVGFyZ2V0SW1hZ2VMaXN0OworCisvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBwZXJzaXN0ZW50IGF1dG8gb2JqZWN0cworc3RydWN0IFBlcnNpc3REYXRhCit7CisgICAgUGVyc2lzdERhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3Qgcm91dGluZV9udW0sIHVpbnQ2NF90IHNpemUpIDoKKyAgICAgICAgc3RhY2tfY3B1X2FkZHIoYWRkciksIHJvdXRpbmVfaWQocm91dGluZV9udW0pCisgICAgeworICAgICAgICBzdGFja19wdHJfZGF0YSA9IG5ldyBQdHJEYXRhKDAsIHNpemUpOworICAgIH0KKyAgICAvLyAxLXN0IGtleSB2YWx1ZSAtIGJlZ2lubmluZyBvZiB0aGUgc3RhY2sgYXQgQ1BVCisgICAgY29uc3Qgdm9pZCAqICAgc3RhY2tfY3B1X2FkZHI7CisgICAgLy8gMi1uZCBrZXkgdmFsdWUgLSBpZGVudGlmaWVyIG9mIHJvdXRpbmUgaW52b2NhdGlvbiBhdCBDUFUKKyAgICB1aW50NjRfdCAgIHJvdXRpbmVfaWQ7CisgICAgLy8gY29ycmVzcG9uZGVkIFB0ckRhdGE7IG9ubHkgc3RhY2tfcHRyX2RhdGEtPm1pY19idWYgaXMgdXNlZAorICAgIFB0ckRhdGEgKiBzdGFja19wdHJfZGF0YTsKKyAgICAvLyB1c2VkIHRvIGdldCBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGluIHN0YWNrIGJ1ZmZlcgorICAgIGNoYXIgKiBjcHVfc3RhY2tfYWRkcjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PFBlcnNpc3REYXRhPiBQZXJzaXN0RGF0YUxpc3Q7CisKKy8vIGNsYXNzIHJlcHJlc2VudGluZyBhIHNpbmdsZSBlbmdpbmUKK3N0cnVjdCBFbmdpbmUgeworICAgIGZyaWVuZCB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKTsKKyAgICBmcmllbmQgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpOworCisjZGVmaW5lIGNoZWNrX3Jlc3VsdChyZXMsIHRhZywgLi4uKSBcCisgICAgeyBcCisgICAgICAgIGlmIChyZXMgPT0gQ09JX1BST0NFU1NfRElFRCkgeyBcCisgICAgICAgICAgICBmaW5pX3Byb2Nlc3ModHJ1ZSk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQodGFnLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisgICAgaW50IGdldF9sb2dpY2FsX2luZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmRleDsKKyAgICB9CisKKyAgICBpbnQgZ2V0X3BoeXNpY2FsX2luZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9waHlzaWNhbF9pbmRleDsKKyAgICB9CisKKyAgICBjb25zdCBDT0lQUk9DRVNTJiBnZXRfcHJvY2VzcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcHJvY2VzczsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZQorICAgIHZvaWQgaW5pdCh2b2lkKTsKKworICAgIC8vIGFkZCBuZXcgbGlicmFyeQorICAgIHZvaWQgYWRkX2xpYihjb25zdCBUYXJnZXRJbWFnZSAmbGliKQorICAgIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9yZWFkeSA9IGZhbHNlOworICAgICAgICBtX2ltYWdlcy5wdXNoX2JhY2sobGliKTsKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIENPSVJFU1VMVCBjb21wdXRlKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Q09JQlVGRkVSPiAmYnVmZmVycywKKyAgICAgICAgY29uc3Qgdm9pZCogICAgICAgICBkYXRhLAorICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICByZXQsCisgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgcmV0X3NpemUsCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbnVtX2RlcHMsCisgICAgICAgIGNvbnN0IENPSUVWRU5UKiAgICAgZGVwcywKKyAgICAgICAgQ09JRVZFTlQqICAgICAgICAgICBldmVudAorICAgICk7CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgIC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBmb3IgbXlvaUxpYkluaXQvRmluaSBjYWxscworICAgIHZvaWQgaW5pdF9teW8oQ09JRVZFTlQgKmV2ZW50KSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX215b19pbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisgICAgfQorCisgICAgdm9pZCBmaW5pX215byhDT0lFVkVOVCAqZXZlbnQpIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfbXlvX2ZpbmldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKyAgICB9CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworICAgIC8vCisgICAgLy8gTWVtb3J5IGFzc29jaWF0aW9uIHRhYmxlCisgICAgLy8KKyAgICBQdHJEYXRhKiBmaW5kX3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgUHRyU2V0OjppdGVyYXRvciByZXMgPSBtX3B0cl9zZXQuZmluZChQdHJEYXRhKHB0ciwgMCkpOworICAgICAgICBtX3B0cl9sb2NrLnVubG9jaygpOworICAgICAgICBpZiAocmVzID09IG1fcHRyX3NldC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UHRyRGF0YSo+KHJlcy5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIFB0ckRhdGEqIGluc2VydF9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIsIHVpbnQ2NF90IGxlbiwgYm9vbCAmaXNfbmV3KSB7CisgICAgICAgIG1fcHRyX2xvY2subG9jaygpOworICAgICAgICBzdGQ6OnBhaXI8UHRyU2V0OjppdGVyYXRvciwgYm9vbD4gcmVzID0KKyAgICAgICAgICAgIG1fcHRyX3NldC5pbnNlcnQoUHRyRGF0YShwdHIsIGxlbikpOworICAgICAgICBQdHJEYXRhKiBwdHJfZGF0YSA9IGNvbnN0X2Nhc3Q8UHRyRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgICAgICBtX3B0cl9sb2NrLnVubG9jaygpOworCisgICAgICAgIGlzX25ldyA9IHJlcy5zZWNvbmQ7CisgICAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgIC8vIHVubG9jayBtdXN0IGJlIGRvbmUgYXQgY2FsbCBzaXRlIG9mIGluc2VydF9wdHJfZGF0YSBhdAorICAgICAgICAgICAgLy8gYnJhbmNoIGZvciBpc19uZXcKKyAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHRyX2RhdGE7CisgICAgfQorCisgICAgdm9pZCByZW1vdmVfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1fcHRyX2xvY2subG9jaygpOworICAgICAgICBtX3B0cl9zZXQuZXJhc2UoUHRyRGF0YShwdHIsIDApKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEF1dG9tYXRpYyB2YXJpYWJsZXMKKyAgICAvLworICAgIEF1dG9EYXRhKiBmaW5kX2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgQXV0b1NldCAmYXV0b192YXJzID0gZ2V0X2F1dG9fdmFycygpOworICAgICAgICBBdXRvU2V0OjppdGVyYXRvciByZXMgPSBhdXRvX3ZhcnMuZmluZChBdXRvRGF0YShwdHIsIDApKTsKKyAgICAgICAgaWYgKHJlcyA9PSBhdXRvX3ZhcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEF1dG9EYXRhKj4ocmVzLm9wZXJhdG9yLT4oKSk7CisgICAgfQorCisgICAgQXV0b0RhdGEqIGluc2VydF9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyLCB1aW50NjRfdCBsZW4pIHsKKyAgICAgICAgQXV0b1NldCAmYXV0b192YXJzID0gZ2V0X2F1dG9fdmFycygpOworICAgICAgICBzdGQ6OnBhaXI8QXV0b1NldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICBhdXRvX3ZhcnMuaW5zZXJ0KEF1dG9EYXRhKHB0ciwgbGVuKSk7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEF1dG9EYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgfQorCisgICAgdm9pZCByZW1vdmVfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBnZXRfYXV0b192YXJzKCkuZXJhc2UoQXV0b0RhdGEocHRyLCAwKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTaWduYWxzCisgICAgLy8KKyAgICB2b2lkIGFkZF9zaWduYWwoY29uc3Qgdm9pZCAqc2lnbmFsLCBPZmZsb2FkRGVzY3JpcHRvciAqZGVzYykgeworICAgICAgICBtX3NpZ25hbF9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9zaWduYWxfbWFwW3NpZ25hbF0gPSBkZXNjOworICAgICAgICBtX3NpZ25hbF9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIE9mZmxvYWREZXNjcmlwdG9yKiBmaW5kX3NpZ25hbChjb25zdCB2b2lkICpzaWduYWwsIGJvb2wgcmVtb3ZlKSB7CisgICAgICAgIE9mZmxvYWREZXNjcmlwdG9yICpkZXNjID0gMDsKKworICAgICAgICBtX3NpZ25hbF9sb2NrLmxvY2soKTsKKyAgICAgICAgeworICAgICAgICAgICAgU2lnbmFsTWFwOjppdGVyYXRvciBpdCA9IG1fc2lnbmFsX21hcC5maW5kKHNpZ25hbCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbV9zaWduYWxfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICBtX3NpZ25hbF9tYXAuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX3NpZ25hbF9sb2NrLnVubG9jaygpOworCisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIC8vIHN0b3AgZGV2aWNlIHByb2Nlc3MKKyAgICB2b2lkIGZpbmlfcHJvY2Vzcyhib29sIHZlcmJvc2UpOworCisgICAgLy8gbGlzdCBvZiBzdGFja3MgYWN0aXZlIGF0IHRoZSBlbmdpbmUKKyAgICBQZXJzaXN0RGF0YUxpc3QgbV9wZXJzaXN0X2xpc3Q7CisKK3ByaXZhdGU6CisgICAgRW5naW5lKCkgOiBtX2luZGV4KC0xKSwgbV9waHlzaWNhbF9pbmRleCgtMSksIG1fcHJvY2VzcygwKSwgbV9yZWFkeShmYWxzZSksCisgICAgICAgICAgICAgICBtX3Byb2NfbnVtYmVyKDApCisgICAge30KKworICAgIH5FbmdpbmUoKSB7CisgICAgICAgIGlmIChtX3Byb2Nlc3MgIT0gMCkgeworICAgICAgICAgICAgZmluaV9wcm9jZXNzKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNldCBpbmRleGVzCisgICAgdm9pZCBzZXRfaW5kZXhlcyhpbnQgbG9naWNhbF9pbmRleCwgaW50IHBoeXNpY2FsX2luZGV4KSB7CisgICAgICAgIG1faW5kZXggPSBsb2dpY2FsX2luZGV4OworICAgICAgICBtX3BoeXNpY2FsX2luZGV4ID0gcGh5c2ljYWxfaW5kZXg7CisgICAgfQorCisgICAgLy8gc3RhcnQgcHJvY2VzcyBvbiBkZXZpY2UKKyAgICB2b2lkIGluaXRfcHJvY2VzcygpOworCisgICAgdm9pZCBsb2FkX2xpYnJhcmllcyh2b2lkKTsKKyAgICB2b2lkIGluaXRfcHRyX2RhdGEodm9pZCk7CisKKyAgICAvLyBwZXJmb3JtcyBsaWJyYXJ5IGludGlhbGl6YXRpb24gb24gdGhlIGRldmljZSBzaWRlCisgICAgcGlkX3QgaW5pdF9kZXZpY2Uodm9pZCk7CisKK3ByaXZhdGU6CisgICAgLy8gZ2V0IHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCBhIGNhbGxpbmcgdGhyZWFkCisgICAgQ09JUElQRUxJTkUgZ2V0X3BpcGVsaW5lKHZvaWQpOworCisgICAgLy8gZ2V0IGF1dG9tYXRpYyB2YXJzIHNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkCisgICAgQXV0b1NldCYgZ2V0X2F1dG9fdmFycyh2b2lkKTsKKworICAgIC8vIGRlc3RydWN0b3IgZm9yIHRocmVhZCBkYXRhCisgICAgc3RhdGljIHZvaWQgZGVzdHJveV90aHJlYWRfZGF0YSh2b2lkICpkYXRhKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PFB0ckRhdGE+IFB0clNldDsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBPZmZsb2FkRGVzY3JpcHRvcio+IFNpZ25hbE1hcDsKKworICAgIC8vIGRldmljZSBpbmRleGVzCisgICAgaW50ICAgICAgICAgbV9pbmRleDsKKyAgICBpbnQgICAgICAgICBtX3BoeXNpY2FsX2luZGV4OworCisgICAgLy8gbnVtYmVyIG9mIENPSSBwaXBlcyBjcmVhdGVkIGZvciB0aGUgZW5naW5lCisgICAgbG9uZyAgICAgICAgbV9wcm9jX251bWJlcjsKKworICAgIC8vIHByb2Nlc3MgaGFuZGxlCisgICAgQ09JUFJPQ0VTUyAgbV9wcm9jZXNzOworCisgICAgLy8gSWYgZmFsc2UsIGRldmljZSBlaXRoZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIG9yIG5ldyBsaWJyYXJpZXMKKyAgICAvLyBoYXZlIGJlZW4gYWRkZWQuCisgICAgYm9vbCAgICAgICAgbV9yZWFkeTsKKyAgICBtdXRleF90ICAgICBtX2xvY2s7CisKKyAgICAvLyBMaXN0IG9mIGxpYnJhcmllcyB0byBiZSBsb2FkZWQKKyAgICBUYXJnZXRJbWFnZUxpc3QgbV9pbWFnZXM7CisKKyAgICAvLyB2YXIgdGFibGUKKyAgICBQdHJTZXQgICAgICBtX3B0cl9zZXQ7CisgICAgbXV0ZXhfdCAgICAgbV9wdHJfbG9jazsKKworICAgIC8vIHNpZ25hbHMKKyAgICBTaWduYWxNYXAgbV9zaWduYWxfbWFwOworICAgIG11dGV4X3QgICBtX3NpZ25hbF9sb2NrOworCisgICAgLy8gY29uc3RhbnRzIGZvciBhY2Nlc3NpbmcgZGV2aWNlIGZ1bmN0aW9uIGhhbmRsZXMKKyAgICBlbnVtIHsKKyAgICAgICAgY19mdW5jX2NvbXB1dGUgPSAwLAorI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgICAgIGNfZnVuY19teW9faW5pdCwKKyAgICAgICAgY19mdW5jX215b19maW5pLAorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisgICAgICAgIGNfZnVuY19pbml0LAorICAgICAgICBjX2Z1bmNfdmFyX3RhYmxlX3NpemUsCisgICAgICAgIGNfZnVuY192YXJfdGFibGVfY29weSwKKyAgICAgICAgY19mdW5jc190b3RhbAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG1fZnVuY19uYW1lc1tjX2Z1bmNzX3RvdGFsXTsKKworICAgIC8vIGRldmljZSBmdW5jdGlvbiBoYW5kbGVzCisgICAgQ09JRlVOQ1RJT04gbV9mdW5jc1tjX2Z1bmNzX3RvdGFsXTsKKworICAgIC8vIGludCAtPiBuYW1lIG1hcHBpbmcgZm9yIGRldmljZSBzaWduYWxzCisgICAgc3RhdGljIGNvbnN0IGludCAgIGNfc2lnbmFsX21heCA9IDMyOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjX3NpZ25hbF9uYW1lc1tjX3NpZ25hbF9tYXhdOworfTsKKworI2VuZGlmIC8vIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzczMzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwCkBAIC0wLDAgKzEsMzU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX2Vudi5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvLyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZhbGlkIG9uIGFsbCBjYXJkcworY29uc3QgaW50IE1pY0VudlZhcjo6YW55X2NhcmQgPSAtMTsKKworTWljRW52VmFyOjp+TWljRW52VmFyKCkKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OkNhcmRFbnZWYXJzKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBpdCA9IGNhcmRfc3BlY19saXN0LmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX3NwZWNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gKml0OworICAgICAgICBkZWxldGUgY2FyZF9kYXRhOworICAgIH0KK30KKworTWljRW52VmFyOjpWYXJWYWx1ZTo6flZhclZhbHVlKCkKK3sKKyAgICBmcmVlKGVudl92YXJfdmFsdWUpOworfQorCitNaWNFbnZWYXI6OkNhcmRFbnZWYXJzOjp+Q2FyZEVudlZhcnMoKQoreworICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6VmFyVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlbnZfdmFycy5iZWdpbigpOworICAgICAgICBpdCAhPSBlbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgVmFyVmFsdWUgKnZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgICAgIGRlbGV0ZSB2YXJfdmFsdWU7CisgICAgfQorfQorCisvLyBTZWFyY2hpbmcgZm9yIGNhcmQgaW4gImNhcmRfc3BlY19saXN0IiBsaXN0IHdpdGggdGhlIHNhbWUgIm51bWJlciIKKworTWljRW52VmFyOjpDYXJkRW52VmFycyogTWljRW52VmFyOjpnZXRfY2FyZChpbnQgbnVtYmVyKQoreworICAgIGlmIChudW1iZXIgPT0gYW55X2NhcmQpIHsKKyAgICAgICAgcmV0dXJuICZjb21tb25fdmFyczsKKyAgICB9CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpDYXJkRW52VmFycyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX3NwZWNfbGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9zcGVjX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9ICppdDsKKyAgICAgICAgaWYgKGNhcmRfZGF0YS0+Y2FyZF9udW1iZXIgPT0gbnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gY2FyZF9kYXRhOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyBTZWFyY2hpbmcgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIGluICJlbnZfdmFyIiBsaXN0IHdpdGggdGhlIHNhbWUgbmFtZQorCitNaWNFbnZWYXI6OlZhclZhbHVlKiBNaWNFbnZWYXI6OkNhcmRFbnZWYXJzOjpmaW5kX3ZhcigKKyAgICBjaGFyKiBlbnZfdmFyX25hbWUsCisgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgKKykKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFZhclZhbHVlICp2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICBpZiAodmFyX3ZhbHVlLT5sZW5ndGggPT0gZW52X3Zhcl9uYW1lX2xlbmd0aCAmJgorICAgICAgICAgICAgICAgICFzdHJuY21wKHZhcl92YWx1ZS0+ZW52X3ZhciwgZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhcl92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTWljRW52VmFyOjphbmFseXplX2Vudl92YXIoY2hhciAqZW52X3Zhcl9zdHJpbmcpCit7CisgICAgY2hhciAgICAgICAgICAqZW52X3Zhcl9uYW1lOworICAgIGNoYXIgICAgICAgICAgKmVudl92YXJfZGVmOworICAgIGludCAgICAgICAgICAgY2FyZF9udW1iZXI7CisgICAgaW50ICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoOworICAgIE1pY0VudlZhcktpbmQgZW52X3Zhcl9raW5kOworCisgICAgZW52X3Zhcl9raW5kID0gZ2V0X2Vudl92YXJfa2luZChlbnZfdmFyX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXJkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfdmFyX2RlZik7CisgICAgc3dpdGNoIChlbnZfdmFyX2tpbmQpIHsKKyAgICAgICAgY2FzZSBjX21pY192YXI6CisgICAgICAgIGNhc2UgY19taWNfY2FyZF92YXI6CisgICAgICAgICAgICBhZGRfZW52X3ZhcihjYXJkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX2RlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19jYXJkX2VudjoKKyAgICAgICAgICAgIG1pY19wYXJzZV9lbnZfdmFyX2xpc3QoY2FyZF9udW1iZXIsIGVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fbWljOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE1pY0VudlZhcjo6YWRkX2Vudl92YXIoCisgICAgaW50IGNhcmRfbnVtYmVyLAorICAgIGNoYXIgKmVudl92YXJfbmFtZSwKKyAgICBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICBjaGFyICplbnZfdmFyX2RlZgorKQoreworICAgIFZhclZhbHVlICp2YXI7CisgICAgQ2FyZEVudlZhcnMgKmNhcmQ7CisKKyAgICAvLyBUaGUgY2FzZSBjb3JyZXNwb25kcyB0byBjb21tb24gZW52IHZhciBkZWZpbml0aW9uIG9mIGtpbmQKKyAgICAvLyA8bWljLXByZWZpeD5fPHZhcj4KKyAgICBpZiAoY2FyZF9udW1iZXIgPT0gYW55X2NhcmQpIHsKKyAgICAgICAgY2FyZCA9ICZjb21tb25fdmFyczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhcmQgPSBnZXRfY2FyZChjYXJkX251bWJlcik7CisgICAgICAgIGlmICghY2FyZCkgeworICAgICAgICAgICAgLy8gZGVmaW5pdGlvbiBmb3IgbmV3IGNhcmQgb2NjdXJyZWQKKyAgICAgICAgICAgIGNhcmQgPSBuZXcgQ2FyZEVudlZhcnMoY2FyZF9udW1iZXIpOworICAgICAgICAgICAgY2FyZF9zcGVjX2xpc3QucHVzaF9iYWNrKGNhcmQpOworICAgICAgICB9CisKKyAgICB9CisgICAgdmFyID0gY2FyZC0+ZmluZF92YXIoZW52X3Zhcl9uYW1lLCBlbnZfdmFyX25hbWVfbGVuZ3RoKTsKKyAgICBpZiAoIXZhcikgeworICAgICAgICAvLyBwdXQgbmV3IGVudiB2YXIgZGVmaW5pdGlvbiBpbiAiZW52X3ZhciIgbGlzdAorICAgICAgICB2YXIgPSBuZXcgVmFyVmFsdWUoZW52X3Zhcl9uYW1lLCBlbnZfdmFyX25hbWVfbGVuZ3RoLCBlbnZfdmFyX2RlZik7CisgICAgICAgIGNhcmQtPmVudl92YXJzLnB1c2hfYmFjayh2YXIpOworICAgIH0KK30KKworLy8gVGhlIHJvdXRpbmUgYW5hbHlzZXMgc3RyaW5nIHBvaW50ZWQgYnkgImVudl92YXJfc3RyaW5nIiBhcmd1bWVudAorLy8gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorLy8KKy8vIFNwZWNpZmljYXRpb24gb2YgcHJlZml4IGZvciBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGVzCisvLyBNSUNfRU5WX1BSRUZJWD08bWljLXByZWZpeD4KKy8vCisvLyBTZXR0aW5nIHNpbmdsZSBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIDxtaWMtcHJlZml4Pl88dmFyPj08dmFsdWU+CisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPj08dmFsdWU+CisKKy8vIFNldHRpbmcgbXVsdGlwbGUgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKworTWljRW52VmFyS2luZCBNaWNFbnZWYXI6OmdldF9lbnZfdmFyX2tpbmQoCisgICAgY2hhciAqZW52X3Zhcl9zdHJpbmcsCisgICAgaW50ICpjYXJkX251bWJlciwKKyAgICBjaGFyICoqZW52X3Zhcl9uYW1lLAorICAgIGludCAqZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICBjaGFyICoqZW52X3Zhcl9kZWYKKykKK3sKKyAgICBpbnQgbGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgY2hhciAqYyA9IGVudl92YXJfc3RyaW5nOworICAgIGludCBudW0gPSAwOworICAgIGJvb2wgY2FyZF9pc19zZXQgPSBmYWxzZTsKKworICAgIGlmIChzdHJuY21wKGMsIHByZWZpeCwgbGVuKSAhPSAwIHx8IGNbbGVuXSAhPSAnXycpIHsKKyAgICAgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgYyArPSBsZW4gKyAxOworCisgICAgKmNhcmRfbnVtYmVyID0gYW55X2NhcmQ7CisgICAgaWYgKGlzZGlnaXQoKmMpKSB7CisgICAgICAgIHdoaWxlIChpc2RpZ2l0ICgqYykpIHsKKyAgICAgICAgICAgIG51bSA9ICgqYysrIC0gJzAnKSArIChudW0gKiAxMCk7CisgICAgICAgIH0KKyAgICBpZiAoKmMgIT0gJ18nKSB7CisgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgYysrOworICAgICAgICAqY2FyZF9udW1iZXIgPSBudW07CisgICAgICAgIGNhcmRfaXNfc2V0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFpc2FscGhhKCpjKSkgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgICplbnZfdmFyX25hbWUgPSAqZW52X3Zhcl9kZWYgPSBjOworICAgIGlmIChzdHJuY21wKGMsICJFTlY9IiwgNCkgPT0gMCkgeworICAgICAgICBpZiAoIWNhcmRfaXNfc2V0KSB7CisgICAgICAgICAgICAqZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDM7CisgICAgICAgICAgICAqZW52X3Zhcl9uYW1lID0gKmVudl92YXJfZGVmID0gYzsKKyAgICAgICAgICAgICplbnZfdmFyX2RlZiA9IHN0cmR1cCgqZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgcmV0dXJuICBjX21pY192YXI7CisgICAgICAgIH0KKyAgICAgICAgKmVudl92YXJfZGVmID0gYyArIHN0cmxlbigiRU5WPSIpOworICAgICAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICAgICAgcmV0dXJuIGNfbWljX2NhcmRfZW52OworICAgIH0KKyAgICBpZiAoaXNhbHBoYSgqYykpIHsKKyAgICAgICAgKmVudl92YXJfbmFtZV9sZW5ndGggPSAwOworICAgICAgICB3aGlsZSAoaXNhbG51bSgqYykgfHwgKmMgPT0gJ18nKSB7CisgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAoKmVudl92YXJfbmFtZV9sZW5ndGgpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCpjICE9ICc9JykgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgICplbnZfdmFyX2RlZiA9IHN0cmR1cCgqZW52X3Zhcl9kZWYpOworICAgIHJldHVybiBjYXJkX2lzX3NldD8gY19taWNfY2FyZF92YXIgOiBjX21pY192YXI7Cit9CisKKy8vIGFuYWx5c2luZyA8ZW52LXZhcnM+IGluIGZvcm06CisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorLy8gd2hlcmU6CisvLworLy8gPGVudi12YXJzPjoKKy8vICAgICAgICAgICAgICAgIDxlbnYtdmFyPgorLy8gICAgICAgICAgICAgICAgPGVudi12YXJzPiB8IDxlbnYtdmFyPgorLy8KKy8vIDxlbnYtdmFyPjoKKy8vICAgICAgICAgICAgICAgIHZhcmlhYmxlPXZhbHVlCisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT0idmFsdWUiCisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT0KKwordm9pZCBNaWNFbnZWYXI6Om1pY19wYXJzZV9lbnZfdmFyX2xpc3QoCisgICAgaW50IGNhcmRfbnVtYmVyLCBjaGFyICplbnZfdmFyc19kZWZfbGlzdCkKK3sKKyAgICBjaGFyICpjID0gZW52X3ZhcnNfZGVmX2xpc3Q7CisgICAgY2hhciAqZW52X3Zhcl9uYW1lOworICAgIGludCAgZW52X3Zhcl9uYW1lX2xlbmd0aDsKKyAgICBjaGFyICplbnZfdmFyX2RlZjsKKyAgICBib29sIHZhcl9pc19xdW90ZWQ7CisKKyAgICBpZiAoKmMgPT0gJyInKSB7CisgICAgICAgIGMrKzsKKyAgICB9CisgICAgd2hpbGUgKCpjICE9IDApIHsKKyAgICAgICAgdmFyX2lzX3F1b3RlZCA9IGZhbHNlOworICAgICAgICBlbnZfdmFyX25hbWUgPSBjOworICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgaWYgKGlzYWxwaGEoKmMpKSB7CisgICAgICAgICAgICB3aGlsZSAoaXNhbG51bSgqYykgfHwgKmMgPT0gJ18nKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpjICE9ICc9JykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjKys7CisKKyAgICAgICAgaWYgKCpjID09ICciJykgeworICAgICAgICAgICAgdmFyX2lzX3F1b3RlZCA9IHRydWU7CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzIHRoYXQgY29udGFpbiB8IHdpbGwgbmVlZCB0byBiZSBlc2NhcGVkLgorICAgICAgICB3aGlsZSAoKmMgIT0gMCAmJiAqYyAhPSAnfCcgJiYKKyAgICAgICAgICAgICAgICghdmFyX2lzX3F1b3RlZCB8fCAqYyAhPSAnIicpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgc3ltYm9sCisgICAgICAgICAgICBpZiAoKmMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFyX2lzX3F1b3RlZCkgeworICAgICAgICAgICAgYysrOyAvLyBmb3IgIgorICAgICAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgIT0gJ3wnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHN6ID0gYyAtIGVudl92YXJfbmFtZTsKKyAgICAgICAgZW52X3Zhcl9kZWYgPSAoY2hhciopbWFsbG9jKHN6KTsKKyAgICAgICAgbWVtY3B5KGVudl92YXJfZGVmLCBlbnZfdmFyX25hbWUsIHN6KTsKKyAgICAgICAgZW52X3Zhcl9kZWZbc3pdID0gMDsKKworICAgICAgICBpZiAoKmMgPT0gJ3wnKSB7CisgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB3aGlsZSAoKmMgIT0gMCAmJiAqYyA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWRkX2Vudl92YXIoY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9kZWYpOworICAgIH0KK30KKworLy8gQ29sbGVjdCBhbGwgZGVmaW5pdGlvbnMgZm9yIHRoZSBjYXJkIHdpdGggbnVtYmVyICJjYXJkX251bSIuCisvLyBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHZlY3RvciBvZiBzdHJpbmcgcG9pbnRlcnMgZGVmaW5pbmcgb25lCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIHZlY3RvciBpcyB0ZXJtaW5hdGVkIGJ5IE5VTEwgcG9pbnRlci4KKy8vIEluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZlY3RvciB0aGVyZSBhcmUgZW52IHZhcnMgZGVmaW5lZCBhcworLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj49PHZhbHVlPgorLy8gb3IKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisvLyB3aGVyZSA8Y2FyZC1udW1iZXI+IGlzIGVxdWFsIHRvICJjYXJkX251bSIKKy8vIFRoZXkgYXJlIGZvbGxvd2VkIGJ5IGRlZmluaXRpb25zIHZhbGlkIGZvciBhbnkgY2FyZAorLy8gYW5kIGFic2VudCBpbiBwcmV2aW91cyBkZWZpbml0aW9ucy4KKworY2hhcioqIE1pY0VudlZhcjo6Y3JlYXRlX2Vudmlyb25fZm9yX2NhcmQoaW50IGNhcmRfbnVtKQoreworICAgIFZhclZhbHVlICp2YXJfdmFsdWU7CisgICAgVmFyVmFsdWUgKnZhcl92YWx1ZV9maW5kOworICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSBnZXRfY2FyZChjYXJkX251bSk7CisgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YV9jb21tb247CisgICAgc3RkOjpsaXN0PGNoYXIqPiBuZXdfZW52OworICAgIGNoYXIgKipyZXo7CisKKyAgICBpZiAoIXByZWZpeCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gVGhlcmUgaXMgbm8gcGVyc29uZWwgZW52IHZhciBkZWZpbml0aW9ucyBmb3IgdGhlIGNhcmQgd2l0aAorICAgIC8vIG51bWJlciAiY2FyZF9udW0iCisgICAgaWYgKCFjYXJkX2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGFueV9jYXJkKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBpdCA9IGNhcmRfZGF0YS0+ZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfZGF0YS0+ZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgdmFyX3ZhbHVlID0gKml0OworICAgICAgICBuZXdfZW52LnB1c2hfYmFjayh2YXJfdmFsdWUtPmVudl92YXJfdmFsdWUpOworICAgIH0KKworICAgIGlmIChjYXJkX251bSAhPSBhbnlfY2FyZCkgeworICAgICAgICBjYXJkX2RhdGFfY29tbW9uID0gZ2V0X2NhcmQoYW55X2NhcmQpOworICAgICAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgaXQgPSBjYXJkX2RhdGFfY29tbW9uLT5lbnZfdmFycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGNhcmRfZGF0YV9jb21tb24tPmVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICB2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICB2YXJfdmFsdWVfZmluZCA9IGNhcmRfZGF0YS0+ZmluZF92YXIodmFyX3ZhbHVlLT5lbnZfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl92YWx1ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghdmFyX3ZhbHVlX2ZpbmQpIHsKKyAgICAgICAgICAgICAgICBuZXdfZW52LnB1c2hfYmFjayh2YXJfdmFsdWUtPmVudl92YXJfdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50IG5ld19lbnZfc2l6ZSA9IG5ld19lbnYuc2l6ZSgpOworICAgIHJleiA9IChjaGFyKiopIG1hbGxvYygobmV3X2Vudl9zaXplICsgMSkgKiBzaXplb2YoY2hhciopKTsKKyAgICBzdGQ6OmNvcHkobmV3X2Vudi5iZWdpbigpLCBuZXdfZW52LmVuZCgpLCByZXopOworICAgIHJleltuZXdfZW52X3NpemVdID0gMDsKKyAgICByZXR1cm4gcmV6OworfQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmggYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM1ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmgKQEAgLTAsMCArMSw5MSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9FTlZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGlzdD4KKworLy8gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIHRvIHBhcnNlIE1JQyB1c2VyIGVudmlyb25tZW50IGFuZCBwYXNzIHRvIE1JQworCitlbnVtIE1pY0VudlZhcktpbmQKK3sKKyAgICBjX25vX21pYywgICAgICAgICAvLyBub3QgTUlDIGVudiB2YXIKKyAgICBjX21pY192YXIsICAgICAgICAvLyBmb3IgPG1pYy1wcmVmaXg+Xzx2YXI+CisgICAgY19taWNfY2FyZF92YXIsICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+CisgICAgY19taWNfY2FyZF9lbnYgICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVgorfTsKKworc3RydWN0IE1pY0VudlZhciB7CitwdWJsaWM6CisgICAgTWljRW52VmFyKCkgOiBwcmVmaXgoMCkge30KKyAgICB+TWljRW52VmFyKCk7CisKKyAgICB2b2lkIGFuYWx5emVfZW52X3ZhcihjaGFyICplbnZfdmFyX3N0cmluZyk7CisgICAgY2hhcioqIGNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGludCBjYXJkX251bSk7CisgICAgTWljRW52VmFyS2luZCBnZXRfZW52X3Zhcl9raW5kKAorICAgICAgICBjaGFyICplbnZfdmFyX3N0cmluZywKKyAgICAgICAgaW50ICpjYXJkX251bWJlciwKKyAgICAgICAgY2hhciAqKmVudl92YXJfbmFtZSwKKyAgICAgICAgaW50ICplbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICBjaGFyICoqZW52X3Zhcl9kZWYKKyAgICApOworICAgIHZvaWQgYWRkX2Vudl92YXIoCisgICAgICAgIGludCBjYXJkX251bWJlciwKKyAgICAgICAgY2hhciAqZW52X3Zhcl9uYW1lLAorICAgICAgICBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgY2hhciAqZW52X3Zhcl9kZWYKKyAgICApOworCisgICAgdm9pZCBzZXRfcHJlZml4KGNvbnN0IGNoYXIgKnByZWYpIHsKKyAgICAgICAgcHJlZml4ID0gKHByZWYgJiYgKnByZWYgIT0gJ1wwJykgPyBwcmVmIDogMDsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVmFyVmFsdWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgY2hhciogZW52X3ZhcjsKKyAgICAgICAgaW50ICAgbGVuZ3RoOworICAgICAgICBjaGFyKiBlbnZfdmFyX3ZhbHVlOworCisgICAgICAgIFZhclZhbHVlKGNoYXIqIHZhciwgaW50IGxuLCBjaGFyKiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZW52X3ZhciA9IHZhcjsKKyAgICAgICAgICAgIGxlbmd0aCA9IGxuOworICAgICAgICAgICAgZW52X3Zhcl92YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIH5WYXJWYWx1ZSgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FyZEVudlZhcnMgeworICAgIHB1YmxpYzoKKworICAgICAgICBpbnQgY2FyZF9udW1iZXI7CisgICAgICAgIHN0ZDo6bGlzdDxzdHJ1Y3QgVmFyVmFsdWUqPiBlbnZfdmFyczsKKworICAgICAgICBDYXJkRW52VmFycygpIHsgY2FyZF9udW1iZXIgPSBhbnlfY2FyZDsgfQorICAgICAgICBDYXJkRW52VmFycyhpbnQgbnVtKSB7IGNhcmRfbnVtYmVyID0gbnVtOyB9CisgICAgICAgIH5DYXJkRW52VmFycygpOworCisgICAgICAgIHZvaWQgYWRkX25ld19lbnZfdmFyKGludCBudW1iZXIsIGNoYXIgKmVudl92YXIsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVudl92YXJfdmFsdWUpOworICAgICAgICBWYXJWYWx1ZSogZmluZF92YXIoY2hhciogZW52X3Zhcl9uYW1lLCBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCk7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGFueV9jYXJkOworCitwcml2YXRlOgorICAgIHZvaWQgICAgICAgICBtaWNfcGFyc2VfZW52X3Zhcl9saXN0KGludCBjYXJkX251bWJlciwgY2hhciAqZW52X3Zhcl9kZWYpOworICAgIENhcmRFbnZWYXJzKiBnZXRfY2FyZChpbnQgbnVtYmVyKTsKKworICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKKyAgICBzdGQ6Omxpc3Q8c3RydWN0IENhcmRFbnZWYXJzICo+IGNhcmRfc3BlY19saXN0OworICAgIENhcmRFbnZWYXJzIGNvbW1vbl92YXJzOworfTsKKworI2VuZGlmIC8vIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkNTEzOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwCkBAIC0wLDAgKzEsNDM2MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIGFzIHRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGFzIGZyaWVuZCBpbiBvZmZsb2FkX2VuZ2luZS5oCisvLyBDTEFORyBkb2VzIG5vdCBsaWtlIHN0YXRpYyB0byBiZWVuIGFmdGVyIGZyaWVuZCBkZWNsYXJhdGlvbi4KK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkodm9pZCk7CisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpZmRlZiBNWU9fU1VQUE9SVAorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0c2V0PgorCisjaWYgZGVmaW5lZChIT1NUX1dJTk5UKQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOyIKKyNlbHNlCisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI6IgorI2VuZGlmCisKKyNkZWZpbmUgR0VUX09GRkxPQURfTlVNQkVSKHRpbWVyX2RhdGEpIFwKKyAgICB0aW1lcl9kYXRhPyB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciA6IDAKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorLy8gU21hbGwgc3Vic2V0IG9mIEVMRiBkZWNsYXJhdGlvbnMgZm9yIFdpbmRvd3Mgd2hpY2ggaXMgbmVlZGVkIHRvIGNvbXBpbGUKKy8vIHRoaXMgZmlsZS4gRUxGIGhlYWRlciBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgd2hhdCBiaW5hcnkgdHlwZSBpcyBjb250YWluZWQKKy8vIGluIHRoZSB0YXJnZXQgaW1hZ2UgLSBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlLgorCit0eXBlZGVmIHVpbnQxNl90IEVsZjY0X0hhbGY7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjY0X1dvcmQ7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X0FkZHI7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X09mZjsKKworI2RlZmluZSBFSV9OSURFTlQgICAxNgorCisjZGVmaW5lIEVUX0VYRUMgICAgIDIKKyNkZWZpbmUgRVRfRFlOICAgICAgMworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworICAgIEVsZjY0X0hhbGYgICAgZV90eXBlOworICAgIEVsZjY0X0hhbGYgICAgZV9tYWNoaW5lOworICAgIEVsZjY0X1dvcmQgICAgZV92ZXJzaW9uOworICAgIEVsZjY0X0FkZHIgICAgZV9lbnRyeTsKKyAgICBFbGY2NF9PZmYgICAgIGVfcGhvZmY7CisgICAgRWxmNjRfT2ZmICAgICBlX3Nob2ZmOworICAgIEVsZjY0X1dvcmQgICAgZV9mbGFnczsKKyAgICBFbGY2NF9IYWxmICAgIGVfZWhzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9waGVudHNpemU7CisgICAgRWxmNjRfSGFsZiAgICBlX3BobnVtOworICAgIEVsZjY0X0hhbGYgICAgZV9zaGVudHNpemU7CisgICAgRWxmNjRfSGFsZiAgICBlX3NobnVtOworICAgIEVsZjY0X0hhbGYgICAgZV9zaHN0cm5keDsKK30gRWxmNjRfRWhkcjsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gSG9zdCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2NvbnN0IGNoYXIgKnByZWZpeDsKK2ludCBjb25zb2xlX2VuYWJsZWQgPSAwOworaW50IG9mZmxvYWRfbnVtYmVyID0gMDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh0cmFjZV9lbnZuYW1lID0gIkhfVFJBQ0UiOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfcmVwb3J0X2Vudm5hbWUgPSAiT0ZGTE9BRF9SRVBPUlQiOworc3RhdGljIGNoYXIgKnRpbWVyX2Vudm5hbWUgPSAiSF9USU1FIjsKKworLy8gVHJhY2UgaW5mb3JtYXRpb24KK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbXSA9IHsKKyAgICAiTk9DT1BZIiwKKyAgICAiSU4iLAorICAgICJPVVQiLAorICAgICJJTk9VVCIKK307CitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY190eXBlX2FzX3N0cmluZ1tdID0geworICAgICJ1bmtub3duIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfcHRyIiwKKyAgICAiZnVuY19wdHIiLAorICAgICJ2b2lkX3B0ciIsCisgICAgInN0cmluZ19wdHIiLAorICAgICJkdiIsCisgICAgImR2X2RhdGEiLAorICAgICJkdl9kYXRhX3NsaWNlIiwKKyAgICAiZHZfcHRyIiwKKyAgICAiZHZfcHRyX2RhdGEiLAorICAgICJkdl9wdHJfZGF0YV9zbGljZSIsCisgICAgImNlYW5fdmFyIiwKKyAgICAiY2Vhbl92YXJfcHRyIiwKKyAgICAiY19kYXRhX3B0cl9hcnJheSIsCisgICAgImNfZnVuY19wdHJfYXJyYXkiLAorICAgICJjX3ZvaWRfcHRyX2FycmF5IiwKKyAgICAiY19zdHJpbmdfcHRyX2FycmF5IgorfTsKKworRW5naW5lKiAgICAgICAgIG1pY19lbmdpbmVzID0gMDsKK3VpbnQzMl90ICAgICAgICBtaWNfZW5naW5lc190b3RhbCA9IDA7CitwdGhyZWFkX2tleV90ICAgbWljX3RocmVhZF9rZXk7CitNaWNFbnZWYXIgICAgICAgbWljX2Vudl92YXJzOwordWludDY0X3QgICAgICAgIGNwdV9mcmVxdWVuY3kgPSAwOworCisvLyBNSUNfU1RBQ0tTSVpFCit1aW50MzJfdCBtaWNfc3RhY2tfc2l6ZSA9IDEyICogMTAyNCAqIDEwMjQ7CisKKy8vIE1JQ19CVUZGRVJTSVpFCit1aW50NjRfdCBtaWNfYnVmZmVyX3NpemUgPSAwOworCisvLyBNSUNfTERfTElCUkFSWV9QQVRICitjaGFyKiBtaWNfbGlicmFyeV9wYXRoID0gMDsKKworLy8gTUlDX1BST1hZX0lPCitib29sIG1pY19wcm94eV9pbyA9IHRydWU7CisKKy8vIE1JQ19QUk9YWV9GU19ST09UCitjaGFyKiBtaWNfcHJveHlfZnNfcm9vdCA9IDA7CisKKy8vIFRocmVzaG9sZCBmb3IgY3JlYXRpbmcgYnVmZmVycyB3aXRoIGxhcmdlIHBhZ2VzLiBCdWZmZXIgaXMgY3JlYXRlZAorLy8gd2l0aCBsYXJnZSBwYWdlcyBoaW50IGlmIGl0cyBzaXplIGV4Y2VlZHMgdGhlIHRocmVzaG9sZCB2YWx1ZS4KKy8vIEJ5IGRlZmF1bHQgbGFyZ2UgcGFnZXMgYXJlIGRpc2FibGVkIHJpZ2h0IG5vdyAoYnkgc2V0dGluZyBkZWZhdWx0CisvLyB2YWx1ZSBmb3IgdGhyZXNob2xkIHRvIE1BWCkgZHVlIHRvIEhTRCA0MTE0NjI5LgordWludDY0X3QgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycyA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUgID0KKyAgICAiTUlDX1VTRV8yTUJfQlVGRkVSUyI7CisKK3N0YXRpYyB1aW50NjRfdCBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSA9IDIgKiAxMDI0ICogMTAyNDsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZV9lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfQVNZTkNfQlVGRkVSX1dSSVRFIjsKKworc3RhdGljIHVpbnQ2NF90IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQgPSAyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV9hc3luY19idWZmZXJfcmVhZF9lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfQVNZTkNfQlVGRkVSX1JFQUQiOworCisvLyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gdHlwZQorT2ZmbG9hZEluaXRUeXBlIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZF9hbGw7CitzdGF0aWMgY29uc3QgY2hhciAqb2ZmbG9hZF9pbml0X2Vudm5hbWUgPSAiT0ZGTE9BRF9JTklUIjsKKworLy8gYWN0aXZlIHdhaXQKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCA9IHRydWU7CitzdGF0aWMgY29uc3QgY2hhciAqb2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lID0gIk9GRkxPQURfQUNUSVZFX1dBSVQiOworCisvLyBPTVBfREVGQVVMVF9ERVZJQ0UKK2ludCBfX29tcF9kZXZpY2VfbnVtID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpvbXBfZGV2aWNlX251bV9lbnZuYW1lID0gIk9NUF9ERUZBVUxUX0RFVklDRSI7CisKKy8vIFRoZSBsaXN0IG9mIHBlbmRpbmcgdGFyZ2V0IGxpYnJhcmllcworc3RhdGljIGJvb2wgICAgICAgICAgICBfX3RhcmdldF9saWJzOworc3RhdGljIFRhcmdldEltYWdlTGlzdCBfX3RhcmdldF9saWJzX2xpc3Q7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jazsKK3N0YXRpYyBtdXRleF90ICAgICAgICAgc3RhY2tfYWxsb2NfbG9jazsKKworLy8gVGFyZ2V0IGV4ZWN1dGFibGUKK1RhcmdldEltYWdlKiAgICAgICAgICAgX190YXJnZXRfZXhlOworCitzdGF0aWMgY2hhciAqIG9mZmxvYWRfZ2V0X3NyY19iYXNlKHZvaWQgKiBwdHIsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgICBjaGFyICpiYXNlOworICAgIGlmIChWQVJfVFlQRV9JU19QVFIodHlwZSkpIHsKKyAgICAgICAgYmFzZSA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KHB0cik7CisgICAgfQorICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUih0eXBlKSkgeworICAgICAgICBiYXNlID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHB0cik7CisgICAgfQorICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UodHlwZSkgfHwgVkFSX1RZUEVfSVNfRFZfREFUQSh0eXBlKSkgeworICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpKSB7CisgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHB0cik7CisgICAgICAgICAgICBkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGR2cCA9ICh0eXBlID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KHB0cikgOgorICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4ocHRyKTsKKyAgICAgICAgfQorICAgICAgICBiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJhc2UgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYmFzZTsKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6cmVwb3J0X2NvaV9lcnJvcihlcnJvcl90eXBlcyBtc2csIENPSVJFU1VMVCByZXMpCit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgJ3Byb2Nlc3MgZGllZCcgZXJyb3IKKyAgICBpZiAocmVzID09IENPSV9QUk9DRVNTX0RJRUQpIHsKKyAgICAgICAgbV9kZXZpY2UuZmluaV9wcm9jZXNzKHRydWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtc2cpIHsKKyAgICAgICAgICAgIGNhc2UgY19idWZfY3JlYXRlOgorICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQ09JX09VVF9PRl9NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gY19idWZfY3JlYXRlX291dF9vZl9tZW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJ1ICovCisKKyAgICAgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX2Zyb21fbWVtOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9nZXRfYWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgY19waXBlbGluZV9jcmVhdGU6CisgICAgICAgICAgICBjYXNlIGNfcGlwZWxpbmVfcnVuX2Z1bmM6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihtc2csIG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCksIHJlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19idWZfcmVhZDoKKyAgICAgICAgICAgIGNhc2UgY19idWZfd3JpdGU6CisgICAgICAgICAgICBjYXNlIGNfYnVmX2NvcHk6CisgICAgICAgICAgICBjYXNlIGNfYnVmX21hcDoKKyAgICAgICAgICAgIGNhc2UgY19idWZfdW5tYXA6CisgICAgICAgICAgICBjYXNlIGNfYnVmX2Rlc3Ryb3k6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3NldF9zdGF0ZToKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKG1zZywgcmVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4aXQoMSk7Cit9CisKK19PZmZsb2FkX3Jlc3VsdCBPZmZsb2FkRGVzY3JpcHRvcjo6dHJhbnNsYXRlX2NvaV9lcnJvcihDT0lSRVNVTFQgcmVzKSBjb25zdAoreworICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgIGNhc2UgQ09JX1NVQ0NFU1M6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworCisgICAgICAgIGNhc2UgQ09JX1BST0NFU1NfRElFRDoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX1BST0NFU1NfRElFRDsKKworICAgICAgICBjYXNlIENPSV9PVVRfT0ZfTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfT1VUX09GX01FTU9SWTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfRVJST1I7CisgICAgfQorfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjphbGxvY19wdHJfZGF0YSgKKyAgICBQdHJEYXRhKiAmcHRyX2RhdGEsCisgICAgdm9pZCAqYmFzZSwKKyAgICBpbnQ2NF90IGRpc3AsCisgICAgaW50NjRfdCBzaXplLAorICAgIGludDY0X3QgYWxsb2NfZGlzcCwKKyAgICBpbnQgYWxpZ24KKykKK3sKKyAgICAvLyB0b3RhbCBsZW5ndGggb2YgYmFzZQorICAgIGludDY0X3QgbGVuZ3RoID0gZGlzcCArIHNpemU7CisgICAgYm9vbCBpc19uZXc7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJDcmVhdGluZyBhc3NvY2lhdGlvbiBmb3IgZGF0YTogYWRkciAlcCwgbGVuZ3RoICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICBiYXNlLCBsZW5ndGgpOworCisgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgIHB0cl9kYXRhID0gbV9kZXZpY2UuaW5zZXJ0X3B0cl9kYXRhKGJhc2UsIGxlbmd0aCwgaXNfbmV3KTsKKyAgICBpZiAoaXNfbmV3KSB7CisKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQWRkZWQgbmV3IGFzc29jaWF0aW9uXG4iKTsKKworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMpOworICAgICAgICAgICAgQ09JUkVTVUxUIHJlczsKKworICAgICAgICAgICAgLy8gYWxpZ24gc2hvdWxkIGJlIGEgcG93ZXIgb2YgMgorICAgICAgICAgICAgaWYgKGFsaWduID4gMCAmJiAoYWxpZ24gJiAoYWxpZ24gLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG9mZnNldCB3aXRoaW4gbWljX2J1ZmZlci4gQ2FuIGRvIG9mZnNldCBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyBvbmx5IHdoZW4gc291cmNlIGFkZHJlc3MgYWxpZ25tZW50IHNhdGlzZmllcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgb24gdGhlIHRhcmdldCAoY3ExNzI3MzYpLgorICAgICAgICAgICAgICAgIGlmICgocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYmFzZSkgJiAoYWxpZ24gLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX29mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJhc2UpICYgNDA5NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGFuZCBmbGFncworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVyX3NpemUgPSBsZW5ndGggKyBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcl9mbGFncyA9IDA7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgd2l0aCBsYXJnZSBwYWdlcyBpZiBkYXRhIGxlbmd0aCBleGNlZWRzCisgICAgICAgICAgICAvLyBsYXJnZSBwYWdlIHRocmVzaG9sZAorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2ZsYWdzID0gQ09JX09QVElNSVpFX0hVR0VfUEFHRV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgQ1BVIGJ1ZmZlcgorICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNvdXJjZSBtZW1vcnkgJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCAlbGxkXG4iLCBiYXNlLCBsZW5ndGgpOworCisgICAgICAgICAgICAvLyByZXN1bHQgaXMgbm90IGNoZWNrZWQgYmVjYXVzZSB3ZSBjYW4gY29udGludWUgd2l0aG91dCBjcHUKKyAgICAgICAgICAgIC8vIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgdXNlIENPSUJ1ZmZlclJlYWQvV3JpdGUgaW5zdGVhZAorICAgICAgICAgICAgLy8gb2YgQ09JQnVmZmVyQ29weS4KKyAgICAgICAgICAgIENPSTo6QnVmZmVyQ3JlYXRlRnJvbU1lbW9yeShsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5jcHVfYnVmKTsKKworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgYnVmZmVyIGZvciBzaW5rOiBzaXplICVsbGQsIG9mZnNldCAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MgPTB4JXhcbiIsIGJ1ZmZlcl9zaXplIC0gYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQsIGJ1ZmZlcl9mbGFncyk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBNSUMgYnVmZmVyCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShidWZmZXJfc2l6ZSAtIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2UgYnVmZmVyIHZhbGlkIG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX1ZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUocHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdHJfZGF0YS0+YWxsb2NfZGlzcCA9IGFsbG9jX2Rpc3A7CisgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLnVubG9jaygpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrKTsKKworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJGb3VuZCBleGlzdGluZyBhc3NvY2lhdGlvbjogYWRkciAlcCwgbGVuZ3RoICVsbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXNfc3RhdGljICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpLCBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmlzX3N0YXRpYyk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBuZXcgZW50cnkuIE1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGFkZHJlc3MgcmFuZ2UgZml0cworICAgICAgICAvLyBpbnRvIGV4aXN0aW5nIG9uZS4KKyAgICAgICAgTWVtUmFuZ2UgYWRkcl9yYW5nZShiYXNlLCBsZW5ndGggLSBwdHJfZGF0YS0+YWxsb2NfZGlzcCk7CisgICAgICAgIGlmICghcHRyX2RhdGEtPmNwdV9hZGRyLmNvbnRhaW5zKGFkZHJfcmFuZ2UpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYmFkX3B0cl9tZW1fcmFuZ2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBlbnRyeSBpcyBhc3NvY2lhdGVkIHdpdGggc3RhdGljIGRhdGEgaXQgbWF5IG5vdCBoYXZlIGJ1ZmZlcnMKKyAgICAgICAgLy8gY3JlYXRlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgorICAgICAgICBpZiAocHRyX2RhdGEtPmlzX3N0YXRpYyAmJiAhaW5pdF9zdGF0aWNfcHRyX2RhdGEocHRyX2RhdGEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6ZmluZF9wdHJfZGF0YSgKKyAgICBQdHJEYXRhKiAmcHRyX2RhdGEsCisgICAgdm9pZCAqYmFzZSwKKyAgICBpbnQ2NF90IGRpc3AsCisgICAgaW50NjRfdCBzaXplLAorICAgIGJvb2wgcmVwb3J0X2Vycm9yCispCit7CisgICAgLy8gdG90YWwgbGVuZ3RoIG9mIGJhc2UKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGRpc3AgKyBzaXplOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiTG9va2luZyBmb3IgYXNzb2NpYXRpb24gZm9yIGRhdGE6IGFkZHIgJXAsICIKKyAgICAgICAgICAgICAgICAgICJsZW5ndGggJWxsZFxuIiwgYmFzZSwgbGVuZ3RoKTsKKworICAgIC8vIGZpbmQgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW4gcG9pbnRlciB0YWJsZQorICAgIHB0cl9kYXRhID0gbV9kZXZpY2UuZmluZF9wdHJfZGF0YShiYXNlKTsKKyAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICBpZiAocmVwb3J0X2Vycm9yKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbm9fcHRyX2RhdGEsIGJhc2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJBc3NvY2lhdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkZvdW5kIGFzc29jaWF0aW9uOiBiYXNlICVwLCBsZW5ndGggJWxsZCwgaXNfc3RhdGljICVkXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCksIHB0cl9kYXRhLT5jcHVfYWRkci5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5pc19zdGF0aWMpOworCisgICAgLy8gbWFrZSBzdXJlIHRoYXQgcHJvdmlkZWQgYWRkcmVzcyByYW5nZSBmaXRzIGludG8gZXhpc3Rpbmcgb25lCisgICAgTWVtUmFuZ2UgYWRkcl9yYW5nZShiYXNlLCBsZW5ndGgpOworICAgIGlmICghcHRyX2RhdGEtPmNwdV9hZGRyLmNvbnRhaW5zKGFkZHJfcmFuZ2UpKSB7CisgICAgICAgIGlmIChyZXBvcnRfZXJyb3IpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19iYWRfcHRyX21lbV9yYW5nZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkV4aXN0aW5nIGFzc29jaWF0aW9uIHBhcnRpYWxseSBvdmVybGFwcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGF0YSBhZGRyZXNzIHJhbmdlXG4iKTsKKyAgICAgICAgcHRyX2RhdGEgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBkYXRhIGl0IG1heSBub3QgaGF2ZSBidWZmZXJzCisgICAgLy8gY3JlYXRlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgorICAgIGlmIChwdHJfZGF0YS0+aXNfc3RhdGljICYmICFpbml0X3N0YXRpY19wdHJfZGF0YShwdHJfZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppbml0X3N0YXRpY19wdHJfZGF0YShQdHJEYXRhICpwdHJfZGF0YSkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyk7CisKKyAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgPT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJDcmVhdGluZyBidWZmZXIgZnJvbSBzb3VyY2UgbWVtb3J5ICVsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkoCisgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSksCisgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICZwdHJfZGF0YS0+Y3B1X2J1Zik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlX2Zyb21fbWVtLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc2luayBtZW1vcnkgJWxseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2FkZHIpOworCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkoCisgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgIENPSV9TSU5LX01FTU9SWSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHB0cl9kYXRhLT5taWNfYWRkciksCisgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICZwdHJfZGF0YS0+bWljX2J1Zik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlX2Zyb21fbWVtLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmluaXRfbWljX2FkZHJlc3MoUHRyRGF0YSAqcHRyX2RhdGEpCit7CisgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmICE9IDAgJiYgcHRyX2RhdGEtPm1pY19hZGRyID09IDApIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyR2V0U2lua0FkZHJlc3MocHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfZ2V0X2FkZHJlc3MsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om51bGxpZnlfdGFyZ2V0X3N0YWNrKAorICAgIENPSUJVRkZFUiB0YXJnX2J1ZiwKKyAgICB1aW50NjRfdCBzaXplCispCit7CisgICAgY2hhciAqIHB0ciA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIG1lbXNldChwdHIsIDAsIHNpemUpOworICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgIHRhcmdfYnVmLAorICAgICAgICAwLAorICAgICAgICBwdHIsCisgICAgICAgIHNpemUsCisgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAwLCAwLCAwKTsKKyAgICBmcmVlKHB0cik7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcigKKyAgICBjb25zdCB2b2lkICogc3RhY2tfYmVnaW4sCisgICAgaW50ICByb3V0aW5lX2lkLAorICAgIGludCAgYnVmX3NpemUsCisgICAgaW50ICBhbGlnbiwKKyAgICBib29sICppc19uZXcpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKHN0YWNrX2FsbG9jX2xvY2spOworCisgICAgUGVyc2lzdERhdGEgKiBuZXdfZWw7CisgICAgUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdF9iZWdpbiA9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmJlZ2luKCk7CisgICAgUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdF9lbmQ7CisgICAgaW50IGVyYXNlID0gMDsKKworICAgICppc19uZXcgPSBmYWxzZTsKKworICAgIGZvciAoUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdCA9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIFBlcnNpc3REYXRhIGN1cl9lbCA9ICppdDsKKworICAgICAgICBpZiAoc3RhY2tfYmVnaW4gPiBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc3RhY2sgZGF0YSBtdXN0IGJlIGRlc3Ryb3llZAorICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLnB1c2hfZnJvbnQoY3VyX2VsLnN0YWNrX3B0cl9kYXRhKTsKKyAgICAgICAgICAgIGl0X2VuZCA9IGl0OworICAgICAgICAgICAgZXJhc2UrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdGFja19iZWdpbiA9PSBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIGlmIChyb3V0aW5lX2lkICE9IGl0LT4gcm91dGluZV9pZCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RhY2sgZGF0YSBtdXN0IGJlIGRlc3Ryb3llZAorICAgICAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5wdXNoX2Zyb250KGN1cl9lbC5zdGFja19wdHJfZGF0YSk7CisgICAgICAgICAgICAgICAgaXRfZW5kID0gaXQ7CisgICAgICAgICAgICAgICAgZXJhc2UrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHN0YWNrIGRhdGEgaXMgcmV1c2VkCisgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YSA9IGl0LT5zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoZXJhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvYnNvbGV0ZSBzdGFjayBzZWN0aW9ucyBtdXN0IGJlIGVyYXNlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmVyYXNlKGl0X2JlZ2luLCArK2l0X2VuZCk7CisKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9CisgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZSAqIHNpemVvZihuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJldXNlIG9mIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhY2tfYmVnaW4gPCBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyYXNlID4gMCkgeworICAgICAgICAvLyBhbGwgb2Jzb2xldGUgc3RhY2sgc2VjdGlvbnMgbXVzdCBiZSBlcmFzZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lcmFzZShpdF9iZWdpbiwgKytpdF9lbmQpOworICAgICAgICBtX2luX2RhdGFsZW4gKz0gZXJhc2UgKiBzaXplb2YobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgIH0KKyAgICAvLyBuZXcgc3RhY2sgdGFibGUgaXMgY3JlYXRlZAorICAgIG5ld19lbCA9IG5ldyBQZXJzaXN0RGF0YShzdGFja19iZWdpbiwgcm91dGluZV9pZCwgYnVmX3NpemUpOworICAgIC8vIGNyZWF0ZSBNSUMgYnVmZmVyCisgICAgQ09JUkVTVUxUIHJlczsKKyAgICB1aW50MzJfdCBidWZmZXJfZmxhZ3MgPSAwOworCisgICAgLy8gY3JlYXRlIGJ1ZmZlciB3aXRoIGxhcmdlIHBhZ2VzIGlmIGRhdGEgbGVuZ3RoIGV4Y2VlZHMKKyAgICAvLyBsYXJnZSBwYWdlIHRocmVzaG9sZAorICAgIGlmIChidWZfc2l6ZSA+PSBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzKSB7CisgICAgICAgIGJ1ZmZlcl9mbGFncyA9IENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRTsKKyAgICB9CisgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoYnVmX3NpemUsCisgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICBidWZmZXJfZmxhZ3MsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAmbmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1Zik7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBtYWtlIGJ1ZmZlciB2YWxpZCBvbiB0aGUgZGV2aWNlLgorICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgQ09JX0JVRkZFUl9WQUxJRCwKKyAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAwLCAwLCAwKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgQ09JX1BST0NFU1NfU09VUkNFLAorICAgICAgICBDT0lfQlVGRkVSX0lOVkFMSUQsCisgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBwZXJzaXN0ZW5jZSBhbGdvcml0aG0gcmVxdWlyZXMgdGFyZ2V0IHN0YWNrIGluaXRpYWx5IHRvIGJlIG51bGxpZmllZAorICAgIGlmICghbnVsbGlmeV90YXJnZXRfc3RhY2sobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwgYnVmX3NpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3N0YWNrX3B0cl9kYXRhID0gbmV3X2VsLT5zdGFja19wdHJfZGF0YTsKKyAgICBpbml0X21pY19hZGRyZXNzKG1fc3RhY2tfcHRyX2RhdGEpOworICAgIE9GRkxPQURfVFJBQ0UoMywgIkFsbG9jYXRpbmcgc3RhY2sgYnVmZmVyIHdpdGggYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QucHVzaF9mcm9udCgqbmV3X2VsKTsKKyAgICBpbml0X21pY19hZGRyZXNzKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEpOworICAgICppc19uZXcgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZXR1cF9kZXNjcmlwdG9ycygKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycyk7CisKKyAgICAvLyBtYWtlIGEgY29weSBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIG1fdmFyc190b3RhbCA9IHZhcnNfdG90YWw7CisgICAgaWYgKHZhcnNfdG90YWwgPiAwKSB7CisgICAgICAgIG1fdmFycyA9IChWYXJEZXNjKikgbWFsbG9jKG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgICAgIG1lbWNweShtX3ZhcnMsIHZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgICAgIG1fdmFyc19leHRyYSA9IChWYXJFeHRyYSopIG1hbGxvYyhtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRXh0cmEpKTsKKyAgICB9CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICBtX2luX2RlcHMgPSAoQ09JRVZFTlQqKSBtYWxsb2Moc2l6ZW9mKENPSUVWRU5UKSAqIChtX3ZhcnNfdG90YWwgICsgMSkpOworICAgIGlmIChtX3ZhcnNfdG90YWwgPiAwKSB7CisgICAgICAgIG1fb3V0X2RlcHMgPSAoQ09JRVZFTlQqKSBtYWxsb2Moc2l6ZW9mKENPSUVWRU5UKSAqIG1fdmFyc190b3RhbCk7CisgICAgfQorCisgICAgLy8gY29weWluL2NvcHlvdXQgZGF0YSBsZW5ndGgKKyAgICBtX2luX2RhdGFsZW4gPSAwOworICAgIG1fb3V0X2RhdGFsZW4gPSAwOworCisgICAgLy8gRmlyc3QgcGFzcyBvdmVyIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgLy8gLSBDYWxjdWxhdGUgc2l6ZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBub24tcG9pbnRlciBkYXRhCisgICAgLy8gLSBBbGxvY2F0ZSBidWZmZXJzIGZvciBpbnB1dCBhbmQgb3V0cHV0IHBvaW50ZXJzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICB2b2lkKiAgIGFsbG9jX2Jhc2UgPSBOVUxMOworICAgICAgICBpbnQ2NF90IGFsbG9jX2Rpc3AgPSAwOworICAgICAgICBpbnQ2NF90IGFsbG9jX3NpemU7CisgICAgICAgIGJvb2wgICAgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgICAgICBjb25zdCBjaGFyICp2YXJfc25hbWUgPSAiIjsKKyAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIGlmICh2YXJzMltpXS5zbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdmFyX3NuYW1lID0gdmFyczJbaV0uc25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiICAgVmFyRGVzYyAlZCwgdmFyPSVzLCAlcywgJXNcbiIsCisgICAgICAgICAgICBpLCB2YXJfc25hbWUsCisgICAgICAgICAgICB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzXSwKKyAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuc3JjXSk7CisgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIGkgPCB2YXJzX3RvdGFsICYmIHZhcnMyW2ldLmRuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgICAgICAgICAgICAgaW50bz0lcywgJXNcbiIsIHZhcnMyW2ldLmRuYW1lLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuZHN0XSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgIiAgICAgICAgICAgICAgdHlwZV9zcmM9JWQsIHR5cGVfZHN0bj0lZCwgZGlyZWN0aW9uPSVkLCAiCisgICAgICAgICAgICAiYWxsb2NfaWY9JWQsIGZyZWVfaWY9JWQsIGFsaWduPSVkLCBtaWNfb2Zmc2V0PSVkLCBmbGFncz0weCV4LCAiCisgICAgICAgICAgICAib2Zmc2V0PSVsbGQsIHNpemU9JWxsZCwgY291bnQvZGlzcD0lbGxkLCBwdHI9JXAsIGludG89JXBcbiIsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGlnbiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgbV92YXJzW2ldLmludG8pOworCisgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2MgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5hbGxvYyk7CisKKyAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJBTExPQyIsIGFwLCAwKTsKKworICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgYWxsb2NfZGlzcCwgYWxsb2Nfc2l6ZSk7CisKKyAgICAgICAgICAgIGFsbG9jX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0gMDsKKyAgICAgICAgLy8gZmxhZyBpc19hcnJfcHRyX2VsIGlzIDEgb25seSBmb3IgdmFyX2Rlc2NzIGdlbmVyYXRlZAorICAgICAgICAvLyBmb3IgY19kYXRhX3B0cl9hcnJheSB0eXBlCisgICAgICAgIGlmIChpIDwgdmFyc190b3RhbCkgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmlzX2Fycl9wdHJfZWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5zcmMpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVzYzMgKnZkMyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYXJEZXNjMyo+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSB2ZDMtPmFycmF5X2ZpZWxkczsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgcG9pbnRlciBhcnJheSBmbGFncyA9ICUwNHhcbiIsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgcG9pbnRlciBhcnJheSB0eXBlIGlzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1tmbGFncyAmIDB4M2ZdKTsKKyAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+cHRyX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgICAgICAgICAgICIsICJwdHIgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50byBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGlnbl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsaWduIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2lmX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2NfaWYgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5mcmVlX2lmX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiZnJlZV9pZiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZXh0ZW50X3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiZXh0ZW50X3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGV4dGVudF9zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZDMtPmV4dGVudF9lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImV4dGVudF9lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBleHRlbnRfZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG9fc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGludG9fc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5pbnRvX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvX2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRvX2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+aW50b19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGxvY19zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGFsbG9jX3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2NfZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBhbGxvY19lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgLy8gSW4gYWxsIHVzZXMgbGF0ZXIKKyAgICAgICAgICAgICAgICAvLyBWYXJEZXNjLnNpemUgd2lsbCBoYXZlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgIC8vIFZhckRlc2MuZGlzcCB3aWxsIGhhdmUgYW4gb2Zmc2V0IGZyb20gYmFzZQorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBsZW5ndGggYW5kIG9mZnNldCBpcworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZCBpbiB2YXIgZGVzY3JpcHRvci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IgdG8gdGhlIHRhcmdldCBzaWRlLgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgKj0gbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0cmFuc2ZlciBzaXplID4gMAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgbV92YXJzW2ldLnB0ciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhdGljIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBieSBvbXAgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnN0cnVjdCB3aGljaCBwYXNzZXMgemVyb3MgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgYW5kIGZyZWVfaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiB8fCBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0RhdGEgKmF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSA9IG1fZGV2aWNlLmluc2VydF9hdXRvX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLCBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YS0+YWRkX3JlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBzaG91bGQgYmUgZG9uZSBpZiB2YXIgaXMgbm90IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YWJsZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhID0gbV9kZXZpY2UuZmluZF9hdXRvX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYXV0b21hdGljIHZhcmlhYmxlcyBkYXRhIGlzIHRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBpZiBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHJlZmVyZW5jZSBjb3VudCBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YS0+Z2V0X3JlZmVyZW5jZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgZGF0YSBmb3IgbGF0ZXIgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmF1dG9fZGF0YSA9IGF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uLXN0YXRpYyB0YXJnZXQgZGVzdGluYXRpb24gZGVmaW5lZCBhcyBDRUFOCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uIHdlIHBhc3MgdG8gdGFyZ2V0IGl0cyBzaXplIGFuZCBkaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8gPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IDIgKiBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9IHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTi9PVVQiLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgY29udGVudHMgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSkgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB2YXJfZGVzYyBpcyBmb3Igc3RhY2sgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbmV3OworCisgICAgICAgICAgICAgICAgICAgIGlmICghb2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19hZGRyLCBlbnRyeV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsIG1fdmFyc1tpXS5hbGlnbiwgJmlzX25ldykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YobV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0gbV9kZXN0cm95X3N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJ1ICovCisKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3Zhcl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBsZW5ndGggYW5kIG9mZnNldCBpcworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZCBpbiB2YXIgZGVzY3JpcHRvci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IgdG8gdGhlIHRhcmdldCBzaWRlLgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZW5kIERWIHRvIHRoZSBkZXZpY2UgdW5sZXNzIGl0IGlzICdub2NvcHknCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9ICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU4vT1VUIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBubyBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY19kYXRhX3B0ciBvciBjX3N0cmluZ19wdHIKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgKj0gbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBidWZmZXIgbGVuZ3RoID49IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgKyBtX3ZhcnNbaV0uc2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ19wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9ICpzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBpZiB3ZSBoYXZlIG5vIElOVE8gYW5kIGRvbid0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmb3IgdGhlIHB0ciBhdCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGFjayBwZXJzaXN0ZW50IG9iamVjdHMgcHRyIGRhdGEgaXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHZhcl9kZXNjIHdpdGggbnVtYmVyIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRzIHB0cl9kYXRhIGlzIHN0b3JlZCBhdCBtX3N0YWNrX3B0cl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yX2lmX25vdF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvbXAgdGFyZ2V0IHVwZGF0ZSB2YXJpYWJsZSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdmFyIG5vY29weSBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9IChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcG9pbnRlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBfX29mZmxvYWRfZnVuY3MubWF4X25hbWVfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuICs9IF9fb2ZmbG9hZF9mdW5jcy5tYXhfbmFtZV9sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIGFsbG9jYXRhYmxlIGRvcGUgdmVjdG9yIGlzbid0IGFsbG9jYXRlZCBkb24ndAorICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIGl0cyBkYXRhCisgICAgICAgICAgICAgICAgaWYgKCFfX2R2X2lzX2FsbG9jYXRlZChkdnApKSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2R2X2lzX2NvbnRpZ3VvdXMoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfZHYoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zbGljZV9vZl9ub25jb250X2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaGFzX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kYXRhX2xlbmd0aChkdnAsIG1fdmFyc1tpXS5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbGVuZ3RoID49IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5kaXNwICsgbV92YXJzW2ldLnNpemUgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3plcm9fb3JfbmVnX3B0cl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZHZwLT5CYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyIGlmIHdlIGhhdmUgbm8gSU5UTyBhbmQgZG9uJ3QgbmVlZAorICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0aW9uIGZvciB0aGUgcHRyIGF0IHRhcmdldAorICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA6IG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXJyb3JfaWZfbm90X2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9tcCB0YXJnZXQgdXBkYXRlIHZhcmlhYmxlIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4aXN0aW5nIGFzc29jaWF0aW9uIGZyb20gcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSB2YXIgbm9jb3B5IGlmIGl0IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIGJhc2UgaW4gZG9wZSB2ZWN0b3Igb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBpcyB0cmFuc2ZlcnJlZCBvbmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmID09IDAgJiYgZnJlZV9pZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHJlZmVyZW5jZSBjb3VudCBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Z2V0X3JlZmVyZW5jZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgPSBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gIXNyY19pc19mb3JfbWljCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gIXB0cl9kYXRhID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZGF0YV9wdHJfYXJyYXkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY19pc19mb3JfbWljICYmIG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cikgLQorICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgc291cmNlIGlzIHVzZWQgYXQgQ1BVIHNhdmUgaXRzIG9mZnNldCBhbmQgZGlzcAorICAgICAgICBpZiAobV92YXJzW2ldLmludG8gPT0gTlVMTCB8fCBtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgICA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgImludG8iIGlzIGRlZmluZSB3ZSBuZWVkIHRvIGRvIHRoZSBzaW1pbGFyIHdvcmsgZm9yIGl0CisgICAgICAgIGlmICghbV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBpbnRvX2Rpc3AgPTAsIGludG9fb2Zmc2V0ID0gMDsKKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzCisgICAgICAgICAgICAgICAgLy8gdGhhbiBzcmMgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBtX3ZhcnNbaV0uaW50bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX2Rpc3AsIHNpemUsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgbV92YXJzW2ldLmludG8gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub24tc3RhdGljIHRhcmdldCBkZXN0aW5hdGlvbiBkZWZpbmVkIGFzIENFQU4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiB3ZSBwYXNzIHRvIHRhcmdldCBpdHMgc2l6ZSBhbmQgZGlzdAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9IHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU5UTyIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkb3BlIHZlY3RvciBjb250ZW50cyBleGNsdWRpbmcgYmFzZQorICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjogeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyX3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VuZCBEViB0byB0aGUgZGV2aWNlIHVubGVzcyBpdCBpcyAnbm9jb3B5JworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTlRPIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfc3JjID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX2RzdCA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA6CisgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MgdGhhbgorICAgICAgICAgICAgICAgIC8vIHNyYyBzaXplCisgICAgICAgICAgICAgICAgaWYgKHNpemVfc3JjID4gc2l6ZV9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gKnN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHN0YWNrIHBlcnNpc3RlbnQgb2JqZWN0cyBwdHIgZGF0YSBpcyBjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdmFyX2Rlc2Mgd2l0aCBudW1iZXIgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdHMgcHRyX2RhdGEgaXMgc3RvcmVkIGF0IG1fc3RhY2tfcHRyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsIGJhc2UsIGludG9fZGlzcCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gcHRyX2RhdGEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19jb250aWd1b3VzKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2R2KGR2cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhbmQgZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBpbnRvX2Rpc3AsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3NsaWNlX29mX25vbmNvbnRfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yYW5nZXNfZG9udF9tYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmhhc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gX19kdl9kYXRhX2xlbmd0aChkdnAsIG1fdmFyc1tpXS5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gX19kdl9kYXRhX2xlbmd0aChkdnApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcworICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHNyYyBzaXplCisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZHZwLT5CYXNlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsIGJhc2UsIGludG9fZGlzcCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIGJhc2UgaW4gZG9wZSB2ZWN0b3Igb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0gKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzcmNfaXNfZm9yX21pYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPSAhcHRyX2RhdGEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBpbnRvIGlzIHVzZWQgYXQgQ1BVIHNhdmUgaXRzIG9mZnNldCBhbmQgZGlzcAorICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ID0gaW50b19vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgICA9IGludG9fZGlzcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIC0KKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSBpbnRvX29mZnNldDsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwICAgPSBpbnRvX2Rpc3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2V0dXBfbWlzY19kYXRhKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSk7CisKKyAgICAvLyB3ZSBjYW4gc2tpcCBydW4gZnVuY3RvbiBjYWxsIHRvZ2V0aGVyIHdpdGggd2FpdCBpZiBvZmZsb2FkZWQKKyAgICAvLyByZWdpb24gaXMgZW1wdHkgYW5kIHRoZXJlIGlzIG5vIHVzZXIgZGVmaW5lZCBub24tcG9pbnRlciBJTi9PVVQgZGF0YQorICAgIGlmIChtX25lZWRfcnVuZnVuY3Rpb24pIHsKKyAgICAgICAgLy8gdmFyaWFibGUgZGVzY3JpcHRvcnMgYXJlIHNlbnQgYXMgaW5wdXQgZGF0YQorICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpOworCisgICAgICAgIC8vIHRpbWVyIGRhdGEgaXMgc2VudCBhcyBhIHBhcnQgb2YgdGhlIG91dHB1dCBkYXRhCisgICAgICAgIG1fb3V0X2RhdGFsZW4gKz0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgLy8gbWF4IGZyb20gaW5wdXQgZGF0YSBhbmQgb3V0cHV0IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQ2NF90IGRhdGFfbGVuID0gbV9pbl9kYXRhbGVuID4gbV9vdXRfZGF0YWxlbiA/IG1faW5fZGF0YWxlbiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW47CisKKyAgICAgICAgLy8gTWlzYyBkYXRhIGhhcyB0aGUgZm9sbG93aW5nIGxheW91dAorICAgICAgICAvLyAgICAgPEZ1bmN0aW9uIERlc2NyaXB0b3I+CisgICAgICAgIC8vICAgICA8RnVuY3Rpb24gTmFtZT4KKyAgICAgICAgLy8gICAgIDxJbi9PdXQgRGF0YT4gICAgICAgICAgICAob3B0aW9uYWwpCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGNhbiB0cmFuc2ZlciBjb3B5aW4vY29weW91dCBkYXRhIGluIG1pc2MvcmV0dXJuIGRhdGEgd2hpY2ggY2FuCisgICAgICAgIC8vIGJlIHBhc3NlZCB0byBydW4gZnVuY3Rpb24gY2FsbCBpZiBpdHMgc2l6ZSBkb2VzIG5vdCBleGNlZWQKKyAgICAgICAgLy8gQ09JX1BJUEVMSU5FX01BWF9JTl9NSVNDX0RBVEFfTEVOLiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBhbGxvY2F0ZQorICAgICAgICAvLyBidWZmZXIgZm9yIGl0LgorCisgICAgICAgIG1fZnVuY19kZXNjX3NpemUgPSBzaXplb2YoRnVuY3Rpb25EZXNjcmlwdG9yKSArIHN0cmxlbihuYW1lKSArIDE7CisgICAgICAgIG1fZnVuY19kZXNjX3NpemUgPSAobV9mdW5jX2Rlc2Nfc2l6ZSArIDcpICYgfjc7CisKKyAgICAgICAgaW50IG1pc2NfZGF0YV9vZmZzZXQgPSAwOworICAgICAgICBpbnQgbWlzY19kYXRhX3NpemUgPSAwOworICAgICAgICBpZiAoZGF0YV9sZW4gPiAwKSB7CisgICAgICAgICAgICBpZiAobV9mdW5jX2Rlc2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuIDw9IENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTiAmJgorICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW4gPD0gQ09JX1BJUEVMSU5FX01BWF9JTl9NSVNDX0RBVEFfTEVOKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIG1pc2MvcmV0dXJuIGRhdGEgZm9yIGNvcHlpbi9jb3B5b3V0CisgICAgICAgICAgICAgICAgbWlzY19kYXRhX29mZnNldCA9IG1fZnVuY19kZXNjX3NpemU7CisgICAgICAgICAgICAgICAgbWlzY19kYXRhX3NpemUgPSBkYXRhX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl9idWYoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIC8vIHNlbmQvcmVjZWl2ZSBkYXRhIHVzaW5nIGJ1ZmZlcgorICAgICAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbm91dF9idWYpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKG1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2sobV9pbm91dF9idWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgICAgIG1fZnVuY19kZXNjID0gKEZ1bmN0aW9uRGVzY3JpcHRvciopIG1hbGxvYyhtX2Z1bmNfZGVzY19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9zaXplKTsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPmNvbnNvbGVfZW5hYmxlZCA9IGNvbnNvbGVfZW5hYmxlZDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPnRpbWVyX2VuYWJsZWQgPQorICAgICAgICAgICAgdGltZXJfZW5hYmxlZCB8fCAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCk7CisgICAgICAgIG1fZnVuY19kZXNjLT5vZmZsb2FkX3JlcG9ydF9sZXZlbCA9IG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgICAgICBtX2Z1bmNfZGVzYy0+b2ZmbG9hZF9udW1iZXIgPSBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSk7CisgICAgICAgIG1fZnVuY19kZXNjLT5pbl9kYXRhbGVuID0gbV9pbl9kYXRhbGVuOworICAgICAgICBtX2Z1bmNfZGVzYy0+b3V0X2RhdGFsZW4gPSBtX291dF9kYXRhbGVuOworICAgICAgICBtX2Z1bmNfZGVzYy0+dmFyc19udW0gPSBtX3ZhcnNfdG90YWw7CisgICAgICAgIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9IG1pc2NfZGF0YV9vZmZzZXQ7CisKKyAgICAgICAgLy8gYXBwZW5kIGVudHJ5IG5hbWUKKyAgICAgICAgc3RyY3B5KG1fZnVuY19kZXNjLT5kYXRhLCBuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6d2FpdF9kZXBlbmRlbmNpZXMoCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGludCBudW1fd2FpdHMKKykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzKTsKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV93YWl0czsgaSsrKSB7CisKKyAgICAgICAgT2ZmbG9hZERlc2NyaXB0b3IgKnRhc2sgPSBtX2RldmljZS5maW5kX3NpZ25hbCh3YWl0c1tpXSwgdHJ1ZSk7CisgICAgICAgIGlmICh0YXNrID09IDApIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkMSwgbV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHNbaV0pOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGFzay0+b2ZmbG9hZF9maW5pc2goKSkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0YXNrLT5jbGVhbnVwKCk7CisgICAgICAgIGRlbGV0ZSB0YXNrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBib29sIGlzX2VtcHR5LAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBpZiAoc2lnbmFsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9pbml0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgZnVuY3Rpb24gJXMsIGlzX2VtcHR5PSVkLCAjdmFyRGVzY3M9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAiI3dhaXRzPSVkLCBzaWduYWw9bm9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc19lbXB0eSwgdmFyc190b3RhbCwgbnVtX3dhaXRzKTsKKyAgICAgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAiI1dhaXQgOiAlZCBcbiIsIG51bV93YWl0cyk7CisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICJub25lICVkXG4iLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIGZ1bmN0aW9uICVzLCBpc19lbXB0eT0lZCwgI3ZhckRlc2NzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgIiN3YWl0cz0lZCwgc2lnbmFsPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlzX2VtcHR5LCB2YXJzX3RvdGFsLCBudW1fd2FpdHMsCisgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hbCk7CisKKyAgICAgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgIiVkXG4iLCBzaWduYWwpOworICAgIH0KKyAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgIiNXYWl0IDogJWQgICVwXG4iLCBudW1fd2FpdHMsIHdhaXRzKTsKKworICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSBPRkZMT0FEX1NVQ0NFU1M7CisgICAgICAgIG1fc3RhdHVzLT5kZXZpY2VfbnVtYmVyID0gbV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKTsKKyAgICB9CisKKyAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSAhaXNfZW1wdHk7CisKKyAgICAvLyB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gZmluaXNoCisgICAgaWYgKCF3YWl0X2RlcGVuZGVuY2llcyh3YWl0cywgbnVtX3dhaXRzKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXR1cCBidWZmZXJzCisgICAgaWYgKCFzZXR1cF9kZXNjcmlwdG9ycyh2YXJzLCB2YXJzMiwgdmFyc190b3RhbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGluaXRpYXRlIHNlbmQgZm9yIHBvaW50ZXJzLiBXYW50IHRvIGRvIGl0IGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorICAgIGlmICghc2VuZF9wb2ludGVyX2RhdGEoc2lnbmFsICE9IDApKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldHVwIG1pc2MgZGF0YSBmb3IgcnVuIGZ1bmN0aW9uCisgICAgaWYgKCFzZXR1cF9taXNjX2RhdGEobmFtZSkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gZ2F0aGVyIGNvcHlpbiBkYXRhIGludG8gYnVmZmVyCisgICAgaWYgKCFnYXRoZXJfY29weWluX2RhdGEoKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgY29tcHV0YXRpb24KKyAgICBpZiAoIWNvbXB1dGUoKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWF0ZSByZWNlaXZlIGZvciBwb2ludGVycworICAgIGlmICghcmVjZWl2ZV9wb2ludGVyX2RhdGEoc2lnbmFsICE9IDApKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGlmIHRoZXJlIGlzIGEgc2lnbmFsIHNhdmUgZGVzY3JpcHRvciBmb3IgdGhlIGxhdGVyIHVzZS4KKyAgICBpZiAoc2lnbmFsICE9IDApIHsKKyAgICAgICAgbV9kZXZpY2UuYWRkX3NpZ25hbCgqc2lnbmFsLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgdGhlIG9mZmxvYWQgdG8gZmluaXNoLgorICAgIGlmICghb2ZmbG9hZF9maW5pc2goKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjbGVhbnVwKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWRfZmluaXNoKCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gd2FpdCBmb3IgY29tcHV0ZSBkZXBlbmRlbmNpZXMgdG8gYmVjb21lIHNpZ25hbGVkCisgICAgaWYgKG1faW5fZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSk7CisKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCkgeworICAgICAgICAgICAgLy8ga2VlcCBDUFUgYnVzeQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZXMgPT0gQ09JX1RJTUVfT1VUX1JFQUNIRUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNjYXR0ZXIgY29weW91dCBkYXRhIHJlY2VpdmVkIGZyb20gdGFyZ2V0CisgICAgaWYgKCFzY2F0dGVyX2NvcHlvdXRfZGF0YSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gd2FpdCBmb3IgcmVjZWl2ZSBkZXBlbmRlbmNpZXMgdG8gYmVjb21lIHNpZ25hbGVkCisgICAgaWYgKG1fb3V0X2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfYWN0aXZlX3dhaXQpIHsKKyAgICAgICAgICAgIC8vIGtlZXAgQ1BVIGJ1c3kKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX291dF9kZXBzX3RvdGFsLCBtX291dF9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZXMgPT0gQ09JX1RJTUVfT1VUX1JFQUNIRUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgLTEsIDEsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19ldmVudF93YWl0LCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzKTsKKworICAgICAgICBmb3IgKEJ1ZmZlckxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9kZXN0cm95X2J1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfYnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJEZXN0cm95KCppdCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2Rlc3Ryb3ksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6Y2xlYW51cCgpCit7CisgICAgLy8gcmVsZWFzZSBkZXZpY2UgaW4gb3JzbAorICAgIE9SU0w6OnJlbGVhc2UobV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisKKyAgICAvLyByZXBvcnQgc3R1ZmYKKyAgICBPZmZsb2FkX1JlcG9ydF9FcGlsb2coZ2V0X3RpbWVyX2RhdGEoKSk7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmlzX3NpZ25hbGVkKCkKK3sKKyAgICBib29sIHNpZ25hbGVkID0gdHJ1ZTsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gY2hlY2sgY29tcHV0ZSBhbmQgcmVjZWl2ZSBkZXBlbmRlbmNpZXMKKyAgICBpZiAobV9pbl9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgIHNpZ25hbGVkID0gc2lnbmFsZWQgJiYgKHJlcyA9PSBDT0lfU1VDQ0VTUyk7CisgICAgfQorICAgIGlmIChtX291dF9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX291dF9kZXBzX3RvdGFsLCBtX291dF9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgc2lnbmFsZWQgPSBzaWduYWxlZCAmJiAocmVzID09IENPSV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2lnbmFsZWQ7Cit9CisKKy8vIFNlbmQgcG9pbnRlciBkYXRhIGlmIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvciBib3RoIG9mIHRoZW0gYXJlCisvLyBub25jb250aWd1b3VzLiBUaGVyZSBpcyBndWFyYW50ZWUgdGhhdCBsZW5ndGggb2YgZGVzdGluYXRpb24gZW5vdWdoIGZvcgorLy8gdHJhbnNmZXJyZWQgZGF0YS4KK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgaW50IGksCisgICAgUHRyRGF0YSogc3JjX2RhdGEsCisgICAgUHRyRGF0YSogZHN0X2RhdGEsCisgICAgQ09JRVZFTlQgKmV2ZW50CisgICAgKQoreworICAgIGludDY0X3Qgb2Zmc2V0X3NyYywgb2Zmc2V0X2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmMsIGxlbmd0aF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjX2N1ciwgbGVuZ3RoX2RzdF9jdXI7CisgICAgaW50NjRfdCBzZW5kX3NpemUsIGRhdGFfc2VudCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBib29sIGRzdF9pc19lbXB0eSA9IHRydWU7CisgICAgYm9vbCBzcmNfaXNfZW1wdHkgPSB0cnVlOworCisgICAgLy8gU2V0IGxlbmd0aF9zcmMgYW5kIGxlbmd0aF9kc3QKKyAgICBsZW5ndGhfc3JjID0gKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpID8KKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYy0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIGxlbmd0aF9kc3QgPSAhbV92YXJzW2ldLmludG8gPyBsZW5ndGhfc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA/CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgc2VuZF9zaXplID0gKGxlbmd0aF9zcmMgPCBsZW5ndGhfZHN0KSA/IGxlbmd0aF9zcmMgOiBsZW5ndGhfZHN0OworCisgICAgLy8gY29uc2VxdWVudGx5IGdldCBjb250aWd1b3VzIHJhbmdlcywKKyAgICAvLyBkZWZpbmUgY29ycmVzcG9uZGVkIGRlc3RpbmF0aW9uIG9mZnNldCBhbmQgc2VuZCBkYXRhCisgICAgZG8geworICAgICAgICBpZiAoc3JjX2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X3NyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIHJhbmdlcyBhcmUgb3ZlciAtIG5vdGhpbmcgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkYXRhX3NlbnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldF9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbmd0aF9zcmNfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gZGVzdGluYXRpb24gb25lCisgICAgICAgICAgICBvZmZzZXRfc3JjICs9IHNlbmRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfc3JjX2N1ciAtPSBzZW5kX3NpemU7CisgICAgICAgIHNyY19pc19lbXB0eSA9IGxlbmd0aF9zcmNfY3VyID09IDA7CisKKyAgICAgICAgaWYgKGRzdF9pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2Rlc3RpbmF0aW9uX2lzX292ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGludG8gaXMgY29udGlndW91cy4KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9kc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzYW1lIGFzIHNvdXJjZQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG9mZnNldF9zcmM7CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfc3JjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgZGVzdGluYXRpb24gaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIHNvdXJjZSBvbmUKKyAgICAgICAgICAgIG9mZnNldF9kc3QgKz0gc2VuZF9zaXplOworICAgICAgICB9CisgICAgICAgIGxlbmd0aF9kc3RfY3VyIC09IHNlbmRfc2l6ZTsKKyAgICAgICAgZHN0X2lzX2VtcHR5ID0gbGVuZ3RoX2RzdF9jdXIgPT0gMDsKKworICAgICAgICBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKyBvZmZzZXRfc3JjLAorICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgYmFzZSArIG9mZnNldF9zcmMsCisgICAgICAgICAgICAgICAgc2VuZF9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhX3NlbnQgKz0gbGVuZ3RoX3NyYzsKKyAgICB9CisgICAgd2hpbGUgKHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZW5kX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzKTsKKworICAgIHVpbnQ2NF90IHB0cl9zZW50ID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gSW5pdGlhdGUgc2VuZCBmb3IgcG9pbnRlciBkYXRhCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgZHN0X2RhdGEsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAhPSAwICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIHB0cl9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBwdHJfZGF0YS0+bWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX29mZnNldCAtIHB0cl9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgZHN0X2RhdGEsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG9jIGZpZWxkIGlzbid0IHVzZWQgYXQgdGFyZ2V0LgorICAgICAgICAvLyBXZSBjYW4gcmV1c2UgaXQgZm9yIG9mZnNldCBvZiBhcnJheSBwb2ludGVycy4KKyAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5pc19hcnJfcHRyX2VsKSB7CisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgbV9zdGF0dXMtPmRhdGFfc2VudCArPSBwdHJfc2VudDsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgcHRyX3NlbnQpOworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgcG9pbnRlciBkYXRhIHNlbnQgdG8gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBwdHJfc2VudCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Z2F0aGVyX2NvcHlpbl9kYXRhKCkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cyk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uICYmIG1faW5fZGF0YWxlbiA+IDApIHsKKyAgICAgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgICAgIGNoYXIgKmRhdGE7CisKKyAgICAgICAgLy8gaW5pdCBtYXJzaGFsbGVyCisgICAgICAgIGlmIChtX2lub3V0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfbWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlck1hcChtX2lub3V0X2J1ZiwgMCwgbV9pbl9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfV1JJVEVfRU5USVJFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX21hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VuZCB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgICAgICBtZW1jcHkoZGF0YSwgbV92YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBkYXRhICs9IG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICAvLyBpbml0IG1hcnNoYWxsZXIKKyAgICAgICAgbV9pbi5pbml0X2J1ZmZlcihkYXRhLCBtX2luX2RhdGFsZW4pOworCisgICAgICAgIC8vIEdhdGhlciBjb3B5IGRhdGEgaW50byBidWZmZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKyAgICAgICAgICAgIFB0ckRhdGEqIHB0cl9kYXRhID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGE7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3ApIHsKKyAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YSgmcHRyX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5hbGxvY19kaXNwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlbmQgc2luayBhZGRyZXNzIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJnB0cl9kYXRhLT5taWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcCA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZkaXNwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShwdHIgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHB0ciArIHNpemVvZih1aW50NjRfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRvIHRhcmdldCBhZGRyZXNzZXMgb2Ygb2Jzb2xldGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2tzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUHRyRGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2suYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfc3RhY2suZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICogcHRyX2RhdGEgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJihwdHJfZGF0YS0+bWljX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2Z1bmNfcHRyKCooKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5kYXRhX3NlbnQgKz0gbV9pbi5nZXRfdGZyX3NpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX3VubWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIpOworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyVW5tYXAobWFwX2luc3QsIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl91bm1hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQShnZXRfdGltZXJfZGF0YSgpLCBtX2luLmdldF90ZnJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwgY19vZmZsb2FkX2NvcHlpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIGNvcHlpbiBkYXRhIHNlbnQgdG8gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtX2luLmdldF90ZnJfc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpjb21wdXRlKCkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfY29tcHV0ZSwgIkNvbXB1dGUgdGFzayBvbiBNSUNcbiIpOworCisgICAgICAgIHZvaWQqIG1pc2MgPSBtX2Z1bmNfZGVzYzsKKyAgICAgICAgaW50ICAgbWlzY19sZW4gPSBtX2Z1bmNfZGVzY19zaXplOworICAgICAgICB2b2lkKiByZXQgPSAwOworICAgICAgICBpbnQgICByZXRfbGVuID0gMDsKKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIG1pc2NfbGVuICs9IG1faW5fZGF0YWxlbjsKKworICAgICAgICAgICAgaWYgKG1fb3V0X2RhdGFsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICByZXRfbGVuID0gbV9vdXRfZGF0YWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpc3BhdGNoIHRhc2sKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgQ09JRVZFTlQgZXZlbnQ7CisgICAgICAgIHJlcyA9IG1fZGV2aWNlLmNvbXB1dGUobV9jb21wdXRlX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzYywgbWlzY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCByZXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX3BpcGVsaW5lX3J1bl9mdW5jLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgbV9pbl9kZXBzX3RvdGFsID0gMTsKKyAgICAgICAgbV9pbl9kZXBzWzBdID0gZXZlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHJlY2VpdmUgcG9pbnRlciBkYXRhIGlmIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvciBib3RoIG9mIHRoZW0gYXJlCisvLyBub25jb250aWd1b3VzLiBUaGVyZSBpcyBndWFyYW50ZWUgdGhhdCBsZW5ndGggb2YgZGVzdGluYXRpb24gZW5vdWdoIGZvcgorLy8gdHJhbnNmZXJyZWQgZGF0YS4KK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgaW50IGksCisgICAgY2hhciogYmFzZSwKKyAgICBDT0lCVUZGRVIgZHN0X2J1ZiwKKyAgICBDT0lFVkVOVCAqZXZlbnQKKykKK3sKKyAgICBpbnQ2NF90IG9mZnNldF9zcmMsIG9mZnNldF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjLCBsZW5ndGhfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyY19jdXIsIGxlbmd0aF9kc3RfY3VyOworICAgIGludDY0X3QgcmVjZWl2ZV9zaXplLCBkYXRhX3JlY2VpdmVkID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIGJvb2wgZHN0X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgICBib29sIHNyY19pc19lbXB0eSA9IHRydWU7CisKKyAgICAvLyBTZXQgbGVuZ3RoX3NyYyBhbmQgbGVuZ3RoX2RzdAorICAgIGxlbmd0aF9zcmMgPSAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgPworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgbGVuZ3RoX2RzdCA9ICFtX3ZhcnNbaV0uaW50byA/IGxlbmd0aF9zcmMgOgorICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpID8KKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICByZWNlaXZlX3NpemUgPSAobGVuZ3RoX3NyYyA8IGxlbmd0aF9kc3QpID8gbGVuZ3RoX3NyYyA6IGxlbmd0aF9kc3Q7CisKKyAgICAvLyBjb25zZXF1ZW50bHkgZ2V0IGNvbnRpZ3VvdXMgcmFuZ2VzLAorICAgIC8vIGRlZmluZSBjb3JyZXNwb25kZWQgZGVzdGluYXRpb24gb2Zmc2V0IGFuZCByZWNlaXZlIGRhdGEKKyAgICBkbyB7CisgICAgICAgIC8vIGdldCBzb3JjZSBvZmZzZXQKKyAgICAgICAgaWYgKHNyY19pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZSByYW5nZXMgYXJlIG92ZXIgLSBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YV9yZWNlaXZlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3NyYyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbmd0aF9zcmNfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gZGVzdGluYXRpb24gb25lCisgICAgICAgICAgICBvZmZzZXRfc3JjICs9IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfc3JjX2N1ciAtPSByZWNlaXZlX3NpemU7CisgICAgICAgIHNyY19pc19lbXB0eSA9IGxlbmd0aF9zcmNfY3VyID09IDA7CisKKyAgICAgICAgLy8gZ2V0IGRlc3RpbmF0aW9uIG9mZnNldAorICAgICAgICBpZiAoZHN0X2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gcmFuZ2VzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGVzdGluYXRpb25faXNfb3Zlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgY29udGlndW91cy4KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfZHN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FtZSBhcyBzb3VyY2UKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBvZmZzZXRfc3JjOworICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBzb3VyY2Ugb25lCisgICAgICAgICAgICBvZmZzZXRfZHN0ICs9IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfZHN0X2N1ciAtPSByZWNlaXZlX3NpemU7CisgICAgICAgIGRzdF9pc19lbXB0eSA9IGxlbmd0aF9kc3RfY3VyID09IDA7CisKKyAgICAgICAgaWYgKGRzdF9idWYgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgIGRzdF9idWYsCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsgb2Zmc2V0X2RzdCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgb2Zmc2V0X3NyYyArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICByZWNlaXZlX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyUmVhZCgKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9zcmMgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgYmFzZSArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgcmVjZWl2ZV9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9yZWNlaXZlZCArPSByZWNlaXZlX3NpemU7CisgICAgfQorICAgIHdoaWxlICh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6cmVjZWl2ZV9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyk7CisKKyAgICB1aW50NjRfdCBwdHJfcmVjZWl2ZWQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX291dF9kZXBzW21fb3V0X2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmID0gTlVMTDsgLy8gYnVmZmVyIGF0IGhvc3QKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhID8gcHRyX2RhdGEtPmNwdV9idWYgOiBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGJhc2UsIGRzdF9idWYsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOiB7CisgICAgICAgICAgICAgICAgQ09JQlVGRkVSIGRzdF9idWYgPSBOVUxMOyAvLyBidWZmZXIgb24gaG9zdAorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJiBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9vdXRfZGVwc1ttX291dF9kZXBzX3RvdGFsKytdIDogMDsKKworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkc3Rfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gcHRyX2RhdGEgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhLT5jcHVfYnVmIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmNwdV9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLmRzdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvICE9IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gcHRyX2RhdGEgIT0gMCA/IHB0cl9kYXRhLT5jcHVfYnVmIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYmFzZSwgZHN0X2J1ZiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzdF9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyUmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzIGZvciBvYnNvbGV0ZSBzdGFja3MKKyAgICAgICAgaWYgKG1fZGVzdHJveV9zdGFjay5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZm9yIChQdHJEYXRhTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2Rlc3Ryb3lfc3RhY2suYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfc3RhY2suZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9ICppdDsKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZvciBhdXRvbWF0aWMgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAobV9pc19vcGVubXAgJiYgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgJiYKKyAgICAgICAgICAgICAgICAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZGF0YSB8fAorICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY192b2lkX3B0ciB8fAorICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikpIHsKKyAgICAgICAgICAgICAgICBBdXRvRGF0YSAqYXV0b19kYXRhID0gbV92YXJzX2V4dHJhW2ldLmF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0b19kYXRhICE9IDAgJiYgYXV0b19kYXRhLT5yZW1vdmVfcmVmZXJlbmNlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5yZW1vdmVfYXV0b19kYXRhKGF1dG9fZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fCBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAhVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICFWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5yZW1vdmVfcmVmZXJlbmNlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+Y3B1X2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiUmVtb3ZpbmcgYXNzb2NpYXRpb24gZm9yIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmcm9tIG1hcAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5yZW1vdmVfcHRyX2RhdGEocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhOworICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPmNwdV9idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIGFzc29jaWF0aW9uIGZvciBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZnJvbSBtYXAKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX3B0cl9kYXRhKHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgbV9zdGF0dXMtPmRhdGFfcmVjZWl2ZWQgKz0gcHRyX3JlY2VpdmVkOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9SREFUQShnZXRfdGltZXJfZGF0YSgpLCBwdHJfcmVjZWl2ZWQpOworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIHBvaW50ZXIgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzY2F0dGVyX2NvcHlvdXRfZGF0YSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uICYmIG1fb3V0X2RhdGFsZW4gPiAwKSB7CisKKyAgICAgICAgLy8gdG90YWwgc2l6ZSB0aGF0IG5lZWQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0YXJnZXQgdG8gaG9zdAorICAgICAgICBDT0lNQVBJTlNUQU5DRSBtYXBfaW5zdDsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgY2hhciAqZGF0YTsKKworICAgICAgICAvLyBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfbWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJNYXAobV9pbm91dF9idWYsIDAsIG1fb3V0X2RhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX01BUF9SRUFEX09OTFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmRhdGEpKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfbWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgdGltaW5nIGRhdGEKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQShnZXRfdGltZXJfZGF0YSgpLCBkYXRhKTsKKyAgICAgICAgZGF0YSArPSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIG91dHB1dCBtYXJzaGFsbGVyCisgICAgICAgIG1fb3V0LmluaXRfYnVmZmVyKGRhdGEsIG1fb3V0X2RhdGFsZW4pOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZGF0YShwdHIgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZnVuY19wdHIoKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3N0YXR1cykgeworICAgICAgICAgICAgbV9zdGF0dXMtPmRhdGFfcmVjZWl2ZWQgKz0gbV9vdXQuZ2V0X3Rmcl9zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl91bm1hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfdW5tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworICAgIE9GRkxPQURfVFJBQ0UoMSwgIlRvdGFsIGNvcHlvdXQgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZ2V0X2Fycl9kZXNjX251bWJlcnMoCisgICAgY29uc3QgYXJyX2Rlc2MgKmFwLAorICAgIGludDY0X3QgZWxfc2l6ZSwKKyAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgaW50NjRfdCAmc2l6ZSwKKyAgICBpbnQgICAgICZlbF9udW1iZXIsCisgICAgQ2VhblJlYWRSYW5nZXMqICZwdHJfcmFuZ2VzCispCit7CisgICAgaWYgKGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgIHB0cl9yYW5nZXMgPSBOVUxMOworICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBvZmZzZXQsIHNpemUpOworICAgICAgICBlbF9udW1iZXIgPSBzaXplIC8gZWxfc2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHB0cl9yYW5nZXMgPSBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgZWxfbnVtYmVyID0gKHB0cl9yYW5nZXMtPnJhbmdlX3NpemUgLyBlbF9zaXplKSAqCisgICAgICAgICAgICAgICAgICAgIHB0cl9yYW5nZXMtPnJhbmdlX21heF9udW1iZXI7CisgICAgICAgIHNpemUgPSBwdHJfcmFuZ2VzLT5yYW5nZV9zaXplOworICAgIH0KK30KKworYXJyX2Rlc2MgKiBtYWtlX2Fycl9kZXNjKAorICAgIHZvaWQqICAgcHRyX3ZhbCwKKyAgICBpbnQ2NF90IGV4dGVudF9zdGFydF92YWwsCisgICAgaW50NjRfdCBleHRlbnRfZWxlbWVudHNfdmFsLAorICAgIGludDY0X3Qgc2l6ZQorKQoreworICAgIGFycl9kZXNjICpyZXM7CisgICAgcmVzID0gKGFycl9kZXNjICopbWFsbG9jKHNpemVvZihhcnJfZGVzYykpOworICAgIHJlcy0+YmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdD4ocHRyX3ZhbCk7CisgICAgcmVzLT5yYW5rID0gMTsKKyAgICByZXMtPmRpbVswXS5zaXplID0gc2l6ZTsKKyAgICByZXMtPmRpbVswXS5saW5kZXggPSAwOworICAgIHJlcy0+ZGltWzBdLmxvd2VyID0gZXh0ZW50X3N0YXJ0X3ZhbDsKKyAgICByZXMtPmRpbVswXS51cHBlciA9IGV4dGVudF9lbGVtZW50c192YWwgKyBleHRlbnRfc3RhcnRfdmFsIC0gMTsKKyAgICByZXMtPmRpbVswXS5zdHJpZGUgPSAxOworICAgIHJldHVybiByZXM7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Omdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaW50IGkpCit7CisgICAgaW50ICAgICAgICAgICAgIHBvaW50ZXJzX251bWJlcjsKKyAgICBpbnQgICAgICAgICAgICAgdG1wX3ZhbDsKKyAgICBpbnQgICAgICAgICAgICAgbmV3X2luZGV4ID0gbV92YXJzX3RvdGFsOworICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICBjb25zdCBWYXJEZXNjMyAqdmQzID0gc3RhdGljX2Nhc3Q8Y29uc3QgVmFyRGVzYzMqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICBpbnQgICAgICAgICAgICAgZmxhZ3MgPSB2ZDMtPmFycmF5X2ZpZWxkczsKKyAgICBib29sICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICBSZWFkQXJyRWxlbWVudHM8dm9pZCAqPiAgcHRyOworICAgIFJlYWRBcnJFbGVtZW50czx2b2lkICo+ICBpbnRvOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBleHRfc3RhcnQ7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGV4dF9lbGVtZW50czsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxpZ247CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsbG9jX2lmOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBmcmVlX2lmOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBpbnRvX3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBpbnRvX2VsZW07CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsbG9jX3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19lbGVtOworCisKKyAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5wdHJfYXJyYXkpOworCisgICAgLy8gInBvaW50ZXJzX251bWJlciIgZm9yIHRvdGFsIG51bWJlciBvZiB0cmFuc2ZlcnJlZCBwb2ludGVycy4KKyAgICAvLyBGb3IgZWFjaCBvZiB0aGVtIHdlIGNyZWF0ZSBuZXcgdmFyX2Rlc2MgYW5kIHB1dCBpdCBhdCB0aGUgYm90dG9tCisgICAgLy8gb2YgdGhlIHZhcl9kZXNjJ3MgYXJyYXkKKyAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgc2l6ZW9mKHZvaWQgKiksIHB0ci5vZmZzZXQsIHB0ci5zaXplLAorICAgICAgICBwb2ludGVyc19udW1iZXIsIHB0ci5yYW5nZXMpOworICAgIHB0ci5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworCisgICAgLy8gMi4gcHJlcGFyZSBtZW1vcnkgZm9yIG5ldyB2YXJfZGVzY3MKKyAgICBtX3ZhcnNfdG90YWwgKz0gcG9pbnRlcnNfbnVtYmVyOworICAgIG1fdmFycyAgICAgICA9IChWYXJEZXNjKilyZWFsbG9jKG1fdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICBtX3ZhcnNfZXh0cmEgPQorICAgICAgICAoVmFyRXh0cmEqKXJlYWxsb2MobV92YXJzX2V4dHJhLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRXh0cmEpKTsKKyAgICBtX2luX2RlcHMgICAgPQorICAgICAgICAoQ09JRVZFTlQqKXJlYWxsb2MobV9pbl9kZXBzLCBzaXplb2YoQ09JRVZFTlQpICogKG1fdmFyc190b3RhbCArIDEpKTsKKyAgICBtX291dF9kZXBzICAgPQorICAgICAgICAoQ09JRVZFTlQqKXJlYWxsb2MobV9vdXRfZGVwcywgc2l6ZW9mKENPSUVWRU5UKSAqIG1fdmFyc190b3RhbCk7CisKKyAgICAvLyAzLiBQcmVwYXJlIGZvciByZWFkaW5nIG5ldyB2YXJfZGVzYydzIGZpZWxkcworICAgIC8vICAgIEVYVEVOVCBTVEFSVAorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgZXh0X3N0YXJ0Lm9mZnNldCwKKyAgICAgICAgICAgIGV4dF9zdGFydC5zaXplLCB0bXBfdmFsLCBleHRfc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgZXh0X3N0YXJ0LmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGV4dF9zdGFydC5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgZXh0X3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+ZXh0ZW50X3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZXh0X3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gICAgRVhURU5UIEVMRU1FTlRTIE5VTUJFUgorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwKKyAgICAgICAgICAgIGV4dF9lbGVtZW50cy5vZmZzZXQsIGV4dF9lbGVtZW50cy5zaXplLAorICAgICAgICAgICAgdG1wX3ZhbCwgZXh0X2VsZW1lbnRzLnJhbmdlcyk7CisgICAgICAgIGV4dF9lbGVtZW50cy5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBleHRfZWxlbWVudHMuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGV4dF9lbGVtZW50cy52YWwgPSAoaW50NjRfdCl2ZDMtPmV4dGVudF9lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dF9lbGVtZW50cy52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgQUxMT0NfSUYKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2lmX2FycmF5KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGxvY19pZi5vZmZzZXQsCisgICAgICAgICAgICBhbGxvY19pZi5zaXplLCB0bXBfdmFsLCBhbGxvY19pZi5yYW5nZXMpOworICAgICAgICBhbGxvY19pZi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19pZi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfaWYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsb2NfaWYudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEZSRUVfSUYKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZnJlZV9pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZnJlZV9pZl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgZnJlZV9pZi5vZmZzZXQsCisgICAgICAgICAgICBmcmVlX2lmLnNpemUsIHRtcF92YWwsIGZyZWVfaWYucmFuZ2VzKTsKKyAgICAgICAgZnJlZV9pZi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBmcmVlX2lmLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJmcmVlX2lmIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZyZWVfaWYudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEFMSUdOCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsaWduX2FycmF5KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGlnbi5vZmZzZXQsCisgICAgICAgICAgICBhbGlnbi5zaXplLCB0bXBfdmFsLCBhbGlnbi5yYW5nZXMpOworICAgICAgICBhbGlnbi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGlnbi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxpZ24iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxpZ24udmFsID0gbV92YXJzW2ldLmFsaWduOworICAgIH0KKworICAgIC8vIDMuMSBJTlRPCisKKyAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBpbnRvLm9mZnNldCwKKyAgICAgICAgICAgIGludG8uc2l6ZSwgdG1wX3ZhbCwgaW50by5yYW5nZXMpOworICAgICAgICBpbnRvLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50byIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gMy4yIElOVE9fU1RBUlQKKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBpbnRvX3N0YXJ0Lm9mZnNldCwKKyAgICAgICAgICAgIGludG9fc3RhcnQuc2l6ZSwgdG1wX3ZhbCwgaW50b19zdGFydC5yYW5nZXMpOworICAgICAgICBpbnRvX3N0YXJ0LmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGludG9fc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGludG9fc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5pbnRvX3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50b19zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vIDMuMyBJTlRPX0VMRU1FTlRTCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50b19lbGVtLm9mZnNldCwKKyAgICAgICAgICAgIGludG9fZWxlbS5zaXplLCB0bXBfdmFsLCBpbnRvX2VsZW0ucmFuZ2VzKTsKKyAgICAgICAgaW50b19lbGVtLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGludG9fZWxlbS5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgaW50b19lbGVtLnZhbCA9IChpbnQ2NF90KXZkMy0+aW50b19lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludG9fZWxlbS52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgYWxsb2Nfc3RhcnQKKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsCisgICAgICAgICAgICBhbGxvY19zdGFydC5vZmZzZXQsIGFsbG9jX3N0YXJ0LnNpemUsIHRtcF92YWwsCisgICAgICAgICAgICBhbGxvY19zdGFydC5yYW5nZXMpOworICAgICAgICBhbGxvY19zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19zdGFydC5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBhbGxvY19zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmFsbG9jX3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsb2Nfc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAgICBhbGxvY19lbGVtCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGxvY19lbGVtLm9mZnNldCwKKyAgICAgICAgICAgIGFsbG9jX2VsZW0uc2l6ZSwgdG1wX3ZhbCwgYWxsb2NfZWxlbS5yYW5nZXMpOworICAgICAgICBhbGxvY19lbGVtLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGFsbG9jX2VsZW0uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGxvY19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGFsbG9jX2VsZW0udmFsID0gKGludDY0X3QpdmQzLT5hbGxvY19lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX2VsZW0udmFsID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHBvaW50ZXJzX251bWJlcjsgaysrKSB7CisgICAgICAgIGludCB0eXBlID0gZmxhZ3MgJiAweDNmOworICAgICAgICBpbnQgdHlwZV9zcmMsIHR5cGVfZHN0OworICAgICAgICAvLyAgR2V0IG5ldyB2YWx1ZXMKKyAgICAgICAgLy8gdHlwZV9zcmMsIHR5cGVfZHN0CisgICAgICAgIHR5cGVfc3JjID0gdHlwZV9kc3QgPSAodHlwZSA9PSBjX2RhdGFfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2RhdGFfcHRyICAgOiAodHlwZSA9PSBjX2Z1bmNfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2Z1bmNfcHRyICAgOiAodHlwZSA9PSBjX3ZvaWRfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcHRyICAgOiAodHlwZSA9PSBjX3N0cmluZ19wdHJfYXJyYXkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RyaW5nX3B0ciA6IDA7CisKKyAgICAgICAgLy8gR2V0IHB0ciB2YWwKKyAgICAgICAgaWYgKCFwdHIucmVhZF9uZXh0KHRydWUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHB0ci52YWwgPSAodm9pZCopKHB0ci5iYXNlICsgcHRyLm9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAhISEgSWYgd2UgZ290IGVycm9yIGF0IHBoYXNlIG9mIHJlYWRpbmcgLSBpdCdzIGFuIGludGVybmFsCisgICAgICAgIC8vICEhISBlcnJvciwgYXMgd2UgbXVzdCBkZXRlY3QgbWlzbWF0Y2ggYmVmb3JlCisKKyAgICAgICAgLy8gR2V0IGludG8gdmFsCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgaWYgKCFpbnRvLnJlYWRfbmV4dCh0cnVlKSkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50byIpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnRvLnZhbCA9ICh2b2lkKikoaW50by5iYXNlICsgaW50by5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG90aGVyIGNvbXBvbmVudHMgb2YgdGhlIGNsYXVzZQorICAgICAgICBpZiAoIWV4dF9zdGFydC5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFleHRfZWxlbWVudHMucmVhZF9uZXh0KAorICAgICAgICAgICAgICAgIGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2NfaWYucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19pZiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZyZWVfaWYucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfZnJlZV9pZl9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImZyZWVfaWYiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGlnbi5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19hbGlnbl9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsaWduIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghaW50b19zdGFydC5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnRvX2VsZW0ucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2Nfc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGxvY19lbGVtLnJlYWRfbmV4dCgKKyAgICAgICAgICAgICAgICAgZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorCisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5kaXJlY3Rpb24uYml0cyA9IG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0czsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jX2lmID0gYWxsb2NfaWYudmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZnJlZV9pZiA9IGZyZWVfaWYudmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uYWxpZ24gPSBhbGlnbi52YWw7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5taWNfb2Zmc2V0ID0gMDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmZsYWdzLmJpdHMgPSBtX3ZhcnNbaV0uZmxhZ3MuYml0czsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLm9mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5zaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgaWYgKGV4dF9zdGFydC52YWwgPT0gMCkgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmNvdW50ID0gZXh0X2VsZW1lbnRzLnZhbDsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5wdHIgPSBwdHIudmFsOworICAgICAgICAgICAgaWYgKHR5cGVfc3JjID09IGNfc3RyaW5nX3B0cikgeworICAgICAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5zaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5jb3VudCA9IDA7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ucHRyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBwdHIudmFsLAorICAgICAgICAgICAgICAgIGV4dF9zdGFydC52YWwsCisgICAgICAgICAgICAgICAgZXh0X2VsZW1lbnRzLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworCisgICAgICAgICAgICB0eXBlX3NyYyA9IHR5cGVfc3JjID09IGNfZGF0YV9wdHIgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RyaW5nX3B0ciA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcmM7CisgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgdHlwZV9kc3QgPSB0eXBlX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byAmJiBpbnRvX2VsZW0udmFsICE9IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5pbnRvID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBpbnRvLnZhbCwKKyAgICAgICAgICAgICAgICBpbnRvX3N0YXJ0LnZhbCwKKyAgICAgICAgICAgICAgICBpbnRvX2VsZW0udmFsLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKSk7CisgICAgICAgICAgICB0eXBlX2RzdCA9ICh0eXBlID09IGNfZGF0YV9wdHJfYXJyYXkpID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBjX3N0cmluZ19wdHJfYXJyYXkpID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uaW50byA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWxsb2NfZWxlbS52YWwgIT0gMCkgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBwdHIudmFsLAorICAgICAgICAgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCwKKyAgICAgICAgICAgICAgICBhbGxvY19lbGVtLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS50eXBlLnNyYyA9IHR5cGVfc3JjOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10udHlwZS5kc3QgPSB0eXBlX2RzdDsKKworICAgICAgICBtX3ZhcnNfZXh0cmFbbmV3X2luZGV4ICsga10uaXNfYXJyX3B0cl9lbCA9IDE7CisgICAgICAgIG1fdmFyc19leHRyYVtuZXdfaW5kZXggKyBrXS5wdHJfYXJyX29mZnNldCA9CisgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyA/IHB0ci5vZmZzZXQgOiBpbnRvLm9mZnNldDsKKyAgICB9CisgICAgLy8gY291bnQgYW5kIGFsbG9jIGZpZWxkcyBhcmUgdXNlbGVzcyBhdCB0YXJnZXQuIFRoZXkgY2FuIGJlIHJldXNlZAorICAgIC8vIGZvciBwb2ludGVyIGFycmF5cy4KKyAgICBtX3ZhcnNbaV0uY291bnQgPSBwb2ludGVyc19udW1iZXI7CisgICAgbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0ID0gbmV3X2luZGV4OworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiQ2xlYW51cCBvZmZsb2FkIGxpYnJhcnkgLi4uXG4iKTsKKyAgICBpZiAobWljX2VuZ2luZXNfdG90YWwgPiAwKSB7CisgICAgICAgIGRlbGV0ZVtdIG1pY19lbmdpbmVzOworCisgICAgICAgIGlmIChtaWNfcHJveHlfZnNfcm9vdCAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1pY19wcm94eV9mc19yb290KTsKKyAgICAgICAgICAgIG1pY19wcm94eV9mc19yb290ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaWNfbGlicmFyeV9wYXRoICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobWljX2xpYnJhcnlfcGF0aCk7CisgICAgICAgICAgICBtaWNfbGlicmFyeV9wYXRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc3Ryb3kgdGhyZWFkIGtleQorICAgICAgICB0aHJlYWRfa2V5X2RlbGV0ZShtaWNfdGhyZWFkX2tleSk7CisgICAgfQorCisgICAgLy8gdW5sb2FkIENPSSBsaWJyYXJ5CisgICAgaWYgKENPSTo6aXNfYXZhaWxhYmxlKSB7CisgICAgICAgIENPSTo6ZmluaSgpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkNsZWFudXAgb2ZmbG9hZCBsaWJyYXJ5IC4uLiBkb25lXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKHZvaWQpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICB1aW50MzJfdCBudW1fZGV2aWNlczsKKyAgICBzdGQ6OmJpdHNldDxNSUNfRU5HSU5FU19NQVg+IGRldmljZXM7CisKKyAgICBwcmVmaXggPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2hvc3QpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0cmFjZQorICAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSBnZXRlbnYoaHRyYWNlX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgY29uc29sZV9lbmFibGVkID0gbmV3X3ZhbCAmIDB4MGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfcmVwb3J0X2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IGVudl92YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBlbnZfdmFsKSkgeworICAgICAgICAgICAgaWYgKGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMSB8fAorICAgICAgICAgICAgICAgIGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMiB8fAorICAgICAgICAgICAgICAgIGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMykgeworICAgICAgICAgICAgICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZW52X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghb2ZmbG9hZF9yZXBvcnRfbGV2ZWwpIHsKKyAgICAgICAgZW52X3ZhciA9IGdldGVudih0aW1lcl9lbnZuYW1lKTsKKyAgICAgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgICAgICB0aW1lcl9lbmFibGVkID0gYXRvaShlbnZfdmFyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgQ09JCisgICAgaWYgKCFDT0k6OmluaXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZ2V0IG51bWJlciBvZiBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtCisgICAgcmVzID0gQ09JOjpFbmdpbmVHZXRDb3VudChDT0lfSVNBX0tOQywgJm51bV9kZXZpY2VzKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobnVtX2RldmljZXMgPiBNSUNfRU5HSU5FU19NQVgpIHsKKyAgICAgICAgbnVtX2RldmljZXMgPSBNSUNfRU5HSU5FU19NQVg7CisgICAgfQorCisgICAgLy8gZmlsbCBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9mZmxvYWRpbmcKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJPRkZMT0FEX0RFVklDRVMiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwKSB7CisgICAgICAgIGlmIChzdHJjYXNlY21wKGVudl92YXIsICJub25lIikgIT0gMCkgeworICAgICAgICAgICAgLy8gdmFsdWUgaXMgY29tcG9zZWQgb2YgY29tbWEgc2VwYXJhdGVkIHBoeXNpY2FsIGRldmljZSBpbmRleGVzCisgICAgICAgICAgICBjaGFyICpidWYgPSBzdHJkdXAoZW52X3Zhcik7CisgICAgICAgICAgICBjaGFyICpzdHIsICpwdHI7CisgICAgICAgICAgICBmb3IgKHN0ciA9IHN0cnRva19yKGJ1ZiwgIiwiLCAmcHRyKTsgc3RyICE9IDA7CisgICAgICAgICAgICAgICAgIHN0ciA9IHN0cnRva19yKDAsICIsIiwgJnB0cikpIHsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBhbiBpbnQKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG51bTsKKyAgICAgICAgICAgICAgICBpZiAoIV9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKHN0ciwgbnVtKSkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQ1KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byB1c2luZyBhbGwgaW5zdGFsbGVkIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtIDwgMCB8fCBudW0gPj0gbnVtX2RldmljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NiwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KG51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIGRldmljZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICBDT0lFTkdJTkUgZW5naW5lOworICAgICAgICAgICAgcmVzID0gQ09JOjpFbmdpbmVHZXRIYW5kbGUoQ09JX0lTQV9LTkMsIGksICZlbmdpbmUpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWljX2VuZ2luZXNfdG90YWwgPSBkZXZpY2VzLmNvdW50KCk7CisKKyAgICAvLyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZXJlIGFyZSBubyBkZXZpY2VzIHRvIG9mZmxvYWQgdG8KKyAgICBpZiAobWljX2VuZ2luZXNfdG90YWwgPD0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBpbmRleGVzIGZvciBhdmFpbGFibGUgZGV2aWNlcworICAgIG1pY19lbmdpbmVzID0gbmV3IEVuZ2luZVttaWNfZW5naW5lc190b3RhbF07CisgICAgZm9yIChpbnQgcF9pZHggPSAwLCBsX2lkeCA9IDA7IHBfaWR4IDwgbnVtX2RldmljZXM7IHBfaWR4KyspIHsKKyAgICAgICAgaWYgKGRldmljZXNbcF9pZHhdKSB7CisgICAgICAgICAgICBtaWNfZW5naW5lc1tsX2lkeF0uc2V0X2luZGV4ZXMobF9pZHgsIHBfaWR4KTsKKyAgICAgICAgICAgIGxfaWR4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZvciBkZXZpY2UgYmluYXJpZXMKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfTERfTElCUkFSWV9QQVRIIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICBtaWNfbGlicmFyeV9wYXRoID0gc3RyZHVwKGVudl92YXIpOworICAgIH0KKworICAgIC8vIG1lbW9yeSBzaXplIHJlc2VydmVkIGZvciBDT0kgYnVmZmVycworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19CVUZGRVJTSVpFIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIG1pY19idWZmZXJfc2l6ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgIk1JQ19CVUZGRVJTSVpFIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgc3RhY2tzaXplIGZvciB0aGUgcGlwZWxpbmUgb24gdGhlIGRldmljZQorICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19TVEFDS1NJWkUiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpICYmCisgICAgICAgICAgICAobmV3X3NpemUgPj0gMTYzODQpICYmICgobmV3X3NpemUgJiA0MDk1KSA9PSAwKSkgeworICAgICAgICAgICAgbWljX3N0YWNrX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJveHkgSS9PCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1BST1hZX0lPIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBtaWNfcHJveHlfaW8gPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsICJNSUNfUFJPWFlfSU8iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfUFJPWFlfRlNfUk9PVCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MgdXNpbmcgdGhlIGZvbGxvd2luZworICAgIC8vIHJ1bGVzCisgICAgLy8gLSBJZiBNSUNfRU5WX1BSRUZJWCBpcyBzZXQgdGhlbiBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gdGhlCisgICAgLy8gICBob3N0IHdoaWNoIGhhcyB0aGF0IHByZWZpeCBhcmUgY29waWVkIHRvIHRoZSBkZXZpY2Ugd2l0aG91dAorICAgIC8vICAgdGhlIHByZWZpeC4KKyAgICAvLyAgIEFsbCBvdGhlciBob3N0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgaWdub3JlZC4KKyAgICAvLyAtIElmIE1JQ19FTlZfUFJFRklYIGlzIG5vdCBzZXQgb3IgaWYgTUlDX0VOVl9QUkVGSVg9IiIgdGhlbiBob3N0CisgICAgLy8gICBlbnZpcm9ubWVudCBpcyBkdXBsaWNhdGVkLgorICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19FTlZfUFJFRklYIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIG1pY19lbnZfdmFycy5zZXRfcHJlZml4KGVudl92YXIpOworCisgICAgICAgIGludCBsZW4gPSBzdHJsZW4oZW52X3Zhcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBlbnZpcm9uW2ldICE9IDA7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoZW52aXJvbltpXSwgZW52X3ZhciwgbGVuKSA9PSAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChlbnZpcm9uW2ldLCAiTUlDX0xEX0xJQlJBUllfUEFUSCIsIDE5KSAhPSAwICYmCisgICAgICAgICAgICAgICAgZW52aXJvbltpXVtsZW5dICE9ICc9JykgeworICAgICAgICAgICAgICAgIG1pY19lbnZfdmFycy5hbmFseXplX2Vudl92YXIoZW52aXJvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjcmVhdGUga2V5IGZvciB0aHJlYWQgZGF0YQorICAgIGlmICh0aHJlYWRfa2V5X2NyZWF0ZSgmbWljX3RocmVhZF9rZXksIEVuZ2luZTo6ZGVzdHJveV90aHJlYWRfZGF0YSkpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NCwgZXJybm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY3B1IGZyZXF1ZW5jeQorICAgIGNwdV9mcmVxdWVuY3kgPSBDT0k6OlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSgpOworCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY191c2VfMm1iX2J1ZmZlcnNfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG1pY191c2VfYXN5bmNfYnVmZmVyX3dyaXRlX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG1pY191c2VfYXN5bmNfYnVmZmVyX3JlYWRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSkgeworICAgICAgICAgICAgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCA9IG5ld19zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWljIGluaXRpYWxpemF0aW9uIHR5cGUKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfaW5pdF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fb2ZmbG9hZCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX29mZmxvYWRfYWxsIikgPT0gMCkgeworICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9IGNfaW5pdF9vbl9vZmZsb2FkX2FsbDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVudl92YXIsICJvbl9zdGFydCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fc3RhcnQ7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLCBvZmZsb2FkX2luaXRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhY3RpdmUgd2FpdAorICAgIGVudl92YXIgPSBnZXRlbnYob2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG9tcCBkZXZpY2UgbnVtCisgICAgZW52X3ZhciA9IGdldGVudihvbXBfZGV2aWNlX251bV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkgJiYgbmV3X3ZhbCA+PSAwKSB7CisgICAgICAgICAgICBfX29tcF9kZXZpY2VfbnVtID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2RldmljZV9udW1fZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0IE9SU0wKKyAgICBPUlNMOjppbml0KCk7Cit9CisKK2V4dGVybiBpbnQgX19vZmZsb2FkX2luaXRfbGlicmFyeSh2b2lkKQoreworICAgIC8vIGRvIG9uZSB0aW1lIGludGlhbGl6YXRpb24KKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKTsKKworICAgIC8vIG9mZmxvYWQgaXMgYXZhaWxhYmxlIGlmIENPSSBpcyBhdmFpbGFibGUgYW5kIHRoZSBudW1iZXIgb2YgZGV2aWNlcyA+IDAKKyAgICBib29sIGlzX2F2YWlsYWJsZSA9IENPSTo6aXNfYXZhaWxhYmxlICYmIChtaWNfZW5naW5lc190b3RhbCA+IDApOworCisgICAgLy8gcmVnaXN0ZXIgcGVuZGluZyBsaWJyYXJpZXMgaWYgdGhlcmUgYXJlIGFueQorICAgIGlmIChpc19hdmFpbGFibGUgJiYgX190YXJnZXRfbGlicykgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoX190YXJnZXRfbGlic19sb2NrKTsKKworICAgICAgICBmb3IgKFRhcmdldEltYWdlTGlzdDo6aXRlcmF0b3IgaXQgPSBfX3RhcmdldF9saWJzX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBfX3RhcmdldF9saWJzX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgaW4gQ09JCisgICAgICAgICAgICBDT0k6OlByb2Nlc3NSZWdpc3RlckxpYnJhcmllcygxLCAmaXQtPmRhdGEsICZpdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdC0+b3JpZ2luLCAmaXQtPm9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIGFkZCBsaWIgdG8gYWxsIGVuZ2luZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmFkZF9saWIoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9fdGFyZ2V0X2xpYnMgPSBmYWxzZTsKKyAgICAgICAgX190YXJnZXRfbGlic19saXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGlzX2F2YWlsYWJsZTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkICp0YXJnZXRfaW1hZ2UpCit7CisgICAgY29uc3Qgc3RydWN0IEltYWdlICppbWFnZSA9IHN0YXRpY19jYXN0PGNvbnN0IHN0cnVjdCBJbWFnZSo+KHRhcmdldF9pbWFnZSk7CisKKyAgICAvLyBkZWNvZGUgaW1hZ2UKKyAgICBjb25zdCBjaGFyICpuYW1lID0gaW1hZ2UtPmRhdGE7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGltYWdlLT5kYXRhICsgc3RybGVuKGltYWdlLT5kYXRhKSArIDE7CisgICAgdWludDY0X3QgICAgc2l6ZSA9IGltYWdlLT5zaXplOworICAgIGNvbnN0IGNoYXIgKm9yaWdpbiA9IDA7CisgICAgdWludDY0X3QgICAgb2Zmc2V0ID0gMDsKKworICAgIC8vIG91ciBhY3Rpb25zIGRlcGVuZCBvbiB0aGUgaW1hZ2UgdHlwZQorICAgIGNvbnN0IEVsZjY0X0VoZHIgKmhkciA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZjY0X0VoZHIqPihkYXRhKTsKKyAgICBzd2l0Y2ggKGhkci0+ZV90eXBlKSB7CisgICAgICAgIGNhc2UgRVRfRVhFQzoKKyAgICAgICAgICAgIC8vIEVhY2ggb2ZmbG9hZCBhcHBsaWNhdGlvbiBpcyBzdXBwb3NlZCB0byBoYXZlIG9ubHkgb25lIHRhcmdldAorICAgICAgICAgICAgLy8gaW1hZ2UgcmVwcmVzZW50aW5nIHRhcmdldCBleGVjdXRhYmxlLgorICAgICAgICAgICAgLy8gTm8gdGhyZWFkIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBoZXJlIGFzIHRoZSBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgLy8gY29kZSBpcyBhbHdheXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fdGFyZ2V0X2V4ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX211bHRpcGxlX3RhcmdldF9leGVzKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX190YXJnZXRfZXhlID0gbmV3IFRhcmdldEltYWdlKG5hbWUsIGRhdGEsIHNpemUsIG9yaWdpbiwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIGNvZGUgZm9yIGV4ZWNzIGlzIGFsd2F5cyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dAorICAgICAgICAgICAgLy8gb2YgbWFpbiBhbmQgdGh1cyB3ZSBjYW4gc2FmZWx5IGNhbGwgYW55IGZ1bmN0aW9uIGhlcmUsCisgICAgICAgICAgICAvLyBpbmNsdWRpbmcgTG9hZExpYnJhcnkgQVBJIG9uIHdpbmRvd3MuIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlCisgICAgICAgICAgICAvLyB3ZSBkbyB0aGUgb2ZmbG9hZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgaWYgKF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKSkgeworICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZW5naW5lIGlmIGluaXRfdHlwZSBpcyBvbl9zdGFydAorICAgICAgICAgICAgICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9zdGFydCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVRfRFlOOgorICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIGNvZGUgZm9yIGxpYnJhcmllcyBpcyBjYWxsZWQgZnJvbSB0aGUgRGxsTWFpbgorICAgICAgICAgICAgLy8gY29udGV4dCAob24gd2luZG93cykgYW5kIHRodXMgd2UgY2Fubm90IGRvIGFueXRoaW5nIHVzZWZ1bAorICAgICAgICAgICAgLy8gaGVyZS4gU28gd2UganVzdCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGVuZGluZyBsaWJyYXJpZXMgZm9yCisgICAgICAgICAgICAvLyB0aGUgbGF0ZXIgdXNlLgorICAgICAgICAgICAgX190YXJnZXRfbGlic19sb2NrLmxvY2soKTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnMgPSB0cnVlOworICAgICAgICAgICAgX190YXJnZXRfbGlic19saXN0LnB1c2hfYmFjayhUYXJnZXRJbWFnZShuYW1lLCBkYXRhLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sIG9mZnNldCkpOworICAgICAgICAgICAgX190YXJnZXRfbGlic19sb2NrLnVubG9jaygpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBkZWZpbml0ZWx5IHdyb25nLCBpc3N1ZSBhbiBlcnJvciBhbmQgZXhpdAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fYmluYXJ5X3R5cGUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkICp0YXJnZXRfaW1hZ2UpCit7CisgICAgLy8gVGFyZ2V0IGltYWdlIGlzIHBhY2tlZCBhcyBmb2xsb3dzOgorICAgIC8vICAgICAgOCBieXRlcyAgICAgICAgICAgICAgICAtIHNpemUgb2YgdGhlIHRhcmdldCBiaW5hcnkKKyAgICAvLyAgICAgIG51bGwtdGVybWluYXRlZCBzdHJpbmcgLSBiaW5hcnkgbmFtZQorICAgIC8vICAgICAgPHNpemU+IGJ5dGVzICAgICAgICAgICAtIGJpbmFyeSBjb250ZW50cworICAgIGNvbnN0IHN0cnVjdCBJbWFnZSB7CisgICAgICAgICBpbnQ2NF90IHNpemU7CisgICAgICAgICBjaGFyIGRhdGFbXTsKKyAgICB9ICppbWFnZSA9IHN0YXRpY19jYXN0PGNvbnN0IHN0cnVjdCBJbWFnZSo+KHRhcmdldF9pbWFnZSk7CisKKyAgICAvLyBkZWNvZGUgaW1hZ2UKKyAgICBjb25zdCBjaGFyICpuYW1lID0gaW1hZ2UtPmRhdGE7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGltYWdlLT5kYXRhICsgc3RybGVuKGltYWdlLT5kYXRhKSArIDE7CisKKyAgICAvLyBvdXIgYWN0aW9ucyBkZXBlbmQgb24gdGhlIGltYWdlIHR5cGUKKyAgICBjb25zdCBFbGY2NF9FaGRyICpoZHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGY2NF9FaGRyKj4oZGF0YSk7CisgICAgaWYgKGhkci0+ZV90eXBlID09IEVUX0VYRUMpIHsKKyAgICAgICAgLy8gV2UgYXJlIGV4ZWN1dGluZyBleGVjJ3MgZGVzY3RydWN0b3JzLgorICAgICAgICAvLyBJdCBpcyB0aW1lIHRvIGRvIGEgbGlicmFyeSBjbGVhbnVwLgorICAgICAgICBpZiAodGltZXJfZW5hYmxlZCkgeworICAgICAgICAgICAgT2ZmbG9hZF9UaW1lcl9QcmludCgpOworICAgICAgICB9CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICAgICBfX29mZmxvYWRfbXlvRmluaSgpOworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKyAgICAgICAgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSgpOworICAgIH0KK30KKworLy8gUnVudGltZSB0cmFjZSBpbnRlcmZhY2UgZm9yIHVzZXIgcHJvZ3JhbXMKKwordm9pZCBfX29mZmxvYWRfY29uc29sZV90cmFjZShpbnQgbGV2ZWwpCit7CisgICAgY29uc29sZV9lbmFibGVkID0gbGV2ZWw7Cit9CisKKy8vIFVzZXItdmlzaWJsZSBvZmZsb2FkIEFQSQorCitpbnQgX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXModm9pZCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcih2b2lkKQoreworICAgIHJldHVybiAtMTsKK30KKworaW50IF9PZmZsb2FkX3NpZ25hbGVkKGludCBpbmRleCwgdm9pZCAqc2lnbmFsKQoreworICAgIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKworICAgIC8vIGNoZWNrIGluZGV4IHZhbHVlCisgICAgaWYgKGluZGV4IDwgMCB8fCBtaWNfZW5naW5lc190b3RhbCA8PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX3NpZ25hbGVkMSwgaW5kZXgpOworICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgIH0KKworICAgIC8vIGZpbmQgYXNzb2NpYXRlZCBhc3luYyB0YXNrCisgICAgT2ZmbG9hZERlc2NyaXB0b3IgKnRhc2sgPQorICAgICAgICBtaWNfZW5naW5lc1tpbmRleCAlIG1pY19lbmdpbmVzX3RvdGFsXS5maW5kX3NpZ25hbChzaWduYWwsIGZhbHNlKTsKKyAgICBpZiAodGFzayA9PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX3NpZ25hbGVkMiwgc2lnbmFsKTsKKyAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICB9CisKKyAgICByZXR1cm4gdGFzay0+aXNfc2lnbmFsZWQoKTsKK30KKwordm9pZCBfT2ZmbG9hZF9yZXBvcnQoaW50IHZhbCkKK3sKKyAgICBpZiAodmFsID09IE9GRkxPQURfUkVQT1JUX09OIHx8CisgICAgICAgIHZhbCA9PSBPRkZMT0FEX1JFUE9SVF9PRkYpIHsKKyAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCA9IHZhbDsKKyAgICB9Cit9CisKKy8vIElEQiBzdXBwb3J0CitpbnQgICBfX2RiZ19pc19hdHRhY2hlZCA9IDA7CitpbnQgICBfX2RiZ190YXJnZXRfaWQgPSAtMTsKK3BpZF90IF9fZGJnX3RhcmdldF9zb19waWQgPSAtMTsKK2NoYXIgIF9fZGJnX3RhcmdldF9leGVfbmFtZVtNQVhfVEFSR0VUX05BTUVdID0gezB9OworY29uc3QgaW50IF9fZGJnX2FwaV9tYWpvcl92ZXJzaW9uID0gMTsKK2NvbnN0IGludCBfX2RiZ19hcGlfbWlub3JfdmVyc2lvbiA9IDA7CisKK3ZvaWQgX19kYmdfdGFyZ2V0X3NvX2xvYWRlZCgpCit7Cit9Cit2b2lkIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpCit7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmggYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMzk5NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuaApAQCAtMCwwICsxLDM0MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIHBhcnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgdXNlZCBvbmx5IG9uIHRoZSBob3N0CisqLworCisjaWZuZGVmIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2VuZ2luZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfZW52LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9vcnNsLmgiCisjaW5jbHVkZSAiY29pL2NvaV9jbGllbnQuaCIKKworLy8gTUlDIGVuZ2luZXMuCitleHRlcm4gRW5naW5lKiAgbWljX2VuZ2luZXM7CitleHRlcm4gdWludDMyX3QgbWljX2VuZ2luZXNfdG90YWw7CisKKy8vISBUaGUgdGFyZ2V0IGltYWdlIGlzIHBhY2tlZCBhcyBmb2xsb3dzLgorLyohICAgICAgMS4gOCBieXRlcyBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSB0YXJnZXQgYmluYXJ5ICAgICAgICAgICovCisvKiEgICAgICAyLiBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgd2hpY2ggaXMgdGhlIGJpbmFyeSBuYW1lICAgICAgICAgKi8KKy8qISAgICAgIDMuIDxzaXplPiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbWFnZSAqLworLyohICAgICAgVGhlIGFkZHJlc3Mgb2Ygc3ltYm9sIF9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UKKyAgICAgICAgICAgICBpcyB0aGUgYWRkcmVzcyBvZiB0aGlzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IEltYWdlIHsKKyAgICAgaW50NjRfdCBzaXplOyAvLyE8IFNpemUgaW4gYnl0ZXMgb2YgdGhlIHRhcmdldCBiaW5hcnkgbmFtZSBhbmQgY29udGVudHMKKyAgICAgY2hhciBkYXRhW107ICAvLyE8IFRoZSBuYW1lIGFuZCBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IGltYWdlCit9OworCisvLyBUaGUgb2ZmbG9hZCBkZXNjcmlwdG9yLgorY2xhc3MgT2ZmbG9hZERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBPZmZsb2FkRGVzY3JpcHRvcigKKyAgICAgICAgaW50IGluZGV4LAorICAgICAgICBfT2ZmbG9hZF9zdGF0dXMgKnN0YXR1cywKKyAgICAgICAgYm9vbCBpc19tYW5kYXRvcnksCisgICAgICAgIGJvb2wgaXNfb3Blbm1wLAorICAgICAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEKKyAgICApIDoKKyAgICAgICAgbV9kZXZpY2UobWljX2VuZ2luZXNbaW5kZXggJSBtaWNfZW5naW5lc190b3RhbF0pLAorICAgICAgICBtX2lzX21hbmRhdG9yeShpc19tYW5kYXRvcnkpLAorICAgICAgICBtX2lzX29wZW5tcChpc19vcGVubXApLAorICAgICAgICBtX2lub3V0X2J1ZigwKSwKKyAgICAgICAgbV9mdW5jX2Rlc2MoMCksCisgICAgICAgIG1fZnVuY19kZXNjX3NpemUoMCksCisgICAgICAgIG1faW5fZGVwcygwKSwKKyAgICAgICAgbV9pbl9kZXBzX3RvdGFsKDApLAorICAgICAgICBtX291dF9kZXBzKDApLAorICAgICAgICBtX291dF9kZXBzX3RvdGFsKDApLAorICAgICAgICBtX3ZhcnMoMCksCisgICAgICAgIG1fdmFyc19leHRyYSgwKSwKKyAgICAgICAgbV9zdGF0dXMoc3RhdHVzKSwKKyAgICAgICAgbV90aW1lcl9kYXRhKHRpbWVyX2RhdGEpCisgICAge30KKworICAgIH5PZmZsb2FkRGVzY3JpcHRvcigpCisgICAgeworICAgICAgICBpZiAobV9pbl9kZXBzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV9pbl9kZXBzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9vdXRfZGVwcyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fb3V0X2RlcHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtX2Z1bmNfZGVzYyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fZnVuY19kZXNjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV92YXJzKTsKKyAgICAgICAgICAgIGZyZWUobV92YXJzX2V4dHJhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgb2ZmbG9hZChjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICBWYXJEZXNjICp2YXJzLCBWYXJEZXNjMiAqdmFyczIsIGludCB2YXJzX3RvdGFsLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqd2FpdHMsIGludCBudW1fd2FpdHMsIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgICAgICAgICAgICAgIGludCBlbnRyeV9pZCwgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcik7CisgICAgYm9vbCBvZmZsb2FkX2ZpbmlzaCgpOworCisgICAgYm9vbCBpc19zaWduYWxlZCgpOworCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIGdldF90aW1lcl9kYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV90aW1lcl9kYXRhOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIHdhaXRfZGVwZW5kZW5jaWVzKGNvbnN0IHZvaWQgKip3YWl0cywgaW50IG51bV93YWl0cyk7CisgICAgYm9vbCBzZXR1cF9kZXNjcmlwdG9ycyhWYXJEZXNjICp2YXJzLCBWYXJEZXNjMiAqdmFyczIsIGludCB2YXJzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudHJ5X2lkLCBjb25zdCB2b2lkICpzdGFja19hZGRyKTsKKyAgICBib29sIHNldHVwX21pc2NfZGF0YShjb25zdCBjaGFyICpuYW1lKTsKKyAgICBib29sIHNlbmRfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpOworICAgIGJvb2wgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgaW50IGksCisgICAgICAgIFB0ckRhdGEqIHNyY19idWYsCisgICAgICAgIFB0ckRhdGEqIGRzdF9idWYsCisgICAgICAgIENPSUVWRU5UICpldmVudCk7CisgICAgYm9vbCByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICBpbnQgaSwKKyAgICAgICAgY2hhciogc3JjX2RhdGEsCisgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmLAorICAgICAgICBDT0lFVkVOVCAqZXZlbnQpOworCisgICAgYm9vbCBnYXRoZXJfY29weWluX2RhdGEoKTsKKworICAgIGJvb2wgY29tcHV0ZSgpOworCisgICAgYm9vbCByZWNlaXZlX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKTsKKyAgICBib29sIHNjYXR0ZXJfY29weW91dF9kYXRhKCk7CisKKyAgICB2b2lkIGNsZWFudXAoKTsKKworICAgIGJvb2wgZmluZF9wdHJfZGF0YShQdHJEYXRhKiAmcHRyX2RhdGEsIHZvaWQgKmJhc2UsIGludDY0X3QgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsIGJvb2wgZXJyb3JfZG9lc19ub3RfZXhpc3QgPSB0cnVlKTsKKyAgICBib29sIGFsbG9jX3B0cl9kYXRhKFB0ckRhdGEqICZwdHJfZGF0YSwgdm9pZCAqYmFzZSwgaW50NjRfdCBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsIGludDY0X3QgYWxsb2NfZGlzcCwgaW50IGFsaWduKTsKKyAgICBib29sIGluaXRfc3RhdGljX3B0cl9kYXRhKFB0ckRhdGEgKnB0cl9kYXRhKTsKKyAgICBib29sIGluaXRfbWljX2FkZHJlc3MoUHRyRGF0YSAqcHRyX2RhdGEpOworICAgIGJvb2wgb2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcihjb25zdCB2b2lkICogc3RhY2tfYmVnaW4sIGludCByb3V0aW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBhbGlnbiwgYm9vbCAqaXNfbmV3KTsKKyAgICBib29sIG51bGxpZnlfdGFyZ2V0X3N0YWNrKENPSUJVRkZFUiB0YXJnX2J1ZiwgdWludDY0X3Qgc2l6ZSk7CisKKyAgICBib29sIGdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaW50IGkpOworCisgICAgdm9pZCByZXBvcnRfY29pX2Vycm9yKGVycm9yX3R5cGVzIG1zZywgQ09JUkVTVUxUIHJlcyk7CisgICAgX09mZmxvYWRfcmVzdWx0IHRyYW5zbGF0ZV9jb2lfZXJyb3IoQ09JUkVTVUxUIHJlcykgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8Q09JQlVGRkVSPiBCdWZmZXJMaXN0OworCisgICAgLy8gZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCB2YXJpYWJsZSBkZXNjcmlwdG9yCisgICAgc3RydWN0IFZhckV4dHJhIHsKKyAgICAgICAgUHRyRGF0YSogc3JjX2RhdGE7CisgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhOworICAgICAgICBBdXRvRGF0YSogYXV0b19kYXRhOworICAgICAgICBpbnQ2NF90IGNwdV9kaXNwOworICAgICAgICBpbnQ2NF90IGNwdV9vZmZzZXQ7CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICpyZWFkX3JuZ19zcmM7CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICpyZWFkX3JuZ19kc3Q7CisgICAgICAgIGludDY0X3QgcHRyX2Fycl9vZmZzZXQ7CisgICAgICAgIGJvb2wgaXNfYXJyX3B0cl9lbDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVhZEFyckVsZW1lbnRzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlYWRBcnJFbGVtZW50cygpOgorICAgICAgICAgICAgcmFuZ2VzKE5VTEwpLAorICAgICAgICAgICAgZWxfc2l6ZShzaXplb2YoVCkpLAorICAgICAgICAgICAgb2Zmc2V0KDApLAorICAgICAgICAgICAgY291bnQoMCksCisgICAgICAgICAgICBpc19lbXB0eSh0cnVlKSwKKyAgICAgICAgICAgIGJhc2UoTlVMTCkKKyAgICAgICAge30KKworICAgICAgICBib29sIHJlYWRfbmV4dChib29sIGZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmbGFnICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNfZW1wdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShyYW5nZXMsICZvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2VzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBjb250aWd1b3VzIGVsZW1lbnRzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9jdXIgPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGVsX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCA9IChUKWdldF9lbF92YWx1ZShiYXNlLCBvZmZzZXQsIGVsX3NpemUpOworICAgICAgICAgICAgICAgIGxlbmd0aF9jdXIgLT0gZWxfc2l6ZTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGlzX2VtcHR5ID0gbGVuZ3RoX2N1ciA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICBwdWJsaWM6CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICogcmFuZ2VzOworICAgICAgICBUICAgICAgIHZhbDsKKyAgICAgICAgaW50ICAgICBlbF9zaXplOworICAgICAgICBpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgIGxlbmd0aF9jdXI7CisgICAgICAgIGJvb2wgICAgaXNfZW1wdHk7CisgICAgICAgIGludCAgICAgY291bnQ7CisgICAgICAgIGNoYXIgICAqYmFzZTsKKyAgICB9OworCisgICAgLy8gcHRyX2RhdGEgZm9yIHBlcnNpc3RlbnQgYXV0byBvYmplY3RzCisgICAgUHRyRGF0YSogICAgbV9zdGFja19wdHJfZGF0YTsKKyAgICBQdHJEYXRhTGlzdCBtX2Rlc3Ryb3lfc3RhY2s7CisKKyAgICAvLyBFbmdpbmUKKyAgICBFbmdpbmUmIG1fZGV2aWNlOworCisgICAgLy8gaWYgdHJ1ZSBvZmZsb2FkIGlzIG1hbmRhdG9yeQorICAgIGJvb2wgbV9pc19tYW5kYXRvcnk7CisKKyAgICAvLyBpZiB0cnVlIG9mZmxvYWQgaGFzIG9wZW5tcCBvcmlnaW4KKyAgICBjb25zdCBib29sIG1faXNfb3Blbm1wOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBpbnB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX2luOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBvdXRwdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9vdXQ7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICBCdWZmZXJMaXN0IG1fY29tcHV0ZV9idWZmZXJzOworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgbmVlZCB0byBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCBvZiBvZmZsb2FkCisgICAgQnVmZmVyTGlzdCBtX2Rlc3Ryb3lfYnVmZmVyczsKKworICAgIC8vIFZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgVmFyRGVzYyogIG1fdmFyczsKKyAgICBWYXJFeHRyYSogbV92YXJzX2V4dHJhOworICAgIGludCAgICAgICBtX3ZhcnNfdG90YWw7CisKKyAgICAvLyBQb2ludGVyIHRvIGEgdXNlci1zcGVjaWZpZWQgc3RhdHVzIHZhcmlhYmxlCisgICAgX09mZmxvYWRfc3RhdHVzICptX3N0YXR1czsKKworICAgIC8vIEZ1bmN0aW9uIGRlc2NyaXB0b3IKKyAgICBGdW5jdGlvbkRlc2NyaXB0b3IqIG1fZnVuY19kZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbV9mdW5jX2Rlc2Nfc2l6ZTsKKworICAgIC8vIEJ1ZmZlciBmb3IgdHJhbnNmZXJyaW5nIGNvcHlpbi9jb3B5b3V0IGRhdGEKKyAgICBDT0lCVUZGRVIgbV9pbm91dF9idWY7CisKKyAgICAvLyBEZXBlbmRlbmNpZXMKKyAgICBDT0lFVkVOVCAqbV9pbl9kZXBzOworICAgIHVpbnQzMl90ICBtX2luX2RlcHNfdG90YWw7CisgICAgQ09JRVZFTlQgKm1fb3V0X2RlcHM7CisgICAgdWludDMyX3QgIG1fb3V0X2RlcHNfdG90YWw7CisKKyAgICAvLyBUaW1lciBkYXRhCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKm1fdGltZXJfZGF0YTsKKworICAgIC8vIGNvcHlpbi9jb3B5b3V0IGRhdGEgbGVuZ3RoCisgICAgdWludDY0X3QgbV9pbl9kYXRhbGVuOworICAgIHVpbnQ2NF90IG1fb3V0X2RhdGFsZW47CisKKyAgICAvLyBhIGJvb2xlYW4gdmFsdWUgY2FsY3VsYXRlZCBpbiBzZXR1cF9kZXNjcmlwdG9ycy4gSWYgdHJ1ZSB3ZSBuZWVkIHRvIGRvCisgICAgLy8gYSBydW4gZnVuY3Rpb24gb24gdGhlIHRhcmdldC4gT3RoZXJ3aXNlIGl0IG1heSBiZSBvcHRpbWl6ZWQgYXdheS4KKyAgICBib29sIG1fbmVlZF9ydW5mdW5jdGlvbjsKK307CisKKy8vIEluaXRpYWxpemF0aW9uIHR5cGVzIGZvciBNSUMKK2VudW0gT2ZmbG9hZEluaXRUeXBlIHsKKyAgICBjX2luaXRfb25fc3RhcnQsICAgICAgICAgLy8gYWxsIGRldmljZXMgYmVmb3JlIGVudGVyaW5nIG1haW4KKyAgICBjX2luaXRfb25fb2ZmbG9hZCwgICAgICAgLy8gc2luZ2xlIGRldmljZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGZpcnN0IG9mZmxvYWQKKyAgICBjX2luaXRfb25fb2ZmbG9hZF9hbGwgICAgLy8gYWxsIGRldmljZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCBvZmZsb2FkCit9OworCisvLyBJbml0aWFsaXplcyBsaWJyYXJ5IGFuZCByZWdpc3RlcnMgc3BlY2lmaWVkIG9mZmxvYWQgaW1hZ2UuCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX2ltYWdlKGNvbnN0IHZvaWQqIGltYWdlKTsKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkKiBpbWFnZSk7CisKKy8vIEluaXRpYWxpemVzIG9mZmxvYWQgcnVudGltZSBsaWJyYXJ5LgorZXh0ZXJuIGludCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KHZvaWQpOworCisvLyB0aHJlYWQgZGF0YSBmb3IgYXNzb2NpYXRpbmcgcGlwZWxpbmVzIHdpdGggdGhyZWFkcworZXh0ZXJuIHB0aHJlYWRfa2V5X3QgbWljX3RocmVhZF9rZXk7CisKKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZGV2aWNlcworZXh0ZXJuIE1pY0VudlZhciBtaWNfZW52X3ZhcnM7CisKKy8vIENQVSBmcmVxdWVuY3kKK2V4dGVybiB1aW50NjRfdCBjcHVfZnJlcXVlbmN5OworCisvLyBMRF9MSUJSQVJZX1BBVEggZm9yIE1JQyBsaWJyYXJpZXMKK2V4dGVybiBjaGFyKiBtaWNfbGlicmFyeV9wYXRoOworCisvLyBzdGFjayBzaXplIGZvciB0YXJnZXQKK2V4dGVybiB1aW50MzJfdCBtaWNfc3RhY2tfc2l6ZTsKKworLy8gUHJlYWxsb2NhdGVkIG1lbW9yeSBzaXplIGZvciBidWZmZXJzIG9uIE1JQworZXh0ZXJuIHVpbnQ2NF90IG1pY19idWZmZXJfc2l6ZTsKKworLy8gU2V0dGluZyBjb250cm9sbGluZyBpbm91dCBwcm94eQorZXh0ZXJuIGJvb2wgIG1pY19wcm94eV9pbzsKK2V4dGVybiBjaGFyKiBtaWNfcHJveHlfZnNfcm9vdDsKKworLy8gVGhyZXNob2xkIGZvciBjcmVhdGluZyBidWZmZXJzIHdpdGggbGFyZ2UgcGFnZXMKK2V4dGVybiB1aW50NjRfdCBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzOworCisvLyBvZmZsb2FkIGluaXRpYWxpemF0aW9uIHR5cGUKK2V4dGVybiBPZmZsb2FkSW5pdFR5cGUgX19vZmZsb2FkX2luaXRfdHlwZTsKKworLy8gRGV2aWNlIG51bWJlciB0byBvZmZsb2FkIHRvIHdoZW4gZGV2aWNlIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC4KK2V4dGVybiBpbnQgX19vbXBfZGV2aWNlX251bTsKKworLy8gdGFyZ2V0IGV4ZWN1dGFibGUKK2V4dGVybiBUYXJnZXRJbWFnZSogX190YXJnZXRfZXhlOworCisvLyBJREIgc3VwcG9ydAorCisvLyBDYWxsZWQgYnkgdGhlIG9mZmxvYWQgcnVudGltZSBhZnRlciBpbml0aWFsaXphdGlvbiBvZiBvZmZsb2FkIGluZnJhc3RydWN0dXJlCisvLyBoYXMgYmVlbiBjb21wbGV0ZWQuCitleHRlcm4gIkMiIHZvaWQgIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKTsKKworLy8gQ2FsbGVkIGJ5IHRoZSBvZmZsb2FkIHJ1bnRpbWUgd2hlbiB0aGUgb2ZmbG9hZCBpbmZyYXN0cnVjdHVyZSBpcyBhYm91dCB0byBiZQorLy8gc2h1dCBkb3duLCBjdXJyZW50bHkgYXQgYXBwbGljYXRpb24gZXhpdC4KK2V4dGVybiAiQyIgdm9pZCAgX19kYmdfdGFyZ2V0X3NvX3VubG9hZGVkKCk7CisKKy8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBwcm9jZXNzIGltYWdlIG9mIHRoZSBob3N0aW5nCisvLyBhcHBsaWNhdGlvbiAob2ZmbG9hZF9tYWluKQorI2RlZmluZSBNQVhfVEFSR0VUX05BTUUgNTEyCitleHRlcm4gIkMiIGNoYXIgIF9fZGJnX3RhcmdldF9leGVfbmFtZVtNQVhfVEFSR0VUX05BTUVdOworCisvLyBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHByb2Nlc3MgaWQKK2V4dGVybiAiQyIgcGlkX3QgX19kYmdfdGFyZ2V0X3NvX3BpZDsKKworLy8gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSAwLWJhc2VkIGRldmljZSBudW1iZXIKK2V4dGVybiAiQyIgaW50ICAgX19kYmdfdGFyZ2V0X2lkOworCisvLyBTZXQgdG8gbm9uLXplcm8gYnkgdGhlIGhvc3Qtc2lkZSBkZWJ1Z2dlciB0byBlbmFibGUgb2ZmbG9hZCBkZWJ1Z2dpbmcKKy8vIHN1cHBvcnQKK2V4dGVybiAiQyIgaW50ICAgX19kYmdfaXNfYXR0YWNoZWQ7CisKKy8vIE1ham9yIHZlcnNpb24gb2YgdGhlIGRlYnVnZ2VyIHN1cHBvcnQgQVBJCitleHRlcm4gIkMiIGNvbnN0IGludCBfX2RiZ19hcGlfbWFqb3JfdmVyc2lvbjsKKworLy8gTWlub3IgdmVyc2lvbiBvZiB0aGUgZGVidWdnZXIgc3VwcG9ydCBBUEkKK2V4dGVybiAiQyIgY29uc3QgaW50IF9fZGJnX2FwaV9taW5vcl92ZXJzaW9uOworCisjZW5kaWYgLy8gT0ZGTE9BRF9IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuY3BwCkBAIC0wLDAgKzEsODA1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1ZT19WRVJTSU9OMSAgICAiTVlPXzEuMCIKKworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl8zMih2b2lkKiwgdm9pZCosIHVpbnQzMl90LCBpbnQzMl90KTsKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfNjQodm9pZCosIHZvaWQqLCB1aW50NjRfdCwgaW50MzJfdCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzMyCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzY0CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTVlPX1RBQkxFX0VORF9NQVJLRVIoKSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBNWU9fVEFCTEVfRU5EX01BUktFUigpIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDApCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK2NsYXNzIE15b1dyYXBwZXIgeworcHVibGljOgorICAgIE15b1dyYXBwZXIoKSA6IG1fbGliX2hhbmRsZSgwKSwgbV9pc19hdmFpbGFibGUoZmFsc2UpCisgICAge30KKworICAgIGJvb2wgaXNfYXZhaWxhYmxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pc19hdmFpbGFibGU7CisgICAgfQorCisgICAgYm9vbCBMb2FkTGlicmFyeSh2b2lkKTsKKworICAgIC8vIHVubG9hZHMgdGhlIGxpYnJhcnkKKyAgICB2b2lkIFVubG9hZExpYnJhcnkodm9pZCkgeworLy8gICAgICAgIGlmIChtX2xpYl9oYW5kbGUgIT0gMCkgeworLy8gICAgICAgICAgICBETF9jbG9zZShtX2xpYl9oYW5kbGUpOworLy8gICAgICAgICAgICBtX2xpYl9oYW5kbGUgPSAwOworLy8gICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcmFwcGVycyBmb3IgTVlPIGNsaWVudCBmdW5jdGlvbnMKKyAgICB2b2lkIExpYkluaXQodm9pZCAqYXJnLCB2b2lkICpmdW5jKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcCwgJXApXG4iLCBfX2Z1bmNfXywgYXJnLCBmdW5jKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fbGliX2luaXQoYXJnLCBmdW5jKSk7CisgICAgfQorCisgICAgdm9pZCBMaWJGaW5pKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9maW5pLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBtX2xpYl9maW5pKCk7CisgICAgfQorCisgICAgdm9pZCogU2hhcmVkTWFsbG9jKHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisgICAgICAgIHJldHVybiBtX3NoYXJlZF9tYWxsb2Moc2l6ZSk7CisgICAgfQorCisgICAgdm9pZCBTaGFyZWRGcmVlKHZvaWQgKnB0cikgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICAgICAgbV9zaGFyZWRfZnJlZShwdHIpOworICAgIH0KKworICAgIHZvaWQqIFNoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisgICAgICAgIHJldHVybiBtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorCisgICAgdm9pZCBTaGFyZWRBbGlnbmVkRnJlZSh2b2lkICpwdHIpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworICAgICAgICBtX3NoYXJlZF9hbGlnbmVkX2ZyZWUocHRyKTsKKyAgICB9CisKKyAgICB2b2lkIEFjcXVpcmUodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2FjcXVpcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9hY3F1aXJlKCkpOworICAgIH0KKworICAgIHZvaWQgUmVsZWFzZSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9yZWxlYXNlKCkpOworICAgIH0KKworICAgIHZvaWQgSG9zdFZhclRhYmxlUHJvcGFnYXRlKHZvaWQgKnRhYmxlLCBpbnQgbnVtX2VudHJpZXMpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXAsICVkKVxuIiwgX19mdW5jX18sIHRhYmxlLCBudW1fZW50cmllcyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSh0YWJsZSwgbnVtX2VudHJpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIEhvc3RGcHRyVGFibGVSZWdpc3Rlcih2b2lkICp0YWJsZSwgaW50IG51bV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlcmVkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvcmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwLCAlZCwgJWQpXG4iLCBfX2Z1bmNfXywgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2VudHJpZXMsIG9yZGVyZWQpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIodGFibGUsIG51bV9lbnRyaWVzLCBvcmRlcmVkKSk7CisgICAgfQorCisgICAgdm9pZCBSZW1vdGVUaHVua0NhbGwodm9pZCAqdGh1bmssIHZvaWQgKmFyZ3MsIGludCBkZXZpY2UpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXAsICVwLCAlZClcbiIsIF9fZnVuY19fLCB0aHVuaywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9yZW1vdGVfdGh1bmtfY2FsbCh0aHVuaywgYXJncywgZGV2aWNlKSk7CisgICAgfQorCisgICAgTXlvaVJGdW5jQ2FsbEhhbmRsZSBSZW1vdGVDYWxsKGNoYXIgKmZ1bmMsIHZvaWQgKmFyZ3MsIGludCBkZXZpY2UpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXMsICVwLCAlZClcbiIsIF9fZnVuY19fLCBmdW5jLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgIHJldHVybiBtX3JlbW90ZV9jYWxsKGZ1bmMsIGFyZ3MsIGRldmljZSk7CisgICAgfQorCisgICAgdm9pZCBHZXRSZXN1bHQoTXlvaVJGdW5jQ2FsbEhhbmRsZSBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fZ2V0X3Jlc3VsdChoYW5kbGUpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBDaGVja1Jlc3VsdChjb25zdCBjaGFyICpmdW5jLCBNeW9FcnJvciBlcnJvcikgY29uc3QgeworICAgICAgICBpZiAoZXJyb3IgIT0gTVlPX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwgZnVuYywgZXJyb3IpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkKiBtX2xpYl9oYW5kbGU7CisgICAgYm9vbCAgbV9pc19hdmFpbGFibGU7CisKKyAgICAvLyBwb2ludGVycyB0byBmdW5jdGlvbnMgZnJvbSBteW8gbGlicmFyeQorICAgIE15b0Vycm9yICgqbV9saWJfaW5pdCkodm9pZCosIHZvaWQqKTsKKyAgICB2b2lkICAgICAoKm1fbGliX2ZpbmkpKHZvaWQpOworICAgIHZvaWQqICAgICgqbV9zaGFyZWRfbWFsbG9jKShzaXplX3QpOworICAgIHZvaWQgICAgICgqbV9zaGFyZWRfZnJlZSkodm9pZCopOworICAgIHZvaWQqICAgICgqbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MpKHNpemVfdCwgc2l6ZV90KTsKKyAgICB2b2lkICAgICAoKm1fc2hhcmVkX2FsaWduZWRfZnJlZSkodm9pZCopOworICAgIE15b0Vycm9yICgqbV9hY3F1aXJlKSh2b2lkKTsKKyAgICBNeW9FcnJvciAoKm1fcmVsZWFzZSkodm9pZCk7CisgICAgTXlvRXJyb3IgKCptX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSkodm9pZCosIGludCk7CisgICAgTXlvRXJyb3IgKCptX2hvc3RfZnB0cl90YWJsZV9yZWdpc3Rlcikodm9pZCosIGludCwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1fcmVtb3RlX3RodW5rX2NhbGwpKHZvaWQqLCB2b2lkKiwgaW50KTsKKyAgICBNeW9pUkZ1bmNDYWxsSGFuZGxlICgqbV9yZW1vdGVfY2FsbCkoY2hhciosIHZvaWQqLCBpbnQpOworICAgIE15b0Vycm9yICgqbV9nZXRfcmVzdWx0KShNeW9pUkZ1bmNDYWxsSGFuZGxlKTsKK307CisKK2Jvb2wgTXlvV3JhcHBlcjo6TG9hZExpYnJhcnkodm9pZCkKK3sKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibGlibXlvLWNsaWVudC5zbyI7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJteW8tY2xpZW50LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIE1ZTyBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworCisgICAgbV9saWJfaGFuZGxlID0gRExfb3BlbihsaWJfbmFtZSk7CisgICAgaWYgKG1fbGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5LiBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGliX2luaXQgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCB2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pTGliSW5pdCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fbGliX2luaXQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUxpYkluaXQiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9saWJfZmluaSA9ICh2b2lkICgqKSh2b2lkKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lMaWJGaW5pIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9saWJfZmluaSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pTGliRmluaSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9tYWxsb2MgPSAodm9pZCogKCopKHNpemVfdCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRNYWxsb2MiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9tYWxsb2MgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkTWFsbG9jIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2ZyZWUgPSAodm9pZCAoKikodm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkRnJlZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2ZyZWUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkRnJlZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyA9ICh2b2lkKiAoKikoc2l6ZV90LCBzaXplX3QpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkQWxpZ25lZE1hbGxvYyIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2FsaWduZWRfbWFsbG9jID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEFsaWduZWRNYWxsb2MiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfYWxpZ25lZF9mcmVlID0gKHZvaWQgKCopKHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEFsaWduZWRGcmVlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfYWxpZ25lZF9mcmVlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEFsaWduZWRGcmVlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fYWNxdWlyZSA9IChNeW9FcnJvciAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9BY3F1aXJlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9hY3F1aXJlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b0FjcXVpcmUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9yZWxlYXNlID0gKE15b0Vycm9yICgqKSh2b2lkKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1JlbGVhc2UiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbGVhc2UgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvUmVsZWFzZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSA9IChNeW9FcnJvciAoKikodm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pSG9zdFZhclRhYmxlUHJvcGFnYXRlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUhvc3RWYXJUYWJsZVByb3BhZ2F0ZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2hvc3RfZnB0cl90YWJsZV9yZWdpc3RlciA9IChNeW9FcnJvciAoKikodm9pZCosIGludCwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lIb3N0RnB0clRhYmxlUmVnaXN0ZXIiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2hvc3RfZnB0cl90YWJsZV9yZWdpc3RlciA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pSG9zdEZwdHJUYWJsZVJlZ2lzdGVyIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVtb3RlX3RodW5rX2NhbGwgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCB2b2lkKiwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lSZW1vdGVUaHVua0NhbGwiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbW90ZV90aHVua19jYWxsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lSZW1vdGVUaHVua0NhbGwiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9yZW1vdGVfY2FsbCA9IChNeW9pUkZ1bmNDYWxsSGFuZGxlICgqKShjaGFyKiwgdm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pUmVtb3RlQ2FsbCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fcmVtb3RlX2NhbGwgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaVJlbW90ZUNhbGwiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9nZXRfcmVzdWx0ID0gKE15b0Vycm9yICgqKShNeW9pUkZ1bmNDYWxsSGFuZGxlKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lHZXRSZXN1bHQiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2dldF9yZXN1bHQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUdldFJlc3VsdCIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJUaGUgbGlicmFyeSB3YXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZFxuIik7CisKKyAgICBtX2lzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgbXlvX2lzX2F2YWlsYWJsZTsKK3N0YXRpYyBNeW9XcmFwcGVyIG15b193cmFwcGVyOworCitzdHJ1Y3QgTXlvVGFibGUKK3sKKyAgICBNeW9UYWJsZShTaGFyZWRUYWJsZUVudHJ5ICp0YWIsIGludCBsZW4pIDogdmFyX3RhYih0YWIpLCB2YXJfdGFiX2xlbihsZW4pCisgICAge30KKworICAgIFNoYXJlZFRhYmxlRW50cnkqICAgdmFyX3RhYjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHZhcl90YWJfbGVuOworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8TXlvVGFibGU+IE15b1RhYmxlTGlzdDsKK3N0YXRpYyBNeW9UYWJsZUxpc3QgX19teW9fdGFibGVfbGlzdDsKK3N0YXRpYyBtdXRleF90ICAgICAgX19teW9fdGFibGVfbG9jazsKK3N0YXRpYyBib29sICAgICAgICAgX19teW9fdGFibGVzID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoSW5pdFRhYmxlRW50cnkqIGVudHJ5KTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcihGcHRyVGFibGVFbnRyeSAqZW50cnkpOworCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnlfb25jZSh2b2lkKQoreworICAgIGlmIChfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuTG9hZExpYnJhcnkoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSh2b2lkKQoreworICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnlfb25jZSk7CisKKyAgICByZXR1cm4gbXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9Jbml0X29uY2Uodm9pZCkKK3sKKyAgICBpZiAoIV9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBkZXZpY2VzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICB9CisKKyAgICAvLyBsb2FkIGFuZCBpbml0aWFsaXplIE1ZTyBsaWJyYXJ5CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiSW5pdGlhbGl6aW5nIE1ZTyBsaWJyYXJ5IC4uLlxuIik7CisKKyAgICBDT0lFVkVOVCBldmVudHNbTUlDX0VOR0lORVNfTUFYXTsKKyAgICBNeW9pVXNlclBhcmFtcyBwYXJhbXNbTUlDX0VOR0lORVNfTUFYKzFdOworCisgICAgLy8gbG9hZCB0YXJnZXQgbGlicmFyeSB0byBhbGwgZGV2aWNlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0X215bygmZXZlbnRzW2ldKTsKKworICAgICAgICBwYXJhbXNbaV0udHlwZSA9IE1ZT0lfVVNFUlBBUkFNU19ERVZJRDsKKyAgICAgICAgcGFyYW1zW2ldLm5vZGVpZCA9IG1pY19lbmdpbmVzW2ldLmdldF9waHlzaWNhbF9pbmRleCgpICsgMTsKKyAgICB9CisKKyAgICBwYXJhbXNbbWljX2VuZ2luZXNfdG90YWxdLnR5cGUgPSBNWU9JX1VTRVJQQVJBTVNfTEFTVF9NU0c7CisKKyAgICAvLyBpbml0aWFsaXplIG15byBydW50aW1lIG9uIGhvc3QKKyAgICBteW9fd3JhcHBlci5MaWJJbml0KHBhcmFtcywgMCk7CisKKyAgICAvLyB3YWl0IGZvciB0aGUgdGFyZ2V0IGluaXQgY2FsbHMgdG8gZmluaXNoCisgICAgQ09JUkVTVUxUIHJlczsKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtaWNfZW5naW5lc190b3RhbCwgZXZlbnRzLCAtMSwgMSwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBteW9faXNfYXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkluaXRpYWxpemluZyBNWU8gbGlicmFyeSAuLi4gZG9uZVxuIik7Cit9CisKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9teW9Jbml0KHZvaWQpCit7CisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9teW9Jbml0X29uY2UpOworCisgICAgLy8gcmVnaXN0ZXIgcGVuZGluZyBzaGFyZWQgdmFyIHRhYmxlcworICAgIGlmIChteW9faXNfYXZhaWxhYmxlICYmIF9fbXlvX3RhYmxlcykgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoX19teW9fdGFibGVfbG9jayk7CisKKyAgICAgICAgaWYgKF9fbXlvX3RhYmxlcykgeworICAgICAgICAgICAgLy8gIFJlZ2lzdGVyIHRhYmxlcyB3aXRoIE1ZTyBzbyBpdCBjYW4gcHJvcGFnYXRlIHRvIHRhcmdldC4KKyAgICAgICAgICAgIGZvcihNeW9UYWJsZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX19teW9fdGFibGVfbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IF9fbXlvX3RhYmxlX2xpc3QuZW5kKCk7ICsraXQpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgICAgICBmb3IgKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5ID0gaXQtPnZhcl90YWI7CisgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0VmFyVGFibGVQcm9wYWdhdGUoZW50cnksIDEpOworICAgICAgICAgICAgICAgIH0KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICAgICAgICAgIG15b193cmFwcGVyLkhvc3RWYXJUYWJsZVByb3BhZ2F0ZShpdC0+dmFyX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnZhcl90YWJfbGVuKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19teW9fdGFibGVfbGlzdC5jbGVhcigpOworICAgICAgICAgICAgX19teW9fdGFibGVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbXlvX2lzX2F2YWlsYWJsZTsKK30KKworc3RhdGljIGJvb2wgc2hhcmVkX3RhYmxlX2VudHJpZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBmb3IgKDsgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGZwdHJfdGFibGVfZW50cmllcygKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBmb3IgKDsgZW50cnktPmZ1bmNOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyAgICBJbml0VGFibGVFbnRyeSogaW5pdF90YWJsZSwKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzaGFyZWRfdGFibGUsCisgICAgRnB0clRhYmxlRW50cnkgKmZwdHJfdGFibGUKKykKK3sKKyAgICAvLyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBNWU8gbGlicmFyeS4gSXQgaXMKKyAgICAvLyBpbml0aWFsaXplZCBvbmx5IGlmIGF0IGxlYXN0IG9uZSBteW8gdGFibGUgaXMgbm90IGVtcHR5CisgICAgaWYgKHNoYXJlZF90YWJsZV9lbnRyaWVzKHNoYXJlZF90YWJsZSkgfHwgZnB0cl90YWJsZV9lbnRyaWVzKGZwdHJfdGFibGUpKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBteW8gbGlicmFyeSBpcyBsb2FkZWQKKyAgICAgICAgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGFibGVzCisgICAgICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKHNoYXJlZF90YWJsZSk7CisgICAgICAgIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcihmcHRyX3RhYmxlKTsKKyAgICAgICAgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9yZWdpc3Rlcihpbml0X3RhYmxlKTsKKyAgICB9Cit9CisKK3ZvaWQgX19vZmZsb2FkX215b0Zpbmkodm9pZCkKK3sKKyAgICBpZiAobXlvX2lzX2F2YWlsYWJsZSkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgICAgIENPSUVWRU5UIGV2ZW50c1tNSUNfRU5HSU5FU19NQVhdOworCisgICAgICAgIC8vIGtpY2sgb2ZmIG15b2lMaWJGaW5pIGNhbGxzIG9uIGFsbCBkZXZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uZmluaV9teW8oJmV2ZW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbnVwIG15byBydW50aW1lIG9uIGhvc3QKKyAgICAgICAgbXlvX3dyYXBwZXIuTGliRmluaSgpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0YXJnZXQgZmluaSBjYWxscyB0byBmaW5pc2gKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobWljX2VuZ2luZXNfdG90YWwsIGV2ZW50cywgLTEsIDEsIDAsIDApOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc3RhcnQgPSBlbnRyeTsKKyAgICBpbnQgZW50cmllcyA9IDA7CisKKyAgICAvLyBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciB2YXJzCisgICAgZm9yICg7IGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b1NoYXJlZFRhYmxlIGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAicmVnaXN0ZXJpbmcgTXlvU2hhcmVkVGFibGUgZW50cnkgZm9yICVzIEAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dmFyTmFtZSwgZW50cnkpOworCisgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKCopKHZvaWQpPihlbnRyeS0+c2hhcmVkQWRkcikoKTsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIC8vIGFuZCB0YWJsZSB0byB0aGUgbGlzdCBpZiBpdCBpcyBub3QgZW1wdHkKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fbXlvX3RhYmxlX2xvY2spOworICAgICAgICBfX215b190YWJsZV9saXN0LnB1c2hfYmFjayhNeW9UYWJsZShzdGFydCwgZW50cmllcykpOworICAgICAgICBfX215b190YWJsZXMgPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9yZWdpc3RlcihJbml0VGFibGVFbnRyeSogZW50cnkpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvU2hhcmVkSW5pdCBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGluaXQgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgZW50cnktPmZ1bmMoKTsKKyAgICB9CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBmb3IgKDsgZW50cnktPmZ1bmMgIT0gMDsgZW50cnkrKykgeworICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGluaXQgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgZW50cnktPmZ1bmMoKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcigKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBGcHRyVGFibGVFbnRyeSAqc3RhcnQgPSBlbnRyeTsKKyAgICBpbnQgZW50cmllcyA9IDA7CisKKyAgICBmb3IgKDsgZW50cnktPmZ1bmNOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9GcHRyVGFibGUgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICBpZiAoIW15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAqKHN0YXRpY19jYXN0PHZvaWQqKj4oZW50cnktPmxvY2FsVGh1bmtBZGRyKSkgPSBlbnRyeS0+ZnVuY0FkZHI7CisgICAgICAgIH0KKworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJyZWdpc3RlcmluZyBNeW9GcHRyVGFibGUgZW50cnkgZm9yICVzIEAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+ZnVuY05hbWUsIGVudHJ5KTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAobXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIG15b193cmFwcGVyLkhvc3RGcHRyVGFibGVSZWdpc3RlcihlbnRyeSwgMSwgZmFsc2UpOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBpZiAobXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCkgJiYgZW50cmllcyA+IDApIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuSG9zdEZwdHJUYWJsZVJlZ2lzdGVyKHN0YXJ0LCBlbnRyaWVzLCBmYWxzZSk7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitleHRlcm4gIkMiIGludCBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUoaW50IHRhcmdldF9udW1iZXIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgdGFyZ2V0X251bWJlcik7CisKKyAgICBpZiAodGFyZ2V0X251bWJlciA+PSAtMikgeworICAgICAgICBib29sIGlzX2RlZmF1bHRfbnVtYmVyID0gKHRhcmdldF9udW1iZXIgPT0gLTIpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfbXlvSW5pdCgpKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBwcm92aWRlZCB0aGUgZGV2aWNlIG51bWJlcgorICAgICAgICAgICAgICAgIGludCBudW0gPSB0YXJnZXRfbnVtYmVyICUgbWljX2VuZ2luZXNfdG90YWw7CisKKyAgICAgICAgICAgICAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IE9SU0w6OnJlc2VydmUobnVtKSA/IG51bSA6IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBkZXZpY2UgMAorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSBPUlNMOjpyZXNlcnZlKDApID8gMCA6IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZGV2aWNlIGlzIGluaXRpYWxpemVkCisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gQ1BVCisgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0X251bWJlciA8IDAgJiYgIWlzX2RlZmF1bHRfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZGV2aWNlX251bWJlcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcmV0dXJuIHRhcmdldF9udW1iZXI7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvaVJlbW90ZUlUaHVua0NhbGwoCisgICAgdm9pZCAqdGh1bmssCisgICAgdm9pZCAqYXJnLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXAsICVwLCAlZClcbiIsIF9fZnVuY19fLCB0aHVuaywgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcik7CisKKyAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgbXlvX3dyYXBwZXIuUmVtb3RlVGh1bmtDYWxsKHRodW5rLCBhcmcsIHRhcmdldF9udW1iZXIpOworICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgIE9SU0w6OnJlbGVhc2UodGFyZ2V0X251bWJlcik7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybiBteW9fd3JhcHBlci5TaGFyZWRNYWxsb2Moc2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gbWFsbG9jKHNpemUpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLlNoYXJlZEZyZWUocHRyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZyZWUocHRyKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisKKyAgICBpZiAoX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIG15b193cmFwcGVyLlNoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFsaWduIDwgc2l6ZW9mKHZvaWQqKSkgeworICAgICAgICAgICAgYWxpZ24gPSBzaXplb2Yodm9pZCopOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbW1fbWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLlNoYXJlZEFsaWduZWRGcmVlKHB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfbW1fZnJlZShwdHIpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCgKKyAgICBpbnQgc2l6ZSwKKyAgICB2b2lkICgqY29weV9jb25zdHJ1Y3Rvcikodm9pZCosIHZvaWQqKSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICB2b2lkICpyYWRkciwKKyAgICB2b2lkICpjbG9zdXJlX29iamVjdCwKKyAgICB1bnNpZ25lZCBpbnQgaXRlcnMsCisgICAgdW5zaWduZWQgaW50IGdyYWluX3NpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHRhcmdldF9udW1iZXIgPSBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUodGFyZ2V0X251bWJlcik7CisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICBzdHJ1Y3QgUyB7CisgICAgICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBNMjsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBNMzsKKyAgICAgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgICAgICB9ICphcmdzOworCisgICAgICAgIGFyZ3MgPSAoc3RydWN0IFMqKSBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVvZihzdHJ1Y3QgUykgKyBzaXplKTsKKyAgICAgICAgYXJncy0+TTEgPSByYWRkcjsKKyAgICAgICAgYXJncy0+TTIgPSBpdGVyczsKKyAgICAgICAgYXJncy0+TTMgPSBncmFpbl9zaXplOworCisgICAgICAgIGlmIChjb3B5X2NvbnN0cnVjdG9yID09IDApIHsKKyAgICAgICAgICAgIG1lbWNweShhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdG9yKGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIG15b193cmFwcGVyLlJlbGVhc2UoKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuR2V0UmVzdWx0KAorICAgICAgICAgICAgbXlvX3dyYXBwZXIuUmVtb3RlQ2FsbCgiX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgdGFyZ2V0X251bWJlcikKKyAgICAgICAgKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuQWNxdWlyZSgpOworCisgICAgICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKGFyZ3MpOworCisgICAgICAgIE9SU0w6OnJlbGVhc2UodGFyZ2V0X251bWJlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2NpbGtydHNfY2lsa19mb3JfMzIocmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhaW5fc2l6ZSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkKAorICAgIGludCBzaXplLAorICAgIHZvaWQgKCpjb3B5X2NvbnN0cnVjdG9yKSh2b2lkKiwgdm9pZCopLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHZvaWQgKnJhZGRyLAorICAgIHZvaWQgKmNsb3N1cmVfb2JqZWN0LAorICAgIHVpbnQ2NF90IGl0ZXJzLAorICAgIHVpbnQ2NF90IGdyYWluX3NpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHRhcmdldF9udW1iZXIgPSBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUodGFyZ2V0X251bWJlcik7CisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICBzdHJ1Y3QgUyB7CisgICAgICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgICAgIHVpbnQ2NF90IE0yOworICAgICAgICAgICAgdWludDY0X3QgTTM7CisgICAgICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICAgICAgfSAqYXJnczsKKworICAgICAgICBhcmdzID0gKHN0cnVjdCBTKikgX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplb2Yoc3RydWN0IFMpICsgc2l6ZSk7CisgICAgICAgIGFyZ3MtPk0xID0gcmFkZHI7CisgICAgICAgIGFyZ3MtPk0yID0gaXRlcnM7CisgICAgICAgIGFyZ3MtPk0zID0gZ3JhaW5fc2l6ZTsKKworICAgICAgICBpZiAoY29weV9jb25zdHJ1Y3RvciA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RvcihhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgICAgIG15b193cmFwcGVyLkdldFJlc3VsdCgKKyAgICAgICAgICAgIG15b193cmFwcGVyLlJlbW90ZUNhbGwoIl9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCIsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpCisgICAgICAgICk7CisgICAgICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgICAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShhcmdzKTsKKworICAgICAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluX3NpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmggYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTYxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxteW90eXBlcy5oPgorI2luY2x1ZGUgPG15b2ltcGwuaD4KKyNpbmNsdWRlIDxteW8uaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisKK3R5cGVkZWYgTXlvaVNoYXJlZFZhckVudHJ5ICAgICAgU2hhcmVkVGFibGVFbnRyeTsKKy8vdHlwZWRlZiBNeW9pSG9zdFNoYXJlZEZwdHJFbnRyeSBGcHRyVGFibGVFbnRyeTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyEgRnVuY3Rpb24gTmFtZQorICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lOworICAgIC8vISBGdW5jdGlvbiBBZGRyZXNzCisgICAgdm9pZCAqZnVuY0FkZHI7CisgICAgLy8hIExvY2FsIFRodW5rIEFkZHJlc3MKKyAgICB2b2lkICpsb2NhbFRodW5rQWRkcjsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAvLyBEdW1teSB0byBwYWQgdXAgdG8gMzIgYnl0ZXMKKyAgICB2b2lkICpkdW1teTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30gRnB0clRhYmxlRW50cnk7CisKK3N0cnVjdCBJbml0VGFibGVFbnRyeSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgLy8gRHVtbXkgdG8gcGFkIHVwIHRvIDE2IGJ5dGVzCisgICAgLy8gRnVuY3Rpb24gTmFtZQorICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIHZvaWQgKCpmdW5jKSh2b2lkKTsKK307CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSR6IgorI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAiLk15b1NoYXJlZEluaXRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgSW5pdFRhYmxlRW50cnkgKmluaXRfdGFibGUsCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispOworCitleHRlcm4gdm9pZCBfX29mZmxvYWRfbXlvRmluaSh2b2lkKTsKKworI2VuZGlmIC8vIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIxYzRmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfMzIodm9pZCosIHZvaWQqLCB1aW50MzJfdCwgaW50MzJfdCk7CitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHZvaWQqLCB2b2lkKiwgdWludDY0X3QsIGludDMyX3QpOworCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzMyCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzY0CisKK3N0YXRpYyB2b2lkIENoZWNrUmVzdWx0KGNvbnN0IGNoYXIgKmZ1bmMsIE15b0Vycm9yIGVycm9yKSB7CisgICAgaWYgKGVycm9yICE9IE1ZT19TVUNDRVNTKSB7CisgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX215b3RhcmdldF9jaGVja3Jlc3VsdCwgZnVuYywgZXJyb3IpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoU2hhcmVkVGFibGVFbnRyeSAqZW50cnkpCit7CisgICAgaW50IGVudHJpZXMgPSAwOworICAgIFNoYXJlZFRhYmxlRW50cnkgKnRfc3RhcnQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICB0X3N0YXJ0ID0gZW50cnk7CisgICAgd2hpbGUgKHRfc3RhcnQtPnZhck5hbWUgIT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX21pY19teW9fc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15byBzaGFyZWQgZW50cnkgbmFtZSA9IFwiJXNcIiBhZGRyID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0YXJ0LT52YXJOYW1lLCB0X3N0YXJ0LT5zaGFyZWRBZGRyKTsKKyAgICAgICAgdF9zdGFydCsrOworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIm15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyKCVwLCAlZClcbiIsIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdCgibXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICBteW9pTWljVmFyVGFibGVSZWdpc3RlcihlbnRyeSwgZW50cmllcykpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKAorICAgIEZwdHJUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBGcHRyVGFibGVFbnRyeSAqdF9zdGFydDsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIHRfc3RhcnQgPSBlbnRyeTsKKyAgICB3aGlsZSAodF9zdGFydC0+ZnVuY05hbWUgIT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX21pY19teW9fZnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW8gZnB0ciBlbnRyeSBuYW1lID0gXCIlc1wiIGFkZHIgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RhcnQtPmZ1bmNOYW1lLCB0X3N0YXJ0LT5mdW5jQWRkcik7CisgICAgICAgIHRfc3RhcnQrKzsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIoJXAsICVkLCAwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwgZW50cmllcyk7CisgICAgICAgIENoZWNrUmVzdWx0KCJteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICBteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIoZW50cnksIGVudHJpZXMsIDApKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvQWNxdWlyZSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisgICAgQ2hlY2tSZXN1bHQoIm15b0FjcXVpcmUiLCBteW9BY3F1aXJlKCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlbGVhc2Uodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9SZWxlYXNlIiwgbXlvUmVsZWFzZSgpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZF93cmFwcGVyKHZvaWQgKmFyZ3NfKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBzdHJ1Y3QgUyB7CisgICAgICAgIHZvaWQgKk0xOworICAgICAgICB1bnNpZ25lZCBpbnQgTTI7CisgICAgICAgIHVuc2lnbmVkIGludCBNMzsKKyAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgfSAqYXJncyA9IChzdHJ1Y3QgUyopIGFyZ3NfOworCisgICAgX19jaWxrcnRzX2NpbGtfZm9yXzMyKGFyZ3MtPk0xLCBhcmdzLT5jbG9zdXJlLCBhcmdzLT5NMiwgYXJncy0+TTMpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkX3dyYXBwZXIodm9pZCAqYXJnc18pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHN0cnVjdCBTIHsKKyAgICAgICAgdm9pZCAqTTE7CisgICAgICAgIHVpbnQ2NF90IE0yOworICAgICAgICB1aW50NjRfdCBNMzsKKyAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgfSAqYXJncyA9IChzdHJ1Y3QgUyopIGFyZ3NfOworCisgICAgX19jaWxrcnRzX2NpbGtfZm9yXzY0KGFyZ3MtPk0xLCBhcmdzLT5jbG9zdXJlLCBhcmdzLT5NMiwgYXJncy0+TTMpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX29uY2VfaW5pdCh2b2lkKQoreworICAgIENoZWNrUmVzdWx0KCJteW9pUmVtb3RlRnVuY1JlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICBteW9pUmVtb3RlRnVuY1JlZ2lzdGVyKAorICAgICAgICAgICAgICAgICAgICAoTXlvaVJlbW90ZUZ1bmNUeXBlKSBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWRfd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgIl9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCIpKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvaVJlbW90ZUZ1bmNSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbXlvaVJlbW90ZUZ1bmNSZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgKE15b2lSZW1vdGVGdW5jVHlwZSkgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICJfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQiKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIC8vIG9uZSB0aW1lIHJlZ2lzdHJhdGlvbiBvZiBJbnRlbChSKSBDaWxrKFRNKSBsYW5ndWFnZSBlbnRyaWVzCisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworICAgIHB0aHJlYWRfb25jZSgmb25jZV9jb250cm9sLCBfX29mZmxvYWRfbXlvX29uY2VfaW5pdCk7CisKKyAgICAvLyByZWdpc3RlciBtb2R1bGUncyB0YWJsZXMKKyAgICBpZiAoc2hhcmVkX3RhYmxlLT52YXJOYW1lID09IDAgJiYgZnB0cl90YWJsZS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoc2hhcmVkX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoZnB0cl90YWJsZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworICAgIHJldHVybiBteW9TaGFyZWRNYWxsb2Moc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICBteW9TaGFyZWRGcmVlKHB0cik7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisgICAgcmV0dXJuIG15b1NoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZSwgYWxpZ24pOworfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICBteW9TaGFyZWRBbGlnbmVkRnJlZShwdHIpOworfQorCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3Igb2YgbXlvaUxpYkluaXQvRmluaSBjYWxscworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJJbml0KCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lMaWJJbml0IiwgbXlvaUxpYkluaXQoMCwgMCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkZpbmkoKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICBteW9pTGliRmluaSgpOworfQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2Y3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxteW90eXBlcy5oPgorI2luY2x1ZGUgPG15b2ltcGwuaD4KKyNpbmNsdWRlIDxteW8uaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisKK3R5cGVkZWYgTXlvaVNoYXJlZFZhckVudHJ5ICAgICAgICAgIFNoYXJlZFRhYmxlRW50cnk7Cit0eXBlZGVmIE15b2lUYXJnZXRTaGFyZWRGcHRyRW50cnkgICBGcHRyVGFibGVFbnRyeTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSR6IgorI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispOworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0FjcXVpcmUodm9pZCk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlbGVhc2Uodm9pZCk7CisKKy8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBmb3IgbXlvaUxpYkluaXQvRmluaSBjYWxscworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJJbml0KCk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkZpbmkoKTsKKworI2VuZGlmIC8vIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkNDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF9ob3N0LmNwcApAQCAtMCwwICsxLDg1MSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorI2luY2x1ZGUgImNvbXBpbGVyX2lmX2hvc3QuaCIKKworLy8gT3Blbk1QIEFQSQorCit2b2lkIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoaW50IG51bSkKK3sKKyAgICBpZiAobnVtID49IDApIHsKKyAgICAgICAgX19vbXBfZGV2aWNlX251bSA9IG51bTsKKyAgICB9Cit9CisKK2ludCBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpCit7CisgICAgcmV0dXJuIF9fb21wX2RldmljZV9udW07Cit9CisKK2ludCBvbXBfZ2V0X251bV9kZXZpY2VzKCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCisvLyBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N0YXRpYyB2b2lkIG9tcF9zZXRfaW50X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2V0dGluZywKKyAgICBjb25zdCBjaGFyKiBmX25hbWUKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9uYW1lLCAwKTsKKyAgICBpZiAob2ZsZCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsIGZfbmFtZSwgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9tcF9nZXRfaW50X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjb25zdCBjaGFyICogZl9uYW1lCispCit7CisgICAgaW50IHNldHRpbmcgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfbmFtZSwgMCk7CisgICAgaWYgKG9mbGQpIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgZl9uYW1lLCAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHNldHRpbmc7Cit9CisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9udW1fcHJvY3NfdGFyZ2V0Iik7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9keW5hbWljX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9keW5hbWljX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbmVzdGVkCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBuZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X25lc3RlZF90YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9uZXN0ZWRfdGFyZ2V0Iik7Cit9CisKK3ZvaWQgb21wX3NldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3Qga2luZCwKKyAgICBpbnQgbW9kaWZpZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9zY2hlZF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJmtpbmQ7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJm1vZGlmaWVyOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3NldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfc2NoZWRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGtpbmQ7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1vZGlmaWVyOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCisvLyBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9pbml0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIGttcCBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHNpemVfdCBzaXplCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiKTsKK30KKworc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfbGlicmFyeV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfbGlicmFyeV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfc3RyaW5nX3B0cjsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfc3RyaW5nX3B0cjsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLmFsbG9jX2lmID0gMTsKKyAgICAgICAgdmFyc1swXS5mcmVlX2lmID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmZGVmYXVsdHM7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKKy8vIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2dldF9hZmZpbml0eV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQiKTsKK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjA1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDEwMjEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKworLy8gT3Blbk1QIEFQSQorCit2b2lkIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoaW50IG51bSkKK3sKK30KKworaW50IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCkKK3sKKyAgICByZXR1cm4gbWljX2luZGV4OworfQorCitpbnQgb21wX2dldF9udW1fZGV2aWNlcygpCit7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCisvLyBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N0YXRpYyB2b2lkIG9tcF9zZW5kX2ludF90b19ob3N0KAorICAgIHZvaWQgKm9mbGRfLAorICAgIGludCBzZXR0aW5nCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworc3RhdGljIGludCBvbXBfZ2V0X2ludF9mcm9tX2hvc3QoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGludCBzZXR0aW5nOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7CisKKyAgICByZXR1cm4gc2V0dGluZzsKK30KKwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG51bV90aHJlYWRzOworCisgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAgb21wX3NldF9udW1fdGhyZWFkcyhudW1fdGhyZWFkcyk7Cit9CisKK3ZvaWQgb21wX2dldF9tYXhfdGhyZWFkc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fdGhyZWFkczsKKworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG51bV90aHJlYWRzKTsKK30KKwordm9pZCBvbXBfZ2V0X251bV9wcm9jc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fcHJvY3M7CisKKyAgICBudW1fcHJvY3MgPSBvbXBfZ2V0X251bV9wcm9jcygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG51bV9wcm9jcyk7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IGR5bmFtaWM7CisKKyAgICBkeW5hbWljID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfZHluYW1pYyhkeW5hbWljKTsKK30KKwordm9pZCBvbXBfZ2V0X2R5bmFtaWNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgZHluYW1pYzsKKworICAgIGR5bmFtaWMgPSBvbXBfZ2V0X2R5bmFtaWMoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBkeW5hbWljKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBuZXN0ZWQ7CisKKyAgICBuZXN0ZWQgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAgb21wX3NldF9uZXN0ZWQobmVzdGVkKTsKK30KKwordm9pZCBvbXBfZ2V0X25lc3RlZF9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBuZXN0ZWQ7CisKKyAgICBuZXN0ZWQgPSBvbXBfZ2V0X25lc3RlZCgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG5lc3RlZCk7Cit9CisKK3ZvaWQgb21wX3NldF9zY2hlZHVsZV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9zY2hlZF90IGtpbmQ7CisgICAgaW50IG1vZGlmaWVyOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfc2NoZWRfdCBraW5kOworICAgIGludCBtb2RpZmllcjsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmtpbmQ7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIG9tcF9nZXRfc2NoZWR1bGUoJmtpbmQsICZtb2RpZmllcik7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9pbml0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9zZXRfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3Vuc2V0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Rlc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IG9tcF90ZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2luaXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9zZXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfdW5zZXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF90ZXN0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0gb21wX3Rlc3RfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBrbXAgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfc3RhY2tzaXplKHNpemUpOworfQorCit2b2lkIGttcF9nZXRfc3RhY2tzaXplX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0ga21wX2dldF9zdGFja3NpemUoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBzaXplKTsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSk7Cit9CisKK3ZvaWQga21wX2dldF9zdGFja3NpemVfc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGttcF9nZXRfc3RhY2tzaXplX3MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBzaXplKTsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCB0aW1lOworCisgICAgdGltZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X2Jsb2NrdGltZSh0aW1lKTsKK30KKwordm9pZCBrbXBfZ2V0X2Jsb2NrdGltZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCB0aW1lOworCisgICAgdGltZSA9IGttcF9nZXRfYmxvY2t0aW1lKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgdGltZSk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAwLCAwLCAwKTsKKyAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAwLCAwLCAwKTsKKyAgICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtb2RlOworCisgICAgbW9kZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X2xpYnJhcnkobW9kZSk7Cit9CisKK3ZvaWQga21wX2dldF9saWJyYXJ5X2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG1vZGU7CisKKyAgICBtb2RlID0ga21wX2dldF9saWJyYXJ5KCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbW9kZSk7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGNoYXIgKmRlZmF1bHRzID0gMDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX3N0cmluZ19wdHI7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfc3RyaW5nX3B0cjsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmZGVmYXVsdHM7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBrbXBfc2V0X2RlZmF1bHRzKGRlZmF1bHRzKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKCZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaygmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2FmZmluaXR5X2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX3NldF9hZmZpbml0eSgmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZ2V0X2FmZmluaXR5X2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX2dldF9hZmZpbml0eSgmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG1heF9wcm9jOworCisgICAgbWF4X3Byb2MgPSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbWF4X3Byb2MpOworfQorCit2b2lkIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCAmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gVGFyZ2V0LXNpZGUgc3R1YnMgZm9yIHRoZSBob3N0IGZ1bmN0aW9ucyAodG8gYXZvaWQgdW5yZXNvbHZlZHMpCisvLyBUaGVzZSBhcmUgbmVlZGVkIGZvciB0aGUgb2ZmbG9hZG0gdGFibGUKKwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworfQorCitpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispCit7Cit9CisKK3ZvaWQgb21wX2dldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3QgKmtpbmQsCisgICAgaW50ICptb2RpZmllcgorKQoreworfQorCit2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK2ludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCitpbnQgb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispCit7Cit9CisKK2ludCBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKQoreworfQorCitzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKykKK3sKK30KKworaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKQoreworfQorCitpbnQga21wX2dldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNoYXIgY29uc3QgKmRlZmF1bHRzCispCit7Cit9CisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MmY4YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfb3JzbC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIgorCituYW1lc3BhY2UgT1JTTCB7CisKK3N0YXRpYyBib29sICAgICAgICAgICAgaXNfZW5hYmxlZCA9IGZhbHNlOworc3RhdGljIGNvbnN0IE9SU0xUYWcgICBteV90YWcgPSAiT2ZmbG9hZCI7CisKK3ZvaWQgaW5pdCgpCit7CisgICAgY29uc3QgY2hhciAqZW52X3ZhciA9IGdldGVudigiT0ZGTE9BRF9FTkFCTEVfT1JTTCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgaXNfZW5hYmxlZCA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9GRkxPQURfRU5BQkxFX09SU0wiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9SU0wgaXMgZW5hYmxlZFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPUlNMIGlzIGRpc2FibGVkXG4iKTsKKyAgICB9Cit9CisKK2Jvb2wgcmVzZXJ2ZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFJlc2VydmUoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB0cnlfcmVzZXJ2ZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFRyeVJlc2VydmUoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCByZWxlYXNlKGludCBkZXZpY2UpCit7CisgICAgaWYgKGlzX2VuYWJsZWQpIHsKKyAgICAgICAgaW50IHBudW0gPSBtaWNfZW5naW5lc1tkZXZpY2VdLmdldF9waHlzaWNhbF9pbmRleCgpOworICAgICAgICBPUlNMQnVzeVNldCBic2V0OworCisgICAgICAgIGJzZXQudHlwZSA9IEJVU1lfU0VUX0ZVTEw7CisgICAgICAgIGlmIChPUlNMUmVsZWFzZSgxLCAmcG51bSwgJmJzZXQsIG15X3RhZykgIT0gMCkgeworICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIE9SU0wKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGI4NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX09SU0xfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX09SU0xfSF9JTkNMVURFRAorCisvLyBPUlNMIGludGVyZmFjZQorbmFtZXNwYWNlIE9SU0wgeworCitleHRlcm4gdm9pZCBpbml0KCk7CisKK2V4dGVybiBib29sIHJlc2VydmUoaW50IGRldmljZSk7CitleHRlcm4gYm9vbCB0cnlfcmVzZXJ2ZShpbnQgZGV2aWNlKTsKK2V4dGVybiB2b2lkIHJlbGVhc2UoaW50IGRldmljZSk7CisKK30gLy8gbmFtZXNwYWNlIE9SU0wKKworI2VuZGlmIC8vIE9GRkxPQURfT1JTTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmNwcApAQCAtMCwwICsxLDM3NSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKyNpZiAhSE9TVF9MSUJSQVJZCisvLyBQcmVkZWZpbmVkIG9mZmxvYWQgZW50cmllcworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9tYXhfdGhyZWFkc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9udW1fcHJvY3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfZHluYW1pY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9keW5hbWljX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RlZF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9uZXN0ZWRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfc2NoZWR1bGVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfc2NoZWR1bGVfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2Rlc3Ryb3lfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Rlc3RfbG9ja19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF90ZXN0X25lc3RfbG9ja19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9zdGFja3NpemVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfc3RhY2tzaXplX3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYmxvY2t0aW1lX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2Jsb2NrdGltZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfbGlicmFyeV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9kZWZhdWx0c19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYWZmaW5pdHlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYWZmaW5pdHlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworCisvLyBQcmVkZWZpbmVkIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaWRlCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBwcmVkZWZpbmVkX2VudHJpZXNbXSA9IHsKKyAgICAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbnVtX3RocmVhZHNfbHJiLAorICAgICJvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9tYXhfdGhyZWFkc19scmIsCisgICAgIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9udW1fcHJvY3NfbHJiLAorICAgICJvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X2R5bmFtaWNfbHJiLAorICAgICJvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X2R5bmFtaWNfbHJiLAorICAgICJvbXBfc2V0X25lc3RlZF90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbmVzdGVkX2xyYiwKKyAgICAib21wX2dldF9uZXN0ZWRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X25lc3RlZF9scmIsCisgICAgIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X3NjaGVkdWxlX2xyYiwKKyAgICAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfc2NoZWR1bGVfbHJiLAorCisgICAgIm9tcF9pbml0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfaW5pdF9sb2NrX2xyYiwKKyAgICAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9kZXN0cm95X2xvY2tfbHJiLAorICAgICJvbXBfc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X2xvY2tfbHJiLAorICAgICJvbXBfdW5zZXRfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF91bnNldF9sb2NrX2xyYiwKKyAgICAib21wX3Rlc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF90ZXN0X2xvY2tfbHJiLAorCisgICAgIm9tcF9pbml0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9pbml0X25lc3RfbG9ja19scmIsCisgICAgIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9kZXN0cm95X25lc3RfbG9ja19scmIsCisgICAgIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3Vuc2V0X25lc3RfbG9ja19scmIsCisgICAgIm9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF90ZXN0X25lc3RfbG9ja19scmIsCisKKyAgICAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X3N0YWNrc2l6ZV9scmIsCisgICAgImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9zdGFja3NpemVfbHJiLAorICAgICJrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9zdGFja3NpemVfc19scmIsCisgICAgImttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYiwKKyAgICAia21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2Jsb2NrdGltZV9scmIsCisgICAgImttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9ibG9ja3RpbWVfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X2xyYiwKKyAgICAia21wX2dldF9saWJyYXJ5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9saWJyYXJ5X2xyYiwKKyAgICAia21wX3NldF9kZWZhdWx0c190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfZGVmYXVsdHNfbHJiLAorCisgICAgImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9jcmVhdGVfYWZmaW5pdHlfbWFza19scmIsCisgICAgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYiwKKyAgICAia21wX3NldF9hZmZpbml0eV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfYWZmaW5pdHlfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYiwKKyAgICAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisgICAgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisKKyAgICAoY29uc3QgY2hhciopIC0xLAorICAgICh2b2lkKikgLTEKK307CisKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBwcmVkZWZpbmVkX3RhYmxlID0geworICAgIHsgcHJlZGVmaW5lZF9lbnRyaWVzLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIEVudHJ5IHRhYmxlCitGdW5jTGlzdCBfX29mZmxvYWRfZW50cmllcygmcHJlZGVmaW5lZF90YWJsZSk7CisjZWxzZQorRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXM7CisjZW5kaWYgLy8gIUhPU1RfTElCUkFSWQorCisvLyBGdW5jdGlvbiB0YWJsZS4gTm8gcHJlZGVmaW5lZCBlbnRyaWVzLgorRnVuY0xpc3QgX19vZmZsb2FkX2Z1bmNzOworCisvLyBWYXIgdGFibGUKK1Zhckxpc3QgIF9fb2ZmbG9hZF92YXJzOworCisvLyBHaXZlbiB0aGUgZnVuY3Rpb24gbmFtZSByZXR1cm5zIHRoZSBhc3NvY2l0YXRlZCBmdW5jdGlvbiBwb2ludGVyCitjb25zdCB2b2lkKiBGdW5jTGlzdDo6ZmluZF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY29uc3Qgdm9pZCogZnVuYyA9IDA7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCAmJiBzdHJjbXAoZS0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZ1bmMgPSBlLT5mdW5jOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIGZ1bmM7Cit9CisKKy8vIEdpdmVuIHRoZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybnMgdGhlIGFzc29jaXRhdGVkIGZ1bmN0aW9uIG5hbWUKK2NvbnN0IGNoYXIqIEZ1bmNMaXN0OjpmaW5kX25hbWUoY29uc3Qgdm9pZCAqZnVuYykKK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gMDsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+ZnVuYyA9PSBmdW5jKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGUtPm5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworLy8gUmV0dXJucyBtYXggbmFtZSBsZW5ndGggZnJvbSBhbGwgdGFibGVzCitpbnQ2NF90IEZ1bmNMaXN0OjptYXhfbmFtZV9sZW5ndGgodm9pZCkKK3sKKyAgICBpZiAobV9tYXhfbmFtZV9sZW4gPCAwKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSAwOworICAgICAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChuLT50YWJsZS5tYXhfbmFtZV9sZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgbi0+dGFibGUubWF4X25hbWVfbGVuID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBtYXggbmFtZSBsZW5ndGggaW4gYSBzaW5nbGUgdGFibGUKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGUtPm5hbWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLT50YWJsZS5tYXhfbmFtZV9sZW4gPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT50YWJsZS5tYXhfbmFtZV9sZW4gPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlbGVjdCBtYXggZnJvbSBhbGwgdGFibGVzCisgICAgICAgICAgICBpZiAobV9tYXhfbmFtZV9sZW4gPCBuLT50YWJsZS5tYXhfbmFtZV9sZW4pIHsKKyAgICAgICAgICAgICAgICBtX21heF9uYW1lX2xlbiA9IG4tPnRhYmxlLm1heF9uYW1lX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIG1fbWF4X25hbWVfbGVuOworfQorCisvLyBEZWJ1Z2dpbmcgZHVtcAordm9pZCBGdW5jTGlzdDo6ZHVtcCh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZ1bmN0aW9uIHRhYmxlOlxuIik7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVwICVzXG4iLCBlLT5mdW5jLCBlLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKK30KKworLy8gRGVidWdnaW5nIGR1bXAKK3ZvaWQgVmFyTGlzdDo6ZHVtcCh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZhciB0YWJsZTpcbiIpOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyAlcCAlbGRcbiIsIGUtPm5hbWUsIGUtPmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5zaXplKTsKKyNlbHNlICAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyAlcFxuIiwgZS0+bmFtZSwgZS0+YWRkcik7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7Cit9CisKKy8vCitpbnQ2NF90IFZhckxpc3Q6OnRhYmxlX3NpemUoaW50NjRfdCAmbmVsZW1zKQoreworICAgIGludDY0X3QgbGVuZ3RoID0gMDsKKworICAgIG5lbGVtcyA9IDA7CisKKyAgICAvLyBjYWxjdWxhdGUgc3RyaW5nIHRhYmxlIHNpemUgYW5kIG51bWJlciBvZiBlbGVtZW50cworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gc3RybGVuKGUtPm5hbWUpICsgMTsKKyAgICAgICAgICAgICAgICBuZWxlbXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZWxlbXMgKiBzaXplb2YoQnVmRW50cnkpICsgbGVuZ3RoOworfQorCisvLyBjb3B5IHRhYmxlIHRvIHRoZSBndmVuIGJ1ZmZlcgordm9pZCBWYXJMaXN0Ojp0YWJsZV9jb3B5KHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpCit7CisgICAgQnVmRW50cnkqIGVsZW1zID0gc3RhdGljX2Nhc3Q8QnVmRW50cnkqPihidWYpOworICAgIGNoYXIqICAgICBuYW1lcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVsZW1zICsgbmVsZW1zKTsKKworICAgIC8vIGNvcHkgZW50cmllcyB0byBidWZmZXIKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbmFtZSBmaWVsZCBjb250YWlucyBvZmZzZXQgdG8gdGhlIG5hbWUgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGVsZW1zLT5uYW1lID0gbmFtZXMgLSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKTsKKyAgICAgICAgICAgICAgICBlbGVtcy0+YWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGUtPmFkZHIpOworCisgICAgICAgICAgICAgICAgLy8gY29weSBuYW1lIHRvIHN0cmluZyB0YWJsZQorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBlLT5uYW1lOworICAgICAgICAgICAgICAgIHdoaWxlICgoKm5hbWVzKysgPSAqbmFtZSsrKSAhPSAnXDAnKTsKKworICAgICAgICAgICAgICAgIGVsZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHBhdGNoIG5hbWUgb2Zmc2V0cyBpbiBhIGJ1ZmZlcgordm9pZCBWYXJMaXN0Ojp0YWJsZV9wYXRjaF9uYW1lcyh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKQoreworICAgIEJ1ZkVudHJ5KiBlbGVtcyA9IHN0YXRpY19jYXN0PEJ1ZkVudHJ5Kj4oYnVmKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lbGVtczsgaSsrKSB7CisgICAgICAgIGVsZW1zW2ldLm5hbWUgKz0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnVmKTsKKyAgICB9Cit9CisKKy8vIEFkZHMgZ2l2ZW4gbGlzdCBlbGVtZW50IHRvIHRoZSBnbG9iYWwgbG9va3VwIHRhYmxlIGxpc3QKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyBvZmZsb2FkIGZ1bmN0aW9uIGVudHJ5IHRhYmxlICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfdGFibGUpOworICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmFkZF90YWJsZShlbnRyeV90YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyBmdW5jdGlvbiB0YWJsZSAlcFxuIiwgZnVuY190YWJsZSk7CisgICAgX19vZmZsb2FkX2Z1bmNzLmFkZF90YWJsZShmdW5jX3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlJlZ2lzdGVyaW5nIHZhciB0YWJsZSAlcFxuIiwgdmFyX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfdmFycy5hZGRfdGFibGUodmFyX3RhYmxlKTsKK30KKworLy8gUmVtb3ZlcyBnaXZlbiBsaXN0IGVsZW1lbnQgZnJvbSB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSBsaXN0CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKykKK3sKKyAgICBfX29mZmxvYWRfZW50cmllcy5yZW1vdmVfdGFibGUoZW50cnlfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVW5yZWdpc3RlcmluZyBmdW5jdGlvbiB0YWJsZSAlcFxuIiwgZnVuY190YWJsZSk7CisgICAgX19vZmZsb2FkX2Z1bmNzLnJlbW92ZV90YWJsZShmdW5jX3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlVucmVnaXN0ZXJpbmcgdmFyIHRhYmxlICVwXG4iLCB2YXJfdGFibGUpOworICAgIF9fb2ZmbG9hZF92YXJzLnJlbW92ZV90YWJsZSh2YXJfdGFibGUpOworfQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZWQzZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSB0YWJsZXMgdXNlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIE9GRkxPQURfVEFCTEVfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorCisvLyBUZW1wbGF0ZSByZXByZXNlbnRpbmcgZG91YmxlIGxpbmtlZCBsaXN0IG9mIHRhYmxlcwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFRhYmxlTGlzdCB7CitwdWJsaWM6CisgICAgLy8gdGFibGUgdHlwZQorICAgIHR5cGVkZWYgVCBUYWJsZTsKKworICAgIC8vIExpc3Qgbm9kZQorICAgIHN0cnVjdCBOb2RlIHsKKyAgICAgICAgVGFibGUgICB0YWJsZTsKKyAgICAgICAgTm9kZSogICBwcmV2OworICAgICAgICBOb2RlKiAgIG5leHQ7CisgICAgfTsKKworcHVibGljOgorICAgIGV4cGxpY2l0IFRhYmxlTGlzdChOb2RlICpub2RlID0gMCkgOiBtX2hlYWQobm9kZSkge30KKworICAgIHZvaWQgYWRkX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKworICAgICAgICBpZiAobV9oZWFkICE9IDApIHsKKyAgICAgICAgICAgIG5vZGUtPm5leHQgPSBtX2hlYWQ7CisgICAgICAgICAgICBtX2hlYWQtPnByZXYgPSBub2RlOworICAgICAgICB9CisgICAgICAgIG1faGVhZCA9IG5vZGU7CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKworICAgICAgICBpZiAobm9kZS0+bmV4dCAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZS0+cHJldiAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9oZWFkID09IG5vZGUpIHsKKyAgICAgICAgICAgIG1faGVhZCA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgTm9kZSogICAgICAgICAgIG1faGVhZDsKKyAgICBtdXRleF90ICAgICAgICAgbV9sb2NrOworfTsKKworLy8gRnVuY3Rpb24gbG9va3VwIHRhYmxlLgorc3RydWN0IEZ1bmNUYWJsZSB7CisgICAgLy8hIEZ1bmN0aW9uIHRhYmxlIGVudHJ5CisgICAgLyohIFRoaXMgdGFibGUgY29udGFpbnMgZnVuY3Rpb25zIGNyZWF0ZWQgZnJvbSBvZmZsb2FkIHJlZ2lvbnMuICAgKi8KKyAgICAvKiEgRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uJ3MgImtleSIKKyAgICAgICAgYW5kIHRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISBFYWNoIHNoYXJlZCBsaWJyYXJ5IG9yIGV4ZWN1dGFibGUgbWF5IGNvbnRhaW4gb25lIHN1Y2ggdGFibGUuICovCisgICAgLyohIFRoZSBlbmQgb2YgdGhlIHRhYmxlIGlzIG1hcmtlZCB3aXRoIGFuIGVudHJ5IHdob3NlIG5hbWUgZmllbGQKKyAgICAgICAgaGFzIHZhbHVlIC0xLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7IC8vITwgTmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgICAgdm9pZCogICAgICAgZnVuYzsgLy8hPCBBZGRyZXNzIG9mIHRoZSBmdW5jdGlvbgorICAgIH07CisKKyAgICAvLyBlbnRyaWVzCisgICAgY29uc3QgRW50cnkgKmVudHJpZXM7CisKKyAgICAvLyBtYXggbmFtZSBsZW5ndGgKKyAgICBpbnQ2NF90IG1heF9uYW1lX2xlbjsKK307CisKKy8vIEZ1bmN0aW9uIHRhYmxlCitjbGFzcyBGdW5jTGlzdCA6IHB1YmxpYyBUYWJsZUxpc3Q8RnVuY1RhYmxlPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRnVuY0xpc3QoTm9kZSAqbm9kZSA9IDApIDogVGFibGVMaXN0PFRhYmxlPihub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9uYW1lX2xlbigtMSkKKyAgICB7fQorCisgICAgLy8gYWRkIHRhYmxlIHRvIHRoZSBsaXN0CisgICAgdm9pZCBhZGRfdGFibGUoTm9kZSAqbm9kZSkgeworICAgICAgICAvLyByZWNhbGN1bGF0ZSBtYXggZnVuY3Rpb24gbmFtZSBsZW5ndGgKKyAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSAtMTsKKworICAgICAgICAvLyBhZGQgdGFibGUKKyAgICAgICAgVGFibGVMaXN0PFRhYmxlPjo6YWRkX3RhYmxlKG5vZGUpOworICAgIH0KKworICAgIC8vIGZpbmQgZnVuY3Rpb24gYWRkcmVzcyBmb3IgdGhlIGdpdmVuIG5hbWUKKyAgICBjb25zdCB2b2lkKiBmaW5kX2FkZHIoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAvLyBmaW5kIGZ1bmN0aW9uIG5hbWUgZm9yIHRoZSBnaXZlbiBhZGRyZXNzCisgICAgY29uc3QgY2hhciogZmluZF9uYW1lKGNvbnN0IHZvaWQgKmFkZHIpOworCisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoIGZyb20gYWxsIHRhYmxlcyBpbiB0aGUgbGlzdAorICAgIGludDY0X3QgbWF4X25hbWVfbGVuZ3RoKHZvaWQpOworCisgICAgLy8gZGVidWcgZHVtcAorICAgIHZvaWQgZHVtcCh2b2lkKTsKKworcHJpdmF0ZToKKyAgICAvLyBtYXggbmFtZSBsZW5ndGggd2l0aGluIGZyb20gYWxsIHRhYmxlcworICAgIGludDY0X3QgbV9tYXhfbmFtZV9sZW47Cit9OworCisvLyBUYWJsZSBlbnRyeSBmb3Igc3RhdGljIHZhcmlhYmxlcworc3RydWN0IFZhclRhYmxlIHsKKyAgICAvLyEgVmFyaWFibGUgdGFibGUgZW50cnkKKyAgICAvKiEgVGhpcyB0YWJsZSBjb250YWlucyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB2YXJpYWJsZXMgbWFya2VkIHdpdGgKKyAgICAgICAgX19kZWNsc3BlYyh0YXJnZXQobWljKSBvciAjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldC4gICAgICAgICAgICovCisgICAgLyohIEVhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSdzICJrZXkiLAorICAgICAgICB0aGUgdmFyaWFibGUgYWRkcmVzcyBhbmQgaXRzIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgQmVjYXVzZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIGZyb20gdGhlIGhvc3QsCisgICAgICAgIHRoZSBNSUMgdGFibGUgZG9lcyBub3QgbmVlZCB0aGUgc2l6ZSBvZiB0aGUgdmFyaWFibGUuICAgICAgICAgICAqLworICAgIC8qISBQYWRkaW5nIHRvIG1ha2UgdGhlIHRhYmxlIGVudHJ5IHNpemUgYSBwb3dlciBvZiAyIGlzIG5lY2Vzc2FyeQorICAgICAgICB0byBhdm9pZCAiaG9sZXMiIGJldHdlZW4gdGFibGUgY29udHJpYnV0aW9ucyBmcm9tIGRpZmZlcmVudCBvYmplY3QKKyAgICAgICAgZmlsZXMgb24gV2luZG93cyB3aGVuIGRlYnVnIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCB3aXRoIC9aaS4gICovCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZTsgLy8hPCBOYW1lIG9mIHRoZSB2YXJpYWJsZQorICAgICAgICB2b2lkKiAgICAgICBhZGRyOyAvLyE8IEFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlCisKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgdWludDY0X3QgICAgc2l6ZTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorCQkvLyBwYWRkaW5nIHRvIG1ha2UgZW50cnkgc2l6ZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgdWludDY0X3QgICAgcGFkZGluZzsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNlbmRpZgorICAgIH07CisKKyAgICAvLyBUYWJsZSB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHdpdGggbmFtZSA9PSAtMQorICAgIGNvbnN0IEVudHJ5ICplbnRyaWVzOworfTsKKworLy8gTGlzdCBvZiB2YXIgdGFibGVzCitjbGFzcyBWYXJMaXN0IDogcHVibGljIFRhYmxlTGlzdDxWYXJUYWJsZT4geworcHVibGljOgorICAgIFZhckxpc3QoKSA6IFRhYmxlTGlzdDxUYWJsZT4oKQorICAgIHt9CisKKyAgICAvLyBkZWJ1ZyBkdW1wCisgICAgdm9pZCBkdW1wKCk7CisKK3B1YmxpYzoKKyAgICAvLyB2YXIgdGFibGUgbGlzdCBpdGVyYXRvcgorICAgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZTo6RW50cnk+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKCkgOiBtX25vZGUoMCksIG1fZW50cnkoMCkge30KKworICAgICAgICBleHBsaWNpdCBJdGVyYXRvcihOb2RlICpub2RlKSB7CisgICAgICAgICAgICBuZXdfbm9kZShub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgICAgICAgaWYgKG1fZW50cnkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fZW50cnkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9lbnRyeS0+bmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZW50cnkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fZW50cnktPm5hbWUgPT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlKG1fbm9kZS0+bmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZW50cnkgPT0gb3RoZXIubV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5ICE9IG90aGVyLm1fZW50cnk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBUYWJsZTo6RW50cnkqIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5ld19ub2RlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgICAgIG1fbm9kZSA9IG5vZGU7CisgICAgICAgICAgICBtX2VudHJ5ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChtX25vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fZW50cnkgPSBtX25vZGUtPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fZW50cnktPm5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX2VudHJ5LT5uYW1lICE9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9ub2RlID0gbV9ub2RlLT5uZXh0OworICAgICAgICAgICAgICAgIG1fZW50cnkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBOb2RlICAgICAgICAgICAgICAgICptX25vZGU7CisgICAgICAgIGNvbnN0IFRhYmxlOjpFbnRyeSAgKm1fZW50cnk7CisgICAgfTsKKworICAgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXRlcmF0b3IobV9oZWFkKTsKKyAgICB9CisKKyAgICBJdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcigpOworICAgIH0KKworcHVibGljOgorICAgIC8vIEVudHJ5IHJlcHJlc2VudGF0aW9uIGluIGEgY29weSBidWZmZXIKKyAgICBzdHJ1Y3QgQnVmRW50cnkgeworICAgICAgICBpbnRwdHJfdCBuYW1lOworICAgICAgICBpbnRwdHJfdCBhZGRyOworICAgIH07CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUgYW5kCisgICAgLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiBidWZmZXIgZm9yIHRoZSB0YWJsZQorICAgIGludDY0X3QgdGFibGVfc2l6ZShpbnQ2NF90ICZuZWxlbXMpOworCisgICAgLy8gQ29weSB0YWJsZSBjb250ZW50cyB0byBnaXZlbiBidWZmZXIuIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGxhcmdlCisgICAgLy8gZW5vdWdoIHRvIGhvbGQgYWxsIGVsZW1lbnRzIGFzIHN0cmluZyB0YWJsZS4KKyAgICB2b2lkIHRhYmxlX2NvcHkodm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcyk7CisKKyAgICAvLyBQYXRjaCBuYW1lIG9mZnNldHMgaW4gYSB0YWJsZSBhZnRlciBpdCdzIGJlZW4gY29waWVkIHRvIG90aGVyIHNpZGUKKyAgICBzdGF0aWMgdm9pZCB0YWJsZV9wYXRjaF9uYW1lcyh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKTsKK307CisKK2V4dGVybiBGdW5jTGlzdCBfX29mZmxvYWRfZW50cmllczsKK2V4dGVybiBGdW5jTGlzdCBfX29mZmxvYWRfZnVuY3M7CitleHRlcm4gVmFyTGlzdCAgX19vZmZsb2FkX3ZhcnM7CisKKy8vIFNlY3Rpb24gbmFtZXMgd2hlcmUgdGhlIGxvb2t1cCB0YWJsZXMgYXJlIHN0b3JlZAorI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAiLk9mZmxvYWRFbnRyeVRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQgICAgICIuT2ZmbG9hZEVudHJ5VGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAiLk9mZmxvYWRGdW5jVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgIi5PZmZsb2FkRnVuY1RhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5PZmZsb2FkVmFyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5PZmZsb2FkVmFyVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCAgICAgICAiLkNSVCRYQ1QiCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCwgcmVhZCkKKworI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCAgICIuT2ZmbG9hZEVudHJ5VGFibGUuIgorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EICAgICAiLk9mZmxvYWRFbnRyeVRhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAiLk9mZmxvYWRGdW5jVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQgICAgICAiLk9mZmxvYWRGdW5jVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuT2ZmbG9hZFZhclRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5PZmZsb2FkVmFyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisKKy8vIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZ2l2ZW4gdGFibGVzCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispOworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKyk7CisjZW5kaWYgIC8vIE9GRkxPQURfVEFCTEVfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMWIwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAKQEAgLTAsMCArMSw3NTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgU0VQX1NVUFBPUlQKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8bWFwPgorCisvLyB0eXBlZGVmIG9mZmxvYWRfZnVuY193aXRoX3Bhcm1zLgorLy8gUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJlcHJlc2VudHMgYW4gb2ZmbG9hZGVkIGVudHJ5IHBvaW50LgorLy8gVGhlIHBhcmFtZXRlcnMgYXJlIGEgdGVtcG9yYXJ5IGZpeCBmb3IgcGFyYW1ldGVycyBvbiB0aGUgc3RhY2suCit0eXBlZGVmIHZvaWQgKCpvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcykodm9pZCAqKTsKKworLy8gVGFyZ2V0IGNvbnNvbGUgYW5kIGZpbGUgbG9nZ2luZworY29uc3QgY2hhciAqcHJlZml4OworaW50IGNvbnNvbGVfZW5hYmxlZCA9IDA7CitpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSAwOworCisvLyBUcmFjZSBpbmZvcm1hdGlvbgorc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1tdID0geworICAgICJOT0NPUFkiLAorICAgICJJTiIsCisgICAgIk9VVCIsCisgICAgIklOT1VUIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW10gPSB7CisgICAgInVua25vd24iLAorICAgICJkYXRhIiwKKyAgICAiZGF0YV9wdHIiLAorICAgICJmdW5jX3B0ciIsCisgICAgInZvaWRfcHRyIiwKKyAgICAic3RyaW5nX3B0ciIsCisgICAgImR2IiwKKyAgICAiZHZfZGF0YSIsCisgICAgImR2X2RhdGFfc2xpY2UiLAorICAgICJkdl9wdHIiLAorICAgICJkdl9wdHJfZGF0YSIsCisgICAgImR2X3B0cl9kYXRhX3NsaWNlIiwKKyAgICAiY2Vhbl92YXIiLAorICAgICJjZWFuX3Zhcl9wdHIiLAorICAgICJjX2RhdGFfcHRyX2FycmF5IgorfTsKKworaW50IG1pY19pbmRleCA9IC0xOworaW50IG1pY19lbmdpbmVzX3RvdGFsID0gLTE7Cit1aW50NjRfdCBtaWNfZnJlcXVlbmN5ID0gMDsKK2ludCBvZmZsb2FkX251bWJlciA9IDA7CitzdGF0aWMgc3RkOjptYXA8dm9pZCosIFJlZkluZm8qPiByZWZfZGF0YTsKK3N0YXRpYyBtdXRleF90IGFkZF9yZWZfbG9jazsKKworI2lmZGVmIFNFUF9TVVBQT1JUCitzdGF0aWMgY29uc3QgY2hhciogIHNlcF9tb25pdG9yX2VudiA9ICJTRVBfTU9OSVRPUiI7CitzdGF0aWMgYm9vbCAgICAgICAgIHNlcF9tb25pdG9yID0gZmFsc2U7CitzdGF0aWMgY29uc3QgY2hhciogIHNlcF9kZXZpY2VfZW52ID0gIlNFUF9ERVZJQ0UiOworc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfZGV2aWNlID0gICIvZGV2L3NlcDMuOC9jIjsKK3N0YXRpYyBpbnQgICAgICAgICAgc2VwX2NvdW50ZXIgPSAwOworCisjZGVmaW5lIFNFUF9BUElfSU9DX01BR0lDICAgOTkKKyNkZWZpbmUgU0VQX0lPQ1RMX1BBVVNFICAgICBfSU8gKFNFUF9BUElfSU9DX01BR0lDLCAzMSkKKyNkZWZpbmUgU0VQX0lPQ1RMX1JFU1VNRSAgICBfSU8gKFNFUF9BUElfSU9DX01BR0lDLCAzMikKKworc3RhdGljIHZvaWQgYWRkX3JlZl9jb3VudCh2b2lkICogYnVmLCBib29sIGNyZWF0ZWQpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKGFkZF9yZWZfbG9jayk7CisgICAgUmVmSW5mbyAqIGluZm8gPSByZWZfZGF0YVtidWZdOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgaW5mby0+Y291bnQrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGluZm8gPSBuZXcgUmVmSW5mbygoaW50KWNyZWF0ZWQsKGxvbmcpMSk7CisgICAgfQorICAgIGluZm8tPmlzX2FkZGVkIHw9IGNyZWF0ZWQ7CisgICAgcmVmX2RhdGFbYnVmXSA9IGluZm87Cit9CisKK3N0YXRpYyB2b2lkIEJ1ZlJlbGVhc2VSZWYodm9pZCAqIGJ1ZikKK3sKKyAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoYWRkX3JlZl9sb2NrKTsKKyAgICBSZWZJbmZvICogaW5mbyA9IHJlZl9kYXRhW2J1Zl07CisKKyAgICBpZiAoaW5mbykgeworICAgICAgICAtLWluZm8tPmNvdW50OworICAgICAgICBpZiAoaW5mby0+Y291bnQgPT0gMCAmJiBpbmZvLT5pc19hZGRlZCkgeworICAgICAgICAgICAgQnVmZmVyUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgaW5mby0+aXNfYWRkZWQgPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IFZUUGF1c2VTYW1wbGluZyh2b2lkKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaGFuZGxlID0gb3BlbihzZXBfZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChoYW5kbGUgPiAwKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGhhbmRsZSwgU0VQX0lPQ1RMX1BBVVNFKTsKKyAgICAgICAgY2xvc2UoaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBWVFJlc3VtZVNhbXBsaW5nKHZvaWQpCit7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBoYW5kbGUgPSBvcGVuKHNlcF9kZXZpY2UsIE9fUkRXUik7CisgICAgaWYgKGhhbmRsZSA+IDApIHsKKyAgICAgICAgcmV0ID0gaW9jdGwoaGFuZGxlLCBTRVBfSU9DVExfUkVTVU1FKTsKKyAgICAgICAgY2xvc2UoaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIEZ1bmN0aW9uRGVzY3JpcHRvciAqZnVuYyA9IChGdW5jdGlvbkRlc2NyaXB0b3IqKSBtaXNjX2RhdGE7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGZ1bmMtPmRhdGE7CisgICAgT2ZmbG9hZERlc2NyaXB0b3Igb2ZsZDsKKyAgICBjaGFyICppbl9kYXRhID0gMDsKKyAgICBjaGFyICpvdXRfZGF0YSA9IDA7CisgICAgY2hhciAqdGltZXJfZGF0YSA9IDA7CisKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBmdW5jLT5jb25zb2xlX2VuYWJsZWQ7CisgICAgdGltZXJfZW5hYmxlZCA9IGZ1bmMtPnRpbWVyX2VuYWJsZWQ7CisgICAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBmdW5jLT5vZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICBvZmZsb2FkX251bWJlciA9IGZ1bmMtPm9mZmxvYWRfbnVtYmVyOworICAgIG9mbGQuc2V0X29mZmxvYWRfbnVtYmVyKGZ1bmMtPm9mZmxvYWRfbnVtYmVyKTsKKworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgaWYgKHNlcF9tb25pdG9yKSB7CisgICAgICAgIGlmIChfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmc2VwX2NvdW50ZXIsIDEpID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZUUmVzdW1lU2FtcGxpbmdcbiIpOworICAgICAgICAgICAgVlRSZXN1bWVTYW1wbGluZygpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgb2ZsZC5nZXRfb2ZmbG9hZF9udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBcIiVzXCIgc3RhcnRlZFxuIiwgbmFtZSk7CisKKyAgICAvLyBpbml0aWFsaXplIHRpbWVyIGRhdGEKKyAgICBPRkZMT0FEX1RJTUVSX0lOSVQoKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKTsKKworICAgIC8vIGdldCBpbnB1dC9vdXRwdXQgYnVmZmVyIGFkZHJlc3NlcworICAgIGlmIChmdW5jLT5pbl9kYXRhbGVuID4gMCB8fCBmdW5jLT5vdXRfZGF0YWxlbiA+IDApIHsKKyAgICAgICAgaWYgKGZ1bmMtPmRhdGFfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGluX2RhdGEgPSAoY2hhciopIG1pc2NfZGF0YSArIGZ1bmMtPmRhdGFfb2Zmc2V0OworICAgICAgICAgICAgb3V0X2RhdGEgPSAoY2hhciopIHJldHVybl9kYXRhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqaW5vdXRfYnVmID0gKGNoYXIqKSBidWZmZXJzWy0tYnVmZmVyX2NvdW50XTsKKyAgICAgICAgICAgIGluX2RhdGEgPSBpbm91dF9idWY7CisgICAgICAgICAgICBvdXRfZGF0YSA9IGlub3V0X2J1ZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFzc2lnbiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIG9mbGQubV92YXJzX3RvdGFsID0gZnVuYy0+dmFyc19udW07CisgICAgaWYgKG9mbGQubV92YXJzX3RvdGFsID4gMCkgeworICAgICAgICB1aW50NjRfdCB2YXJfZGF0YV9sZW4gPSBvZmxkLm1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICBvZmxkLm1fdmFycyA9IChWYXJEZXNjKikgbWFsbG9jKHZhcl9kYXRhX2xlbik7CisgICAgICAgIG1lbWNweShvZmxkLm1fdmFycywgaW5fZGF0YSwgdmFyX2RhdGFfbGVuKTsKKworICAgICAgICBpbl9kYXRhICs9IHZhcl9kYXRhX2xlbjsKKyAgICAgICAgZnVuYy0+aW5fZGF0YWxlbiAtPSB2YXJfZGF0YV9sZW47CisgICAgfQorCisgICAgLy8gdGltZXIgZGF0YQorICAgIGlmIChmdW5jLT50aW1lcl9lbmFibGVkKSB7CisgICAgICAgIHVpbnQ2NF90IHRpbWVyX2RhdGFfbGVuID0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgdGltZXJfZGF0YSA9IG91dF9kYXRhOworICAgICAgICBvdXRfZGF0YSArPSB0aW1lcl9kYXRhX2xlbjsKKyAgICAgICAgZnVuYy0+b3V0X2RhdGFsZW4gLT0gdGltZXJfZGF0YV9sZW47CisgICAgfQorCisgICAgLy8gaW5pdCBNYXJzaGFsbGVycworICAgIG9mbGQubV9pbi5pbml0X2J1ZmZlcihpbl9kYXRhLCBmdW5jLT5pbl9kYXRhbGVuKTsKKyAgICBvZmxkLm1fb3V0LmluaXRfYnVmZmVyKG91dF9kYXRhLCBmdW5jLT5vdXRfZGF0YWxlbik7CisKKyAgICAvLyBjb3B5IGJ1ZmZlcnMgdG8gb2ZmbG9hZCBkZXNjcmlwdG9yCisgICAgc3RkOjpjb3B5KGJ1ZmZlcnMsIGJ1ZmZlcnMgKyBidWZmZXJfY291bnQsCisgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihvZmxkLm1fYnVmZmVycykpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCk7CisKKyAgICAvLyBmaW5kIG9mZmxvYWQgZW50cnkgYWRkcmVzcworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCk7CisKKyAgICBvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcyBlbnRyeSA9IChvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcykKKyAgICAgICAgX19vZmZsb2FkX2VudHJpZXMuZmluZF9hZGRyKG5hbWUpOworCisgICAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICBpZiAoY29uc29sZV9lbmFibGVkID4gMikgeworICAgICAgICAgICAgX19vZmZsb2FkX2VudHJpZXMuZHVtcCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLCBuYW1lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKTsKKworICAgIC8vIGV4ZWN1dGUgb2ZmbG9hZCBlbnRyeQorICAgIGVudHJ5KCZvZmxkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKTsKKworICAgIC8vIGNvcHkgdGltZXIgZGF0YSB0byB0aGUgYnVmZmVyCisgICAgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQSh0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9mZmxvYWQgXCIlc1wiIGZpbmlzaGVkXG4iLCBuYW1lKTsKKworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgaWYgKHNlcF9tb25pdG9yKSB7CisgICAgICAgIGlmIChfX3N5bmNfc3ViX2FuZF9mZXRjaCgmc2VwX2NvdW50ZXIsIDEpID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZUUGF1c2VTYW1wbGluZ1xuIik7CisgICAgICAgICAgICBWVFBhdXNlU2FtcGxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjptZXJnZV92YXJfZGVzY3MoCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwKKykKK3sKKyAgICAvLyBudW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMgcmVjZWl2ZWQgZnJvbSBob3N0IGFuZCBnZW5lcmF0ZWQKKyAgICAvLyBsb2NhbGx5IHNob3VsZCBtYXRjaAorICAgIGlmIChtX3ZhcnNfdG90YWwgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tZXJnZV92YXJfZGVzY3MxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgdmFyc190b3RhbCkgeworICAgICAgICAgICAgLy8gdmFyaWFibGUgdHlwZSBtdXN0IG1hdGNoCisgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuYml0cyAhPSB2YXJzW2ldLnR5cGUuYml0cykgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tZXJnZV92YXJfZGVzY3MyKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gdmFyc1tpXS5wdHI7CisgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHZhcnNbaV0uaW50bzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyX3NuYW1lID0gIiI7CisgICAgICAgICAgICBpZiAodmFyczIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICh2YXJzMltpXS5zbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHZhcl9zbmFtZSA9IHZhcnMyW2ldLnNuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCBnZXRfb2ZmbG9hZF9udW1iZXIoKSwgY19vZmZsb2FkX3ZhciwKKyAgICAgICAgICAgICAgICAiICAgVmFyRGVzYyAlZCwgdmFyPSVzLCAlcywgJXNcbiIsCisgICAgICAgICAgICAgICAgaSwgdmFyX3NuYW1lLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1ttX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHNdLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuc3JjXSk7CisgICAgICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiB2YXJzMltpXS5kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiICAgICAgICAgICAgICBpbnRvPSVzLCAlc1xuIiwgdmFyczJbaV0uZG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuZHN0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgIiAgICAgICAgICAgICAgdHlwZV9zcmM9JWQsIHR5cGVfZHN0bj0lZCwgZGlyZWN0aW9uPSVkLCAiCisgICAgICAgICAgICAiYWxsb2NfaWY9JWQsIGZyZWVfaWY9JWQsIGFsaWduPSVkLCBtaWNfb2Zmc2V0PSVkLCBmbGFncz0weCV4LCAiCisgICAgICAgICAgICAib2Zmc2V0PSVsbGQsIHNpemU9JWxsZCwgY291bnQvZGlzcD0lbGxkLCBwdHI9JXAgaW50bz0lcFxuIiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYywKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsaWduLAorICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byk7CisgICAgfQorfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpzY2F0dGVyX2NvcHlpbl9kYXRhKCkKK3sKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiSU4gIGJ1ZmZlciBAICVwIHNpemUgJWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKDIsIG1faW4uZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc2l6ZSgpKTsKKworICAgIC8vIHJlY2VpdmUgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworICAgICAgICB2b2lkKiogcHRyX2FkZHIgPSBzcmNfaXNfZm9yX21pYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgaW50IHR5cGUgPSBzcmNfaXNfZm9yX21pYyA/IG1fdmFyc1tpXS50eXBlLnNyYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3Q7CisgICAgICAgIGJvb2wgaXNfc3RhdGljID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bjsKKyAgICAgICAgdm9pZCAqcHRyID0gTlVMTDsKKworICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3ApIHsKKyAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZvZmZzZXQsIHNpemVvZihvZmZzZXQpKTsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpIHx8CisgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKHR5cGUpKSB7CisgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGFfc2xpY2UgfHwgdHlwZSA9PSBjX2R2X2RhdGEpPworICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4ocHRyX2FkZHIpIDoKKyAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4ocHRyX2FkZHIpOworICAgICAgICAgICAgcHRyX2FkZHIgPSByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmR2cC0+QmFzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgcG9pbnRlciB2YWx1ZXMKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heF9lbCA9IGogKyBtX3ZhcnNbaV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRzdF9hcnJfcHRyID0gKHNyY19pc19mb3JfbWljKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPCBtYXhfZWw7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2pdLnB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9hcnJfcHRyICsgbV92YXJzW2pdLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2pdLmludG8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXJyX3B0ciArIG1fdmFyc1tqXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gbV9idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckFkZFJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmX2NvdW50KGJ1ZiwgMCA9PSBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBtX2J1ZmZlcnMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYnVmZmVycy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQWRkUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9yZWZfY291bnQoYnVmLCAwID09IG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsgbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKyBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIC8vIFJlbGVhc2Ugb2Jzb2xldGUgYnVmZmVycyBmb3Igc3RhY2sgb2YgcGVyc2lzdGVudCBvYmplY3RzCisgICAgICAgIGlmICh0eXBlID0gY19kYXRhX3B0ciAmJgorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgbV92YXJzW2ldLnNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICByZWZfZGF0YS5lcmFzZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEbyBjb3B5aW4KKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCgmc2l6ZSksIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgoJmRpc3ApLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEocHRyICsgZGlzcCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciogcHRyID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKHB0ciArIHNpemVvZih1aW50NjRfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9mdW5jX3B0cigoY29uc3Qgdm9pZCoqKSBtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVFJBQ0UoMSwgIlRvdGFsIGNvcHlpbiBkYXRhIHJlY2VpdmVkIGZyb20gaG9zdDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cyk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSk7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OmdhdGhlcl9jb3B5b3V0X2RhdGEoKQoreworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXQuc2VuZF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgIHNyY19pc19mb3JfbWljICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0LnNlbmRfZnVuY19wdHIoKigodm9pZCoqKSBtX3ZhcnNbaV0ucHRyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYyAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLmludG8pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhX3NsaWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPVVQgYnVmZmVyIEAgcCAlcCBzaXplICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgZ2V0X29mZmxvYWRfbnVtYmVyKCksIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgY29weW91dCBkYXRhIHNlbnQgdG8gaG9zdDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMpOworfQorCit2b2lkIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCh2b2lkKQoreworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgY29uc3QgY2hhciogZW52X3ZhciA9IGdldGVudihzZXBfbW9uaXRvcl9lbnYpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBzZXBfbW9uaXRvciA9IGF0b2koZW52X3Zhcik7CisgICAgfQorICAgIGVudl92YXIgPSBnZXRlbnYoc2VwX2RldmljZV9lbnYpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBzZXBfZGV2aWNlID0gZW52X3ZhcjsKKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKworICAgIHByZWZpeCA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKworICAgIC8vIGluaXQgZnJlcXVlbmN5CisgICAgbWljX2ZyZXF1ZW5jeSA9IENPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSgpOworfQorCisvLyBVc2VyLXZpc2libGUgb2ZmbG9hZCBBUEkKKworaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gbWljX2luZGV4OworfQorCitpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICBFbmdpbmVHZXRJbmRleCgmaW5kZXgpOworICAgIHJldHVybiBpbmRleDsKK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMzE0NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBwYXJ0cyBvZiB0aGUgb2ZmbG9hZCBsaWJyYXJ5IHVzZWQgb25seSBvbiB0aGUgdGFyZ2V0CisKKyNpZm5kZWYgT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorI2luY2x1ZGUgImNvaS9jb2lfc2VydmVyLmgiCisKKy8vIFRoZSBvZmZsb2FkIGRlc2NyaXB0b3IuCitjbGFzcyBPZmZsb2FkRGVzY3JpcHRvcgoreworcHVibGljOgorICAgIH5PZmZsb2FkRGVzY3JpcHRvcigpIHsKKyAgICAgICAgaWYgKG1fdmFycyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fdmFycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbnRyeSBwb2ludCBmb3IgQ09JLiBTeW5jaHJvbm91c2x5IGV4ZWN1dGUgb2ZmbG9hZGVkIHJlZ2lvbiBnaXZlbgorICAgIC8vIHRoZSBwcm92aWRlZCBidWZmZXJzLCBtaXNjIGFuZCByZXR1cm4gZGF0YS4KKyAgICBzdGF0aWMgdm9pZCBvZmZsb2FkKAorICAgICAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgICAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICAgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICAgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICAgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorICAgICk7CisKKyAgICAvLyBzY2F0dGVycyBpbnB1dCBkYXRhIGZyb20gaW4gYnVmZmVyIHRvIHRhcmdldCB2YXJpYWJsZXMKKyAgICB2b2lkIHNjYXR0ZXJfY29weWluX2RhdGEoKTsKKworICAgIC8vIGdhdGhlcnMgb3V0cHV0IGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIHZvaWQgZ2F0aGVyX2NvcHlvdXRfZGF0YSgpOworCisgICAgLy8gbWVyZ2VzIGxvY2FsIHZhcmlhYmxlIGRlc2NyaXB0b3JzIHdpdGggdGhlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20KKyAgICAvLyBob3N0CisgICAgdm9pZCBtZXJnZV92YXJfZGVzY3MoVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCk7CisKKyAgICBpbnQgZ2V0X29mZmxvYWRfbnVtYmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vZmZsb2FkX251bWJlcjsKKyAgICB9CisKKyAgICB2b2lkIHNldF9vZmZsb2FkX251bWJlcihpbnQgbnVtYmVyKSB7CisgICAgICAgIG1fb2ZmbG9hZF9udW1iZXIgPSBudW1iZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgT2ZmbG9hZERlc2NyaXB0b3IoKSA6IG1fdmFycygwKQorICAgIHt9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8dm9pZCo+IEJ1ZmZlckxpc3Q7CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIGlucHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1faW47CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIG91dHB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX291dDsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgIEJ1ZmZlckxpc3QgbV9idWZmZXJzOworCisgICAgLy8gVmFyaWFibGUgZGVzY3JpcHRvcnMgcmVjZWl2ZWQgZnJvbSBob3N0CisgICAgVmFyRGVzYyogbV92YXJzOworICAgIGludCAgICAgIG1fdmFyc190b3RhbDsKKyAgICBpbnQgICAgICBtX29mZmxvYWRfbnVtYmVyOworfTsKKworLy8gb25lIHRpbWUgdGFyZ2V0IGluaXRpYWxpemF0aW9uIGluIG1haW4KK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCh2b2lkKTsKKworLy8gbG9naWNhbCBkZXZpY2UgaW5kZXgKK2V4dGVybiBpbnQgbWljX2luZGV4OworCisvLyB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIGxvZ2ljYWwgZGV2aWNlcworZXh0ZXJuIGludCBtaWNfZW5naW5lc190b3RhbDsKKworLy8gZGV2aWNlIGZyZXF1ZW5jeSAoZnJvbSBDT0kpCitleHRlcm4gdWludDY0X3QgbWljX2ZyZXF1ZW5jeTsKKworc3RydWN0IFJlZkluZm8geworICAgIFJlZkluZm8oYm9vbCBpc19hZGQsIGxvbmcgYW1vdW50KTppc19hZGRlZChpc19hZGQpLGNvdW50KGFtb3VudCkKKyAgICB7fQorICAgIGJvb2wgaXNfYWRkZWQ7CisgICAgbG9uZyBjb3VudDsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldF9tYWluLmNwcApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdGFyZ2V0X21haW4odm9pZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisgICAgX19vZmZsb2FkX3RhcmdldF9tYWluKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDAxYTlkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaApAQCAtMCwwICsxLDE3MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfVElNRVJfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCitleHRlcm4gaW50IHRpbWVyX2VuYWJsZWQ7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCitzdHJ1Y3QgT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSB7CisgICAgdWludDY0X3QgZnJlcXVlbmN5OworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICB1aW50NjRfdCB0b3RhbDsKKyAgICB9IHBoYXNlc1tjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZV07Cit9OworCitzdHJ1Y3QgT2ZmbG9hZEhvc3RUaW1lckRhdGEgeworICAgIC8vIHNvdXJjZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisgICAgY29uc3QgY2hhciogZmlsZTsKKyAgICBpbnQgICAgICAgICBsaW5lOworCisgICAgLy8gaG9zdCB0aW1lciBkYXRhCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgICAgIHVpbnQ2NF90IHRvdGFsOworICAgIH0gcGhhc2VzW2Nfb2ZmbG9hZF9ob3N0X21heF9waGFzZV07CisKKyAgICB1aW50NjRfdCBzZW50X2J5dGVzOworICAgIHVpbnQ2NF90IHJlY2VpdmVkX2J5dGVzOworICAgIGludCBjYXJkX251bWJlcjsKKyAgICBpbnQgb2ZmbG9hZF9udW1iZXI7CisKKyAgICAvLyB0YXJnZXQgdGltZXIgZGF0YQorICAgIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGFyZ2V0OworCisgICAgLy8gbmV4dCBlbGVtZW50CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKm5leHQ7Cit9OworCisjaWYgSE9TVF9MSUJSQVJZCisKK2V4dGVybiBpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQ7CisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzEgMQorI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8yIDIKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMyAzCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUX09OIDEKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfT0ZGIDAKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKSBcCisgICAgKCh0aW1lcl9lbmFibGVkIHx8IChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgPyBcCisgICAgICgoMSArIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlKSAqIHNpemVvZih1aW50NjRfdCkpIDogMCkKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX3N0YXJ0KHRpbWVyX2RhdGEsIHBub2RlKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgcG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCB8fCBcCisgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfc3RvcCh0aW1lcl9kYXRhLCBwbm9kZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpIFwKKyAgICBvZmZsb2FkX3RpbWVyX2luaXQoZmlsZSwgbGluZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKHRpbWVyX2RhdGEsIGRhdGEpIFwKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3NkYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9SREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfTUlDX05VTSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIG9mZmxvYWRfdGltZXJfaW5pdChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3NkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3JkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X21pY19udW0oT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcmRfbnVtYmVyKTsKKworLy8gVXRpbGl0eSBzdHJ1Y3R1cmUgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIHRpbWVyCitzdHJ1Y3QgT2ZmbG9hZFRpbWVyIHsKKyAgICBPZmZsb2FkVGltZXIoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKmRhdGEsIE9mZmxvYWRIb3N0UGhhc2UgcGhhc2UpIDoKKyAgICAgICAgbV9kYXRhKGRhdGEpLAorICAgICAgICBtX3BoYXNlKHBoYXNlKQorICAgIHsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChtX2RhdGEsIG1fcGhhc2UpOworICAgIH0KKworICAgIH5PZmZsb2FkVGltZXIoKQorICAgIHsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKG1fZGF0YSwgbV9waGFzZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiAgIG1fZGF0YTsKKyAgICBPZmZsb2FkSG9zdFBoYXNlICAgICAgICBtX3BoYXNlOworfTsKKworI2Vsc2UKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKSBcCisgICAgKCh0aW1lcl9lbmFibGVkKSA/IFwKKyAgICAgKCgxICsgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UpICogc2l6ZW9mKHVpbnQ2NF90KSkgOiAwKQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQocG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9zdGFydChwbm9kZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfc3RvcChwbm9kZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9JTklUKCkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX2luaXQoKTsKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKGRhdGEpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKGRhdGEpOworCitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRUYXJnZXRQaGFzZSB0X25vZGUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKE9mZmxvYWRUYXJnZXRQaGFzZSB0X25vZGUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKHZvaWQgKmRhdGEpOworCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNlbHNlIC8vIFRJTUlOR19TVVBQT1JUCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oLi4uKSAgICAgICgwKQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKKworI2VuZGlmIC8vIE9GRkxPQURfVElNRVJfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI3ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAKQEAgLTAsMCArMSwzNTkgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisjZWxzZSAvLyBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYgLy8gX19JTlRFTF9DT01QSUxFUgorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorCitpbnQgdGltZXJfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCitpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSAwOworaW50IG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQgPSAxOworCitzdGF0aWMgY29uc3QgaW50IGhvc3RfdGltZXJfcHJlZml4X3NwYWNlc1tdID0geworICAgIC8qY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycyovICAgICAgICAgMCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUqLyAgICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSovICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzKi8gICAgICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKi8gICAgICAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhKi8gICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKi8gICAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciovICAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciovICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSovICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKi8gICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzKi8gICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIqLyAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIqLyA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKi8gICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyovICAgICAgIDIKK307CisKK2NvbnN0IHN0YXRpYyBpbnQgdGFyZ2V0X3RpbWVyX3ByZWZpeF9zcGFjZXNbXSA9IHsKKy8qY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKi8gICAgICAgICAgMCwKKy8qY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKi8gICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCovICAgICAgICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUqLyAgICAgICAgICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cyovICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMqLyAgICAgNiwKKy8qY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKi8gICAgICAgICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyovICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKi8gNgorfTsKKworc3RhdGljIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhX2hlYWQ7CitzdGF0aWMgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGFfdGFpbDsKK3N0YXRpYyBtdXRleF90ICAgICAgICAgICAgICAgdGltZXJfZGF0YV9tdXRleDsKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9ob3N0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKTsKK3N0YXRpYyB2b2lkIG9mZmxvYWRfdGFyZ2V0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKTsKKworZXh0ZXJuIHZvaWQgT2ZmbG9hZF9UaW1lcl9QcmludCh2b2lkKQoreworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBjb25zdCBjaGFyICpzdGFycyA9CisgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7CisKKyAgICBzcyA8PCAiXG5cbiIgPDwgc3RhcnMgPDwgIlxuIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGl0bGUpIDw8ICJcbiI7CisgICAgc3MgPDwgc3RhcnMgPDwgIlxuIjsKKyAgICBkb3VibGUgZnJlcXVlbmN5ID0gY3B1X2ZyZXF1ZW5jeTsKKworICAgIGZvciAoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YV9oZWFkOworICAgICAgICAgcG5vZGUgIT0gMDsgcG5vZGUgPSBwbm9kZS0+bmV4dCkgeworICAgICAgICBzcyA8PCAiICAgICAgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9mcm9tX2ZpbGUpIDw8ICIgIjw8IHBub2RlLT5maWxlOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xpbmUpIDw8ICIgIiA8PCBwbm9kZS0+bGluZTsKKyAgICAgICAgc3MgPDwgIlxuIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2UgOyBpKyspIHsKKyAgICAgICAgICAgIHNzIDw8ICIgICAgICAgICAgIjsKKyAgICAgICAgICAgIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHNzLCBpKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNSk7CisgICAgICAgICAgICBzcyA8PCAoZG91YmxlKXBub2RlLT5waGFzZXNbaV0udG90YWwgLyBmcmVxdWVuY3kgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UgOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB0aW1lID0gMDsKKyAgICAgICAgICAgIGlmIChwbm9kZS0+dGFyZ2V0LmZyZXF1ZW5jeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGltZSA9IChkb3VibGUpIHBub2RlLT50YXJnZXQucGhhc2VzW2ldLnRvdGFsIC8KKyAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5mcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCAiICAgICAgICAgICI7CisgICAgICAgICAgICBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHNzLCBpKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNSk7CisgICAgICAgICAgICBzcyA8PCB0aW1lIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYgPSBzcy5zdHIoKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUpCit7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgaWYgKHBub2RlKSB7CisgICAgICAgIC8vIFtPZmZsb2FkXSBbTWljIDBdIFtGaWxlXSAgICAgICAgICBmaWxlLmMKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9maWxlKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICIgPDwgcG5vZGUtPmZpbGUgPDwgIlxuIjsKKworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbTGluZV0gICAgICAgICAgMTIzNAorICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xpbmUpOworICAgICAgICBzcyA8PCAiXSAgICAgICAgICAgICAgICAgICAgIiA8PCBwbm9kZS0+bGluZSA8PCAiXG4iOworCisgICAgICAgIC8vIFtPZmZsb2FkXSBbTWljIDBdIFtUYWddICAgICAgICAgIFRhZyAxCisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICAiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXG4iOworCisgICAgICAgIGJ1ZiA9IHNzLnN0cigpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KK30KKworZXh0ZXJuIHZvaWQgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSkKK3sKKyAgICBkb3VibGUgZnJlcXVlbmN5ID0gY3B1X2ZyZXF1ZW5jeTsKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUgPSB0aW1lcl9kYXRhOworCisgICAgaWYgKCFwbm9kZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfaG9zdCkgPDwgIl0gIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAgIiAiOworICAgIHNzIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NwdV90aW1lKSA8PCAiXSAgICAgICAgIjsKKyAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpOworICAgIHNzIDw8IChkb3VibGUpIHBub2RlLT5waGFzZXNbMF0udG90YWwgLyBmcmVxdWVuY3k7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZWNvbmRzKSA8PCAiXG4iOworCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsID49IE9GRkxPQURfUkVQT1JUXzIpIHsKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5jYXJkX251bWJlcjsKKyAgICAgICAgc3MgPDwgIl0gWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgIHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEpIDw8ICJdICAgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPnNlbnRfYnl0ZXMgPDwgIiAiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2J5dGVzKSA8PCAiXG4iOworICAgIH0KKworICAgIGRvdWJsZSB0aW1lID0gMDsKKyAgICBpZiAocG5vZGUtPnRhcmdldC5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgICB0aW1lID0gKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5waGFzZXNbMF0udG90YWwgLworICAgICAgICAgICAgKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5mcmVxdWVuY3k7CisgICAgfQorICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICAiICI7CisgICAgc3MgPDwgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX3RpbWUpIDw8ICJdICAgICAgICAiOworICAgIHNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNikgPDwgdGltZTsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlY29uZHMpIDw8ICJcbiI7CisKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPj0gT0ZGTE9BRF9SRVBPUlRfMikgeworICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpOworICAgICAgICBzcyA8PCAiICIgPDwgcG5vZGUtPmNhcmRfbnVtYmVyOworICAgICAgICBzcyA8PCAiXSBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgIiAiOworICAgICAgICBzcyA8PCAgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY190b19jcHVfZGF0YSkgPDwgIl0gICAiOworICAgICAgICBzcyA8PCBwbm9kZS0+cmVjZWl2ZWRfYnl0ZXMgPDwgIiAiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2J5dGVzKSA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworCisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKHRpbWVyX2RhdGEpOworfQorCitleHRlcm4gdm9pZCBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhKQoreworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZV9sYXN0ID0gTlVMTDsKKworICAgIGZvciAoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YV9oZWFkOworICAgICAgICAgcG5vZGUgIT0gMDsgcG5vZGUgPSBwbm9kZS0+bmV4dCkgeworICAgICAgICBpZiAodGltZXJfZGF0YSA9PSBwbm9kZSkgeworICAgICAgICAgICAgaWYgKHBub2RlX2xhc3QpIHsKKyAgICAgICAgICAgICAgICBwbm9kZV9sYXN0LT5uZXh0ID0gcG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX2hlYWQgPSBwbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9GRkxPQURfRlJFRShwbm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwbm9kZV9sYXN0ID0gcG5vZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBudW0pCit7CisgICAgZm9yICg7IG51bSA+IDA7IG51bS0tKSB7CisgICAgICAgIHNzIDw8ICIgIjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSkKK3sKKyAgICBpbnQgcHJlZml4X3NwYWNlczsKKyAgICBpbnQgc3RyX2xlbmd0aDsKKyAgICBpbnQgdGFpbF9sZW5ndGg7CisgICAgY29uc3QgaW50IG1lc3NhZ2VfbGVuZ3RoID0gNDA7CisgICAgY2hhciBjb25zdCAqc3RyOworCisgICAgc3RyID0gcmVwb3J0X2dldF9ob3N0X3N0YWdlX3N0cihwX25vZGUpOworICAgIHByZWZpeF9zcGFjZXMgPSBob3N0X3RpbWVyX3ByZWZpeF9zcGFjZXNbcF9ub2RlXTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgcHJlZml4X3NwYWNlcyk7CisgICAgc3RyX2xlbmd0aCA9IHN0cmxlbihzdHIpOworICAgIHNzIDw8IHN0cjsKKyAgICB0YWlsX2xlbmd0aCA9IG1lc3NhZ2VfbGVuZ3RoIC0gcHJlZml4X3NwYWNlcyAtIHN0cl9sZW5ndGg7CisgICAgdGFpbF9sZW5ndGggPSB0YWlsX2xlbmd0aCA+IDA/IHRhaWxfbGVuZ3RoIDogMTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgdGFpbF9sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSkKK3sKKyAgICBpbnQgcHJlZml4X3NwYWNlczsKKyAgICBpbnQgc3RyX2xlbmd0aDsKKyAgICBjb25zdCBpbnQgbWVzc2FnZV9sZW5ndGggPSA0MDsKKyAgICBpbnQgdGFpbF9sZW5ndGg7CisgICAgY2hhciBjb25zdCAqc3RyOworCisgICAgc3RyID0gcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKHBfbm9kZSk7CisgICAgcHJlZml4X3NwYWNlcyA9IHRhcmdldF90aW1lcl9wcmVmaXhfc3BhY2VzW3Bfbm9kZV07CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHByZWZpeF9zcGFjZXMpOworICAgIHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgICBzcyA8PCBzdHI7CisgICAgdGFpbF9sZW5ndGggPSBtZXNzYWdlX2xlbmd0aCAtIHByZWZpeF9zcGFjZXMgLSBzdHJfbGVuZ3RoOworICAgIHRhaWxfbGVuZ3RoID0gKHRhaWxfbGVuZ3RoID4gMCk/IHRhaWxfbGVuZ3RoIDogMTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgdGFpbF9sZW5ndGgpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RhcnQoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgcF90eXBlKQoreworICAgIHRpbWVyX2RhdGEtPnBoYXNlc1twX3R5cGVdLnN0YXJ0ID0gX3JkdHNjKCk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgcF90eXBlKQoreworICAgIHRpbWVyX2RhdGEtPnBoYXNlc1twX3R5cGVdLnRvdGFsICs9IF9yZHRzYygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS5zdGFydDsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmKQoreworICAgIHVpbnQ2NF90ICpkYXRhID0gKHVpbnQ2NF90KikgYnVmOworCisgICAgdGltZXJfZGF0YS0+dGFyZ2V0LmZyZXF1ZW5jeSA9ICpkYXRhKys7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZTsgaSsrKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnRhcmdldC5waGFzZXNbaV0udG90YWwgPSAqZGF0YSsrOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlbnRfYnl0ZXMpCit7CisgICAgaWYgKHRpbWVyX2RhdGEpIHsKKyAgICAgICAgdGltZXJfZGF0YS0+c2VudF9ieXRlcyArPSBzZW50X2J5dGVzOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJlY2VpdmVkX2J5dGVzKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnJlY2VpdmVkX2J5dGVzICs9IHJlY2VpdmVkX2J5dGVzOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FyZF9udW1iZXIpCit7CisgICAgaWYgKHRpbWVyX2RhdGEpIHsKKyAgICAgICAgdGltZXJfZGF0YS0+Y2FyZF9udW1iZXIgPSBjYXJkX251bWJlcjsKKyAgICB9Cit9CisKK09mZmxvYWRIb3N0VGltZXJEYXRhKiBvZmZsb2FkX3RpbWVyX2luaXQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgICAgc3RhdGljIGJvb2wgZmlyc3RfdGltZSA9IHRydWU7CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGEgPSBOVUxMOworCisgICAgdGltZXJfZGF0YV9tdXRleC5sb2NrKCk7CisgICAgeworICAgICAgICBpZiAodGltZXJfZW5hYmxlZCB8fAorICAgICAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7CisgICAgICAgICAgICB0aW1lcl9kYXRhID0gKE9mZmxvYWRIb3N0VGltZXJEYXRhKikKKyAgICAgICAgICAgICAgICBPRkZMT0FEX01BTExPQyhzaXplb2YoT2ZmbG9hZEhvc3RUaW1lckRhdGEpLCAwKTsKKyAgICAgICAgICAgIG1lbXNldCh0aW1lcl9kYXRhLCAwLCBzaXplb2YoT2ZmbG9hZEhvc3RUaW1lckRhdGEpKTsKKworICAgICAgICAgICAgdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIgPSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSAtIDE7CisKKyAgICAgICAgICAgIGlmICh0aW1lcl9kYXRhX2hlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfaGVhZCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV90YWlsID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbC0+bmV4dCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV90YWlsID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGltZXJfZGF0YS0+ZmlsZSA9IGZpbGU7CisgICAgICAgICAgICB0aW1lcl9kYXRhLT5saW5lID0gbGluZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aW1lcl9kYXRhX211dGV4LnVubG9jaygpOworICAgIHJldHVybiB0aW1lcl9kYXRhOworfQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTRjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPGlhMzJpbnRyaW4uaD4KKyNlbHNlIC8vIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZiAvLyBfX0lOVEVMX0NPTVBJTEVSCisKKworCitpbnQgdGltZXJfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorc3RhdGljIF9fdGhyZWFkIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGltZXJfZGF0YTsKKyNlbHNlIC8vIFdJTk5UCitzdGF0aWMgX19kZWNsc3BlYyh0aHJlYWQpIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGltZXJfZGF0YTsKKyNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisKKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KAorICAgIE9mZmxvYWRUYXJnZXRQaGFzZSBwX3R5cGUKKykKK3sKKyAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnN0YXJ0ID0gX3JkdHNjKCk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKAorICAgIE9mZmxvYWRUYXJnZXRQaGFzZSBwX3R5cGUKKykKK3sKKyAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnRvdGFsICs9IF9yZHRzYygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2RhdGEucGhhc2VzW3BfdHlwZV0uc3RhcnQ7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9pbml0KCkKK3sKKyAgICBtZW1zZXQoJnRpbWVyX2RhdGEsIDAsIHNpemVvZihPZmZsb2FkVGFyZ2V0VGltZXJEYXRhKSk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKAorICAgIHZvaWQgKmJ1ZgorKQoreworICAgIHVpbnQ2NF90ICpkYXRhID0gKHVpbnQ2NF90KikgYnVmOworCisgICAgdGltZXJfZGF0YS5mcmVxdWVuY3kgPSBtaWNfZnJlcXVlbmN5OworICAgIG1lbWNweShkYXRhKyssICYodGltZXJfZGF0YS5mcmVxdWVuY3kpLCBzaXplb2YodWludDY0X3QpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2U7IGkrKykgeworICAgICAgICBtZW1jcHkoZGF0YSsrLCAmKHRpbWVyX2RhdGEucGhhc2VzW2ldLnRvdGFsKSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgfQorfQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA2MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuY3BwCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RyYWNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeDsKKworI2lmICFIT1NUX0xJQlJBUlkKK2V4dGVybiBpbnQgbWljX2luZGV4OworI2VuZGlmCisKKy8vIFRoZSBkZWJ1ZyByb3V0aW5lcworCitzdGF0aWMgY29uc3QgY2hhciAqIG9mZmxvYWRfc3RhZ2Uoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZsb2FkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByaW50X3RhZykKK3sKKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSI7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIl0iOworICAgIGlmIChwcmludF90YWcpIHsKKyAgICAgICAgc3MgPDwgIiAgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3MgPDwgIiAgICAgICAgICI7CisgICAgfQorICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAiIDw8IHRleHQ7CisjZWxzZQorICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICIgIiA8PCBtaWNfaW5kZXggPDwgIl0iOworICAgIGlmIChwcmludF90YWcpIHsKKyAgICAgICAgc3MgPDwgIiBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBvZmZsb2FkX251bWJlciA8PCAiXSI7CisgICAgfQorICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAiIDw8IHRleHQ7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBvZmZsb2FkX3NpZ25hbChzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZmxvYWRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0KQoreworICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIjsKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiXSI7CisgICAgc3MgPDwgIiAgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgIHNzIDw8ICIgIiA8PCBvZmZsb2FkX251bWJlciA8PCAiXSI7CisgICAgc3MgPDwgIiBbIiA8PCB0YWcgPDwgIl0iOworICAgIHNzIDw8ICIgICAgICAgICAgIiA8PCB0ZXh0OworICAgIHJldHVybiAwOworfQorCit2b2lkIG9mZmxvYWRfc3RhZ2VfcHJpbnQoaW50IHN0YWdlLCBpbnQgb2ZmbG9hZF9udW1iZXIsIC4uLikKK3sKKyAgICBzdGQ6OnN0cmluZyBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY2hhciBjb25zdCAqc3RyMTsKKyAgICBjaGFyIGNvbnN0ICpzdHIyOworICAgIHZhX2xpc3QgdmFfYXJnczsKKyAgICB2YV9zdGFydCh2YV9hcmdzLCBvZmZsb2FkX251bWJlcik7CisgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKworICAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc3RhcnQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGFydCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaW5pdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2luaXQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xvZ2ljYWxfY2FyZCk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBzcyA8PCAiID0gIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlZ2lzdGVyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcmVnaXN0ZXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2luaXRfZnVuYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2luaXRfZnVuYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY3JlYXRlX2J1Zl9ob3N0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6IGJhc2U9MHgiIDw8IHN0ZDo6aGV4IDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBzcyA8PCAiIGxlbmd0aD0iIDw8IHN0ZDo6ZGVjIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY3JlYXRlX2J1Zl9taWM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcmVhdGVfYnVmX21pYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiBzaXplPSIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgb2Zmc2V0PSIgPDwgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAodmFfYXJnKHZhX2FyZ3MsaW50KSkKKyAgICAgICAgICAgICAgIHNzIDw8ICIgKDJNIHBhZ2UpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zZW5kX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2dhdGhlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KSA8PCAiICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29tcHV0ZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvbXB1dGUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlY2VpdmVfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6ICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF92YXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF92YXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsICIgICIsIHRydWUpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBzcyA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NjYXR0ZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9nYXRoZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2NhdHRlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29weW91dF9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAqc2lnbmFsOworICAgICAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlX3NpZ25hbCk7CisgICAgICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3NpZ25hbChzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIpOworCSAgICAgICAgc2lnbmFsID0gdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90Kik7CisJICAgICAgICBpZiAoc2lnbmFsKQorICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgMHgiIDw8IHN0ZDo6aGV4IDw8ICpzaWduYWw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgbm9uZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfd2FpdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgICoqc2lnbmFsOworICAgICAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlX3NpZ25hbCk7CisgICAgICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfd2FpdCk7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9zaWduYWwoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAgIHNpZ25hbCA9IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCoqKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcyA8PCAiICIgPDwgc3RkOjpoZXggPDwgc2lnbmFsW2NvdW50LTFdOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgbm9uZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdW5yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3VucmVnaXN0ZXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9kZXN0cm95OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZGVzdHJveSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvaW5pdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2luaXQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3JlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvZmluaToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2ZpbmkpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY19teW9fc2hhcmVkKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfbXlvX2ZwdHIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkZnJlZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2M6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBzaXplX3QpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBzaXplX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRmcmVlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9hY3F1aXJlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvYWNxdWlyZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3JlbGVhc2U6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9yZWxlYXNlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgdmFfZW5kKHZhX2FyZ3MpOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmggYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIHBhcnRzIG9mIHRoZSBvZmZsb2FkIGxpYnJhcnkgY29tbW9uIHRvIGhvc3QgYW5kIHRhcmdldAorCit2b2lkIG9mZmxvYWRfc3RhZ2VfcHJpbnQoaW50IHN0YWdlLCBpbnQgb2ZmbG9hZF9udW1iZXIsIC4uLik7CisKK2VudW0gT2ZmbG9hZFRyYWNlU3RhZ2UgeworICAgIC8vIFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHRhcmdldAorICAgIGNfb2ZmbG9hZF9zdGFydCA9IDAsCisgICAgY19vZmZsb2FkX2luaXQsCisgICAgY19vZmZsb2FkX3JlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9pbml0X2Z1bmMsCisgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdCwKKyAgICBjX29mZmxvYWRfY3JlYXRlX2J1Zl9taWMsCisgICAgY19vZmZsb2FkX3NlbmRfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfZ2F0aGVyX2NvcHlpbl9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfY29tcHV0ZSwKKyAgICBjX29mZmxvYWRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisgICAgY19vZmZsb2FkX3ZhciwKKyAgICBjX29mZmxvYWRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX29mZmxvYWRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX2NvcHlvdXRfZGF0YSwKKyAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgIGNfb2ZmbG9hZF93YWl0LAorICAgIGNfb2ZmbG9hZF91bnJlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9kZXN0cm95LAorICAgIGNfb2ZmbG9hZF9maW5pc2gsCisgICAgY19vZmZsb2FkX215b2luaXQsCisgICAgY19vZmZsb2FkX215b3JlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZCwKKyAgICBjX29mZmxvYWRfbWljX215b19mcHRyLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2MsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGZyZWUsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRmcmVlLAorICAgIGNfb2ZmbG9hZF9teW9hY3F1aXJlLAorICAgIGNfb2ZmbG9hZF9teW9yZWxlYXNlLAorICAgIGNfb2ZmbG9hZF9teW9maW5pCit9OwpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ2MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCit2b2lkICp0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCit7CisgICAgaWYgKGtleSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFRsc0dldFZhbHVlKGtleSk7CisgICAgfQorfQorCitpbnQgdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKFRsc1NldFZhbHVlKGtleSwgKExQVk9JRCl2YWx1ZSkpID8gMCA6IEdldExhc3RFcnJvcigpOworfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitib29sIF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIHVpbnQ2NF90ICZuZXdfc2l6ZSkKK3sKKyAgICB1aW50NjRfdCB2YWw7CisgICAgY2hhciAqc3VmZml4OworCisgICAgZXJybm8gPSAwOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvdWwoc3RyLCAmc3VmZml4LCAxMCk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b3VsbChzdHIsICZzdWZmaXgsIDEwKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICBpZiAoZXJybm8gIT0gMCB8fCBzdWZmaXggPT0gc3RyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3VmZml4WzBdID09ICdcMCcpIHsKKyAgICAgICAgLy8gZGVmYXVsdCBpcyBLaWxvYnl0ZXMKKyAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3VmZml4WzFdID09ICdcMCcpIHsKKyAgICAgICAgLy8gT3B0aW9uYWwgc3VmZml4ZXM6IEIgKGJ5dGVzKSwgSyAoS2lsb2J5dGVzKSwgTSAoTWVnYWJ5dGVzKSwKKyAgICAgICAgLy8gRyAoR2lnYWJ5dGVzKSwgb3IgVCAoVGVyYWJ5dGVzKSBzcGVjaWZ5IHRoZSB1bml0cy4KKyAgICAgICAgc3dpdGNoIChzdWZmaXhbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2snOgorICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0ICogMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQ2NF90ICZ2YWx1ZSkKK3sKKyAgICBpbnQ2NF90IHZhbDsKKyAgICBjaGFyICpzdWZmaXg7CisKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG9sKHN0ciwgJnN1ZmZpeCwgMCk7CisjZWxzZQorICAgIHZhbCA9IHN0cnRvbGwoc3RyLCAmc3VmZml4LCAwKTsKKyNlbmRpZgorICAgIGlmIChlcnJubyA9PSAwICYmIHN1ZmZpeCAhPSBzdHIgJiYgKnN1ZmZpeCA9PSAnXDAnKSB7CisgICAgICAgIHZhbHVlID0gdmFsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZkZWYgVEFSR0VUX1dJTk5UCitleHRlcm4gdm9pZCogRExfb3Blbihjb25zdCBjaGFyICpwYXRoKQoreworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBpbnQgZXJyb3JfbW9kZTsKKworICAgIC8qCisgICAgICogZG8gbm90IGRpc3BsYXkgbWVzc2FnZSBib3ggd2l0aCBlcnJvciBpZiBpdCB0aGUgY2FsbCBiZWxvdyBmYWlscyB0bworICAgICAqIGxvYWQgZHluYW1pYyBsaWJyYXJ5LgorICAgICAqLworICAgIGVycm9yX21vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOworCisgICAgLyogbG9hZCBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICBoYW5kbGUgPSAodm9pZCopIExvYWRMaWJyYXJ5KHBhdGgpOworCisgICAgLyogcmVzdG9yZSBlcnJvciBtb2RlICovCisgICAgU2V0RXJyb3JNb2RlKGVycm9yX21vZGUpOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworZXh0ZXJuIGludCBETF9hZGRyKGNvbnN0IHZvaWQgKmFkZHIsIERsX2luZm8gKmRsX2luZm8pCit7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1lbV9pbmZvOworICAgIGNoYXIgbW9kX25hbWVbTUFYX1BBVEhdOworICAgIEhNT0RVTEUgbW9kX2hhbmRsZTsKKworICAgIC8qIEZpbGwgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIHN0cnVjdCAqLworICAgIGlmICghVmlydHVhbFF1ZXJ5KGFkZHIsICZtZW1faW5mbywgc2l6ZW9mKG1lbV9pbmZvKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1vZF9oYW5kbGUgPSAoSE1PRFVMRSltZW1faW5mby5BbGxvY2F0aW9uQmFzZTsKKworICAgIC8qIEFOU0kgZmlsZSBuYW1lIGZvciBtb2R1bGUgKi8KKyAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lQShtb2RfaGFuZGxlLCAoY2hhciopIG1vZF9uYW1lLCBzaXplb2YobW9kX25hbWUpKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyY3B5KGRsX2luZm8tPmRsaV9mbmFtZSwgbW9kX25hbWUpOworICAgIGRsX2luZm8tPmRsaV9mYmFzZSA9IG1lbV9pbmZvLkJhc2VBZGRyZXNzOworICAgIGRsX2luZm8tPmRsaV9zYWRkciA9IGFkZHI7CisgICAgc3RyY3B5KGRsX2luZm8tPmRsaV9zbmFtZSwgbW9kX25hbWUpOworICAgIHJldHVybiAxOworfQorCisvLyBSdW4gb25jZQorc3RhdGljIEJPT0wgQ0FMTEJBQ0sgX19vZmZsb2FkX3J1bl9vbmNlX3dyYXBwZXIoCisgICAgUElOSVRfT05DRSBpbml0T25jZSwKKyAgICBQVk9JRCBwYXJhbWV0ZXIsCisgICAgUFZPSUQgKmNvbnRleHQKKykKK3sKKyAgICB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSA9ICh2b2lkKCopKHZvaWQpKSBwYXJhbWV0ZXI7CisgICAgaW5pdF9yb3V0aW5lKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgX19vZmZsb2FkX3J1bl9vbmNlKE9mZmxvYWRPbmNlQ29udHJvbCAqY3RybCwgdm9pZCAoKmZ1bmMpKHZvaWQpKQoreworICAgIEluaXRPbmNlRXhlY3V0ZU9uY2UoY3RybCwgX19vZmZsb2FkX3J1bl9vbmNlX3dyYXBwZXIsICh2b2lkKikgZnVuYywgMCk7Cit9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8qIEFSR1NVU0VEICovIC8vIHZlcnNpb24gaXMgbm90IHVzZWQgb24gd2luZG93cwordm9pZCogRExfc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbikKK3sKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICByZXR1cm4gR2V0UHJvY0FkZHJlc3MoKEhNT0RVTEUpIGhhbmRsZSwgbmFtZSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgIHJldHVybiBkbHN5bShoYW5kbGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRsdnN5bShoYW5kbGUsIG5hbWUsIHZlcnNpb24pOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworaW50NjRfdCBnZXRfZWxfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUpCit7CisgICAgaW50NjRfdCB2YWwgPSAwOworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigqKChjaGFyICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoc2hvcnQgKikoYmFzZSArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigqKChpbnQgKikoYmFzZSArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFsID0gKigoaW50NjRfdCAqKShiYXNlICsgb2Zmc2V0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaCBiL3JjMS9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBkNzdkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5oCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9VVElMX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3R5cGVkZWYgdW5zaWduZWQgcHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgaW50IHBpZF90OworCisjZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworI2RlZmluZSBzdHJ0b2tfcihzLGQscCkgc3RydG9rX3MocyxkLHApCisjZGVmaW5lIHN0cmNhc2VjbXAoYSxiKSBzdHJpY21wKGEsYikKKworI2RlZmluZSB0aHJlYWRfa2V5X2NyZWF0ZShrZXksIGRlc3RydWN0b3IpIFwKKyAgICAoKCgqa2V5ID0gVGxzQWxsb2MoKSkgPiAwKSA/IDAgOiBHZXRMYXN0RXJyb3IoKSkKKyNkZWZpbmUgdGhyZWFkX2tleV9kZWxldGUoa2V5KSBUbHNGcmVlKGtleSkKKworI2lmbmRlZiBTX0lTUkVHCisjZGVmaW5lIFNfSVNSRUcobW9kZSkgICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2VuZGlmCisKK3ZvaWQqICAgdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KTsKK2ludCAgICAgdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICp2YWx1ZSk7CisjZWxzZQorI2RlZmluZSB0aHJlYWRfa2V5X2NyZWF0ZShrZXksIGRlc3RydWN0b3IpIFwKKyAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgoa2V5KSwgKGRlc3RydWN0b3IpKQorI2RlZmluZSB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpICBwdGhyZWFkX2tleV9kZWxldGUoa2V5KQorI2RlZmluZSB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSBwdGhyZWFkX2dldHNwZWNpZmljKGtleSkKKyNkZWZpbmUgdGhyZWFkX3NldHNwZWNpZmljKGtleSwgdmFsdWUpIHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCB2YWx1ZSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gTXV0ZXggaW1wbGVtZW50YXRpb24KK3N0cnVjdCBtdXRleF90IHsKKyAgICBtdXRleF90KCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9sb2NrLCAwKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB+bXV0ZXhfdCgpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbV9sb2NrKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB2b2lkIGxvY2soKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB2b2lkIHVubG9jaygpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJm1fbG9jayk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCitwcml2YXRlOgorI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIENSSVRJQ0FMX1NFQ1RJT04gICAgbV9sb2NrOworI2Vsc2UKKyAgICBwdGhyZWFkX211dGV4X3QgICAgIG1fbG9jazsKKyNlbmRpZgorfTsKKworc3RydWN0IG11dGV4X2xvY2tlcl90IHsKKyAgICBtdXRleF9sb2NrZXJfdChtdXRleF90ICZtdXRleCkgOiBtX211dGV4KG11dGV4KSB7CisgICAgICAgIG1fbXV0ZXgubG9jaygpOworICAgIH0KKworICAgIH5tdXRleF9sb2NrZXJfdCgpIHsKKyAgICAgICAgbV9tdXRleC51bmxvY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgbXV0ZXhfdCAmbV9tdXRleDsKK307CisKKy8vIER5bmFtaWMgbG9hZGVyIGludGVyZmFjZQorI2lmZGVmIFRBUkdFVF9XSU5OVAorc3RydWN0IERsX2luZm8KK3sKKyAgICBjaGFyICAgICAgICBkbGlfZm5hbWVbTUFYX1BBVEhdOworICAgIHZvaWQgICAgICAgKmRsaV9mYmFzZTsKKyAgICBjaGFyICAgICAgICBkbGlfc25hbWVbTUFYX1BBVEhdOworICAgIGNvbnN0IHZvaWQgKmRsaV9zYWRkcjsKK307CisKK3ZvaWQqICAgRExfb3Blbihjb25zdCBjaGFyICpwYXRoKTsKKyNkZWZpbmUgRExfY2xvc2UoaGFuZGxlKSAgICAgICAgRnJlZUxpYnJhcnkoKEhNT0RVTEUpIChoYW5kbGUpKQoraW50ICAgICBETF9hZGRyKGNvbnN0IHZvaWQgKmFkZHIsIERsX2luZm8gKmluZm8pOworI2Vsc2UKKyNkZWZpbmUgRExfb3BlbihwYXRoKSAgICAgICAgICAgZGxvcGVuKChwYXRoKSwgUlRMRF9OT1cpCisjZGVmaW5lIERMX2Nsb3NlKGhhbmRsZSkgICAgICAgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBETF9hZGRyKGFkZHIsIGluZm8pICAgICBkbGFkZHIoKGFkZHIpLCAoaW5mbykpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK2V4dGVybiB2b2lkKiBETF9zeW0odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKTsKKworLy8gT25lLXRpbWUgaW5pdGlhbGl6YXRpb24gQVBJCisjaWZkZWYgVEFSR0VUX1dJTk5UCit0eXBlZGVmIElOSVRfT05DRSAgICAgICAgICAgICAgICAgICBPZmZsb2FkT25jZUNvbnRyb2w7CisjZGVmaW5lIE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQgICBJTklUX09OQ0VfU1RBVElDX0lOSVQKKworZXh0ZXJuIHZvaWQgX19vZmZsb2FkX3J1bl9vbmNlKE9mZmxvYWRPbmNlQ29udHJvbCAqY3RybCwgdm9pZCAoKmZ1bmMpKHZvaWQpKTsKKyNlbHNlCit0eXBlZGVmIHB0aHJlYWRfb25jZV90ICAgICAgICAgICAgICBPZmZsb2FkT25jZUNvbnRyb2w7CisjZGVmaW5lIE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQgICBQVEhSRUFEX09OQ0VfSU5JVAorCisjZGVmaW5lIF9fb2ZmbG9hZF9ydW5fb25jZShjdHJsLCBmdW5jKSBwdGhyZWFkX29uY2UoY3RybCwgZnVuYykKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gUGFyc2VzIHNpemUgc3BlY2lmaWNhdGlvbiBzdHJpbmcuCitleHRlcm4gYm9vbCBfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAmbmV3X3NpemUpOworCisvLyBQYXJzZXMgc3RyaW5nIHdpdGggaW50ZWdlciB2YWx1ZQorZXh0ZXJuIGJvb2wgX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQ2NF90ICZ2YWx1ZSk7CisKKy8vIGdldCB2YWx1ZSBieSBpdHMgYmFzZSwgb2Zmc2V0IGFuZCBzaXplCitpbnQ2NF90IGdldF9lbF92YWx1ZSgKKyAgICBjaGFyICAgKmJhc2UsCisgICAgaW50NjRfdCBvZmZzZXQsCisgICAgaW50NjRfdCBzaXplCispOworI2VuZGlmIC8vIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcCBiL3JjMS9vZmZsb2FkL3NyYy9vZmxkYmVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NWY5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgSE9TVF9MSUJSQVJZCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19kZWNsc3BlYyhhbGxvY2F0ZShuYW1lKSkKKyNkZWZpbmUgRExMX0xPQ0FMCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbihuYW1lKSkpCisjZGVmaW5lIERMTF9MT0NBTCAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWYgSE9TVF9MSUJSQVJZCisvLyB0aGUgaG9zdCBwcm9ncmFtL3NoYXJlZCBsaWJyYXJ5IHNob3VsZCBhbHdheXMgaGF2ZSBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlCisvLyBzeW1ib2wgZGVmaW5lZC4gVGhpcyBzeW1ib2wgc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldCBwcm9ncmFtCisvLyBpbWFnZS4KK2V4dGVybiAiQyIgRExMX0xPQ0FMIGNvbnN0IHZvaWQqIF9fb2ZmbG9hZF90YXJnZXRfaW1hZ2U7CisjZWxzZSAvLyBIT1NUX0xJQlJBUlkKKy8vIERlZmluZSBhIHdlYWsgbWFpbiB3aGljaCB3b3VsZCBiZSB1c2VkIG9uIHRhcmdldCBzaWRlIGluIGNhc2UgdXNlcmUncworLy8gc291cmNlIGZpbGUgY29udGFpbmluZyBtYWluIGRvZXMgbm90IGhhdmUgb2ZmbG9hZCBjb2RlLgorI3ByYWdtYSB3ZWFrIG1haW4KK2ludCBtYWluKHZvaWQpCit7CisgICAgT0ZGTE9BRF9UQVJHRVRfTUFJTigpOworICAgIHJldHVybiAwOworfQorCisjcHJhZ21hIHdlYWsgTUFJTl9fCitleHRlcm4gIkMiIGludCBNQUlOX18odm9pZCkKK3sKKyAgICBPRkZMT0FEX1RBUkdFVF9NQUlOKCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKy8vIG9mZmxvYWQgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9lbnRyeV90YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIEZ1bmNMaXN0OjpOb2RlIF9fb2ZmbG9hZF9lbnRyeV9ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF9lbnRyeV90YWJsZV9zdGFydCArIDEsIC0xIH0sCisgICAgMCwgMAorfTsKKworLy8gb2ZmbG9hZCBmcCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZnVuY190YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIEZ1bmNMaXN0OjpOb2RlIF9fb2ZmbG9hZF9mdW5jX25vZGUgPSB7CisgICAgeyAmX19vZmZsb2FkX2Z1bmNfdGFibGVfc3RhcnQgKyAxLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIG9mZmxvYWQgZnAgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihWYXJUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBWYXJUYWJsZTo6RW50cnkgX19vZmZsb2FkX3Zhcl90YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIFZhckxpc3Q6Ok5vZGUgX19vZmZsb2FkX3Zhcl9ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF92YXJfdGFibGVfc3RhcnQgKyAxIH0sCisgICAgMCwgMAorfTsKKworI2lmZGVmIE1ZT19TVVBQT1JUCisKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoU2hhcmVkVGFibGVFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworI2lmIEhPU1RfTElCUkFSWQorLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBpbml0IHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoSW5pdFRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBJbml0VGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3N0YXJ0ID0geyAwIH07CisjZW5kaWYKKworLy8gb2ZmbG9hZCBteW8gZnB0ciBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnB0clRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGcHRyVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKy8vIGluaXQvZmluaSBjb2RlIHdoaWNoIGFkZHMvcmVtb3ZlcyBsb2NhbCBsb29rdXAgZGF0YSB0by9mcm9tIHRoZSBnbG9iYWwgbGlzdAorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2ZpbmkoKTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKDEwMSkpKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIHZvaWQgb2ZmbG9hZF9pbml0KCk7CisKKy8vIFBsYWNlIG9mZmxvYWQgaW5pdGlhbGl6YXRpb24gYmVmb3JlIHVzZXIgY29uc3RydWN0b3JzCitBTExPQ0FURShPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCkKK3N0YXRpYyB2b2lkICgqYWRkcmVzc29mX29mZmxvYWRfaW5pdCkoKSA9IG9mZmxvYWRfaW5pdDsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9pbml0KCkKK3sKKyAgICAvLyByZWdpc3RlciBvZmZsb2FkIHRhYmxlcworICAgIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoJl9fb2ZmbG9hZF9lbnRyeV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF9mdW5jX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX3Zhcl9ub2RlKTsKKworI2lmIEhPU1RfTElCUkFSWQorICAgIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZSgmX19vZmZsb2FkX3RhcmdldF9pbWFnZSk7CisgICAgYXRleGl0KG9mZmxvYWRfZmluaSk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfc3RhcnQgKyAxLAorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAmX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfc3RhcnQgKyAxLAorICAgICAgICAmX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3N0YXJ0ICsgMQorICAgICk7CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF9maW5pKCkKK3sKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZSgmX19vZmZsb2FkX3RhcmdldF9pbWFnZSk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyAgICAvLyB1bnJlZ2lzdGVyIG9mZmxvYWQgdGFibGVzCisgICAgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKCZfX29mZmxvYWRfZW50cnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF9mdW5jX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfdmFyX25vZGUpOworfQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwIGIvcmMxL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWZlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb2ZsZGVuZC5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgSE9TVF9MSUJSQVJZCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19kZWNsc3BlYyhhbGxvY2F0ZShuYW1lKSkKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBBTExPQ0FURShuYW1lKSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKG5hbWUpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gb2ZmbG9hZCBlbnRyeSB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9lbnRyeV90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisvLyBvZmZsb2FkIGZ1bmN0aW9uIHRhYmxlCitBTExPQ0FURShPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZnVuY190YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisvLyBkYXRhIHRhYmxlCitBTExPQ0FURShPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFZhclRhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFZhclRhYmxlOjpFbnRyeSBfX29mZmxvYWRfdmFyX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xIH07CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIHNlY3Rpb24gZXBpbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihTaGFyZWRUYWJsZUVudHJ5KSkpCitzdGF0aWMgU2hhcmVkVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgU2hhcmVkVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9lbmQgPSB7IDAgfTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmIEhPU1RfTElCUkFSWQorLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBpbml0IHNlY3Rpb24gZXBpbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEluaXRUYWJsZUVudHJ5KSkpCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9lbmQgPSB7IDAgfTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworLy8gb2ZmbG9hZCBteW8gZnB0ciBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZwdHJUYWJsZUVudHJ5KSkpCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xLCAwLCAwIH07CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGcHRyVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVApkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIGIvcmMxL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmEzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfT1JTTF9MSVRFX0hfCisjZGVmaW5lIF9PUlNMX0xJVEVfSF8KKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2Vsc2UKKyNkZWZpbmUgY3B1X3NldF90IGludAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFR5cGUgb2YgYSBPUlNMQnVzeVNldCAqLwordHlwZWRlZiBlbnVtIE9SU0xCdXN5U2V0VHlwZSB7CisgICAgQlVTWV9TRVRfRU1QVFkgPSAwLCAgICAgLyoqPCBFbXB0eSBzZXQgKi8KKyAgICBCVVNZX1NFVF9QQVJUSUFMID0gMSwgICAvKio8IE5vbi1lbXB0eSBzZXQgdGhhdCBvbWl0cyBzb21lIHRocmVhZHMgKi8KKyAgICBCVVNZX1NFVF9GVUxMID0gMiAgICAgICAvKio8IEEgc2V0IHRoYXQgaW5jbHVkZXMgYWxsIHRocmVhZHMgb24gdGhlIGNhcmQgKi8KK30gQnVzeVNldFR5cGU7CisKKy8qKiBPUlNMQnVzeVNldCBlbmNhcHN1bGF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBPUlNMQnVzeVNldCB7CisgICAgQnVzeVNldFR5cGUgdHlwZTsgICAvKio8IFNldCB0eXBlICovCisjaWZkZWYgX19saW51eF9fCisgICAgY3B1X3NldF90IGNwdV9zZXQ7ICAvKio8IENQVSBtYXNrICh1bnVzZWQgZm9yIEJVU1lfU0VUX0VNUFRZIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTWV9TRVRfUEFSVElBTCBzZXRzKSByZXByZXNlbnRlZCBieSB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbnV4IENQVSBzZXQgdHlwZSAtLSBjcHVfc2V0X3QuIFRocmVhZHMgYXJlIG51bWJlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBmcm9tIDAuIFRoZSBtYXhpbWFsIHBvc3NpYmxlIHRocmVhZCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN5c3RlbS1zcGVjaWZpYy4gU2VlIENQVV9TRVQoMykgZmFtaWx5IG9mIG1hY3JvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gVW51c2VkIGluIE9SU0wgTGl0ZS4gKi8KKyNlbmRpZgorfSBPUlNMQnVzeVNldDsKKworLyoqIENsaWVudCB0YWcgKi8KK3R5cGVkZWYgY2hhciogT1JTTFRhZzsKKworLyoqIE1heGltYWwgbGVuZ3RoIG9mIHRhZyBpbiBjaGFyYWN0ZXJzICovCisjZGVmaW5lIE9SU0xfTUFYX1RBR19MRU4gMTI4CisKKy8qKiBNYXhpbWFsIG51bWJlciBvZiBjYXJkcyB0aGF0IGNhbiBiZSBtYW5hZ2VkIGJ5IE9SU0wgKi8KKyNkZWZpbmUgT1JTTF9NQVhfQ0FSRFMgMzIKKworLyoqIFJlc2VydmVzIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLiBCbG9ja3MuCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwKKyAqIHRoZXkgYmVjb21lIGF2YWlsYWJsZS4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlCisgKiBzYW1lIHRhZy4gQSByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlcgorICogb2YgdGltZXMgaXQgd2FzIHJlc2VydmVkLgorICoKKyAqIEBzZWUgT1JTTFRyeVJlc2VydmUKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4ZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgMCAgICAgIGlmIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkgcmVzZXJ2ZWQKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZXNlcnZlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworLyoqIFJlc2VydmVzIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLiBEb2VzIG5vdCBibG9jay4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBjYW5ub3QgYmUgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAqIGltbWVkaWF0ZWx5LiBSZXNlcnZhdGlvbiBjYW4gYmUgcmVjdXJzaXZlIGlmIHBlcmZvcm1lZCBieSB0aGUgc2FtZSB0YWcuCisgKiBBIHJlY3Vyc2l2ZWx5IHJlc2VydmVkIHJlc291cmNlIG11c3QgYmUgcmVsZWFzZWQgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzCisgKiBpdCB3YXMgcmVzZXJ2ZWQuCisgKgorICogQHNlZSBPUlNMUmVzZXJ2ZQorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbm91dF0gYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gICAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgICBFQlVTWSAgaWYgc29tZSBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlcyBhcmUgYnVzeQorICoKKyAqIEByZXR1cm5zICAgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIChub3QgaW4gT1JTTCBMaXRlKQorICoKKyAqIEByZXR1cm5zICAgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xUcnlSZXNlcnZlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworLyoqIEdyYW51bGFyaWZ5IG9mIHBhcnRpYWwgcmVzZXJ2YXRpb24gKi8KK3R5cGVkZWYgZW51bSBPUlNMUGFydGlhbEdyYW51bGFyaXR5IHsKKyAgICBHUkFOX0NBUkQgPSAwLCAvKio8IENhcmQgZ3JhbnVsYXJpdHkgKi8KKyAgICBHUkFOX1RIUkVBRCA9IDEgLyoqPCBUaHJlYWQgZ3JhbnVsYXJpdHkgKi8KK30gT1JTTFBhcnRpYWxHcmFudWxhcml0eTsKKworLyoqIFJlcXVlc3RzIHJlc2VydmF0aW9uIG9mIHNvbWUgb2YgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgb24gYSBzZXQgb2YgY2FyZHMuCisgKiBEb2VzIG5vdCBibG9jay4gVXBkYXRlcyB1c2VyLXByb3ZpZGVkIGJzZXRzIHRvIGluZGljYXRlIHdoaWNoIHJlc291cmNlcworICogd2VyZSByZXNlcnZlZC4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBjYW5ub3QgYmUgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgYnVzeQorICogc2V0cyBwcm92aWRlZCBieSB0aGUgY2FsbGVyIHRvIHJlZmxlY3Qgd2hhdCByZXNvdXJjZXMgd2VyZSBhY3R1YWxseQorICogcmVzZXJ2ZWQuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdHdvIGdyYW51bGFyaXR5IG1vZGVzOiAnY2FyZCcgYW5kCisgKiAndGhyZWFkJy4gIFdoZW4gZ3JhbnVsYXJpdHkgaXMgc2V0IHRvICdjYXJkJywgYSBmYWlsdXJlIHRvIHJlc2VydmUgYSB0aHJlYWQKKyAqIG9uIHRoZSBjYXJkIHdpbGwgaW1wbHkgdGhhdCByZXNlcnZhdGlvbiBoYXMgZmFpbGVkIGZvciB0aGUgd2hvbGUgY2FyZC4gV2hlbgorICogZ3JhbnVsYXJpdHkgaXMgc2V0IHRvICd0aHJlYWQnLCByZXNlcnZhdGlvbiBvbiBhIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkCisgKiBzdWNjZXNzZnVsIGFzIGxvbmcgYXMgYXQgbGVhc3Qgb25lIHRocmVhZCBvbiB0aGUgY2FyZCB3YXMgc3VjY2Vzc2Z1bGx5CisgKiByZXNlcnZlZC4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlIHNhbWUgdGFnLiBBCisgKiByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcyBpdAorICogd2FzIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbVtpbl0gIGdyYW4gICBSZXNlcnZhdGlvbiBncmFudWxhcml0eQorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIE5VTEwgaWYgbiA+IDAuIFZhbGlkIGNhcmQgaW5kaWNlcyBhcmUgZnJvbSAwCisgKiAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbl0gIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgaWYgbiA+IDAuCisgKgorICogQHBhcmFtW2luXSAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgMCAgICAgIGlmIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgRUJVU1kgIGlmIGFsbCBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlcyBhcmUgYnVzeQorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRUFHQUlOIGxpbWl0IG9mIHJlY3Vyc2l2ZSByZXNlcnZhdGlvbnMgcmVhY2hlZAorICogICAgICAgICAgICAgICAgICAgIChub3QgaW4gT1JTTCBMaXRlKQorICoKKyAqIEByZXR1cm5zICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gQlVTWV9TRVRfUEFSVElBTAorICovCitpbnQgT1JTTFJlc2VydmVQYXJ0aWFsKGNvbnN0IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgZ3JhbiwgY29uc3QgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBSZWxlYXNlcyBwcmV2aW91c2x5IHJlc2VydmVkIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIGlmIGFueSBvZiB0aGUgcmVzb3VyY2VzIHRvIGJlIHJlbGVhc2VkIHdlcmUgbm90CisgKiByZXNlcnZlZCBieSB0aGUgY2FsbGluZyBjbGllbnQuCisgKgorICogQHNlZSBPUlNMUmVzZXJ2ZQorICogQHNlZSBPUlNMVHJ5UmVzZXJ2ZQorICogQHNlZSBPUlNMUmVzZXJ2ZVBhcnRpYWwKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFUEVSTSAgdGhlIGNhbGxpbmcgY2xpZW50IGRpZCBub3QgcmVzZXJ2ZSBzb21lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBpdCBpcyB0cnlpbmcgdG8gcmVsZWFzZS4KKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZWxlYXNlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzEvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBiL3JjMS9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvbGliL29yc2wtbGl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMWNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYwpAQCAtMCwwICsxLDMzNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIm9yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIgorCisjZGVmaW5lIERJU0FCTEVfU1lNQk9MX1ZFUlNJT05JTkcKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChESVNBQkxFX1NZTUJPTF9WRVJTSU9OSU5HKQorI2RlZmluZSBzeW12ZXIoc3JjLCB0Z3QsIHZlcnN0cikgX19hc21fXygiLnN5bXZlciAiICNzcmMgIiwiICN0Z3QgdmVyc3RyKQorc3ltdmVyKE9SU0xSZXNlcnZlMCwgT1JTTFJlc2VydmUsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFRyeVJlc2VydmUwLCBPUlNMVHJ5UmVzZXJ2ZSwgIkBAT1JTTF8wLjAiKTsKK3N5bXZlcihPUlNMUmVzZXJ2ZVBhcnRpYWwwLCBPUlNMUmVzZXJ2ZVBhcnRpYWwsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFJlbGVhc2UwLCBPUlNMUmVsZWFzZSwgIkBAT1JTTF8wLjAiKTsKKyNlbHNlCisjZGVmaW5lIE9SU0xSZXNlcnZlMCBPUlNMUmVzZXJ2ZQorI2RlZmluZSBPUlNMVHJ5UmVzZXJ2ZTAgT1JTTFRyeVJlc2VydmUKKyNkZWZpbmUgT1JTTFJlc2VydmVQYXJ0aWFsMCBPUlNMUmVzZXJ2ZVBhcnRpYWwKKyNkZWZpbmUgT1JTTFJlbGVhc2UwIE9SU0xSZWxlYXNlCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ2xvYmFsX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBwdGhyZWFkX2NvbmRfdCByZWxlYXNlX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNwcmFnbWEgaW50cmluc2ljKF9SZWFkV3JpdGVCYXJyaWVyKQorc3RhdGljIFNSV0xPQ0sgZ2xvYmFsX211dGV4ID0gU1JXTE9DS19JTklUOworc3RhdGljIHZvbGF0aWxlIGludCByZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQgPSAwOworc3RhdGljIENPTkRJVElPTl9WQVJJQUJMRSByZWxlYXNlX2NvbmQ7CisKK3N0YXRpYyB2b2lkIHN0YXRlX2xhenlfaW5pdF9zeW5jKCkKK3sKKyAgICBpZiAoIXJlbGVhc2VfY29uZF9pbml0aWFsaXplZCkgeworICAgICAgICBBY3F1aXJlU1JXTG9ja0V4Y2x1c2l2ZSgmZ2xvYmFsX211dGV4KTsKKyAgICAgICAgX1JlYWRXcml0ZUJhcnJpZXIoKTsKKyAgICAgICAgaWYgKCFyZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZSgmcmVsZWFzZV9jb25kKTsKKyAgICAgICAgICAgIHJlbGVhc2VfY29uZF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3RhdGVfbG9jaygpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ2xvYmFsX211dGV4KTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdGF0ZV91bmxvY2soKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX211dGV4X3VubG9jaygmZ2xvYmFsX211dGV4KTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdGF0ZV93YWl0X2Zvcl9yZWxlYXNlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3dhaXQoJnJlbGVhc2VfY29uZCwgJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIHJldHVybiBTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKCZyZWxlYXNlX2NvbmQsCisgICAgICAgICAgICAmZ2xvYmFsX211dGV4LCBJTkZJTklURSwgMCkgPT0gMCA/IDEgOiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfc2lnbmFsX3JlbGVhc2UoKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX2NvbmRfc2lnbmFsKCZyZWxlYXNlX2NvbmQpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICBXYWtlQ29uZGl0aW9uVmFyaWFibGUoJnJlbGVhc2VfY29uZCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciBvd25lcltPUlNMX01BWF9UQUdfTEVOICsgMV07CisgICAgdW5zaWduZWQgbG9uZyByc3J2X2NudDsKK30gcnNydl9kYXRhW09SU0xfTUFYX0NBUkRTXTsKKworc3RhdGljIGludCBjaGVja19hcmdzKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpOworICAgIGludCBjYXJkX3NwZWNpZmllZFtPUlNMX01BWF9DQVJEU107CisgICAgaWYgKHRhZyA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgaWYgKHN0cmxlbigoY2hhciAqKXRhZykgPiBPUlNMX01BWF9UQUdfTEVOKSByZXR1cm4gLTE7CisgICAgaWYgKG4gPCAwIHx8IG4gPj0gT1JTTF9NQVhfQ0FSRFMpIHJldHVybiAtMTsKKyAgICBpZiAobiAhPSAwICYmIChpbmRzID09IE5VTEwgfHwgYnNldHMgPT0gTlVMTCkpIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgT1JTTF9NQVhfQ0FSRFM7IGkrKykKKyAgICAgICAgY2FyZF9zcGVjaWZpZWRbaV0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGluZCA9IGluZHNbaV07CisgICAgICAgIGlmIChpbmQgPCAwIHx8IGluZCA+PSBPUlNMX01BWF9DQVJEUykgcmV0dXJuIC0xOworICAgICAgICBpZiAoY2FyZF9zcGVjaWZpZWRbaW5kXSkgcmV0dXJuIC0xOworICAgICAgICBjYXJkX3NwZWNpZmllZFtpbmRdID0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnNldHMoY29uc3QgaW50IG4sIGNvbnN0IE9SU0xCdXN5U2V0ICpic2V0cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoYnNldHNbaV0udHlwZSA9PSBCVVNZX1NFVF9QQVJUSUFMKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FuX3Jlc2VydmVfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIHJldHVybiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSB8fAorICAgICAgICAgICAgKChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPT0gMCB8fAorICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApICYmCisgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPCBVTE9OR19NQVgpKSA/IDAgOiAtIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2VydmVfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIGlmIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZKQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDAgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKTsKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250IDwgVUxPTkdfTUFYKTsKKworICAgIGlmIChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPT0gMCkKKyAgICAgICAgc3RybmNweShyc3J2X2RhdGFbY2FyZF0ub3duZXIsIChjaGFyICopdGFnLCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICByc3J2X2RhdGFbY2FyZF0ub3duZXJbT1JTTF9NQVhfVEFHX0xFTl0gPSAnXDAnOworICAgIHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCsrOworfQorCitzdGF0aWMgaW50IGNhbl9yZWxlYXNlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICByZXR1cm4gKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkgfHwgKHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA+IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApKSA/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICBpZiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKTsKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID4gMCk7CisKKyAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQtLTsKK30KKworaW50IE9SU0xSZXNlcnZlMChjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaSwgb2s7CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIExvb3AgdW50aWwgd2UgZmluZCB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgYXJlIGF2YWlsYWJsZSAqLworICAgIGRvIHsKKyAgICAgICAgb2sgPSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApIHsKKyAgICAgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICAgICAgLyogV2FpdCBmb3Igc29tZW9uZSB0byByZWxlYXNlIHNvbWUgcmVzb3VyY2VzICovCisgICAgICAgICAgICAgICAgc3RhdGVfd2FpdF9mb3JfcmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0gd2hpbGUgKCFvayk7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmVfY2FyZCB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBPUlNMVHJ5UmVzZXJ2ZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIHJjID0gRUJVU1k7CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHJlc291cmNlIGF2YWlsYWJpbGl0eSBvbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICByYyA9IDA7CisKK2JhaWxfb3V0OgorICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiByYzsKK30KKworaW50IE9SU0xSZXNlcnZlUGFydGlhbDAoY29uc3QgT1JTTFBhcnRpYWxHcmFudWxhcml0eSBncmFuLCBjb25zdCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsIE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCByYyA9IEVCVVNZOworICAgIGludCBpLCBudW1fYXZhaWwgPSBuOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGdyYW4gIT0gR1JBTl9DQVJEICYmIGdyYW4gIT0gR1JBTl9USFJFQUQpIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGdyYW4gIT0gR1JBTl9DQVJEKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19hcmdzKG4sIGluZHMsIGJzZXRzLCB0YWcpICE9IDApIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2JzZXRzKG4sIGJzZXRzKSAhPSAwKSByZXR1cm4gRU5PU1lTOworCisgICAgc3RhdGVfbG9jaygpOworCisgICAgLyogQ2hlY2sgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IG9uY2U7IHJlbW92ZSB1bmF2YWlsYWJsZSByZXNvdXJjZXMgZnJvbSB0aGUKKyAgICAgKiB1c2VyLXByb3ZpZGVkIGxpc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoY2FuX3Jlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkgeworICAgICAgICAgICAgbnVtX2F2YWlsLS07CisgICAgICAgICAgICBic2V0c1tpXS50eXBlID0gQlVTWV9TRVRfRU1QVFk7CisgICAgICAgIH0KKworICAgIGlmIChudW1fYXZhaWwgPT0gMCkKKyAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBPUlNMUmVsZWFzZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIHJjID0gRVBFUk07CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgY2FuIHJlbGVhc2UgYWxsIHRoZSByZXNvdXJjZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoY2FuX3JlbGVhc2VfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVsZWFzZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHN0YXRlX3NpZ25hbF9yZWxlYXNlKCk7CisKKyAgICByYyA9IDA7CisKK2JhaWxfb3V0OgorICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiByYzsKK30KKworLyogdmltOnNldCBldDogKi8KZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQgYi9yYzEvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNWY1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0CkBAIC0wLDAgKzEgQEAKK09SU0wtbGl0ZSAwLjcKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy9yZHRzYy5oIGIvcmMxL29mZmxvYWQvc3JjL3JkdHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy9yZHRzYy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDY0X3QgX3JkdHNjKCkKK3sKKyAgdWludDMyX3QgZWF4LCBlZHg7CisgIGFzbSB2b2xhdGlsZSAoInJkdHNjIiA6ICI9YSIgKGVheCksICI9ZCIgKGVkeCkpOworICByZXR1cm4gKCh1aW50NjRfdCllZHggPDwgMzIpIHwgZWF4OworfQpkaWZmIC0tZ2l0IGEvcmMxL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQgYi9yYzEvb2ZmbG9hZC9zcmMvdXNlX21wc3MyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmNDgzCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQKQEAgLTAsMCArMSBAQAorMi4xLjY3MjAtMTMKZGlmZiAtLWdpdCBhL3JjMS9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0IGIvcmMxL29mZmxvYWQvc3JjL3VzZV9tcHNzX3dpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZjQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9DTWFrZUxpc3RzLnR4dCBiL3JjMS9ydW50aW1lL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOGU1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDggQEAKK3Byb2plY3Qob3Blbm1wKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKworc2V0KFZFUlNJT04gNSkKK3NldChPTVBfVkVSU0lPTiAiMjAxMTA3IikKK3NldChPTVBfVkVSU0lPTl9OVU0gIjQwIikKKworYWRkX3N1YmRpcmVjdG9yeShzcmMpCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9NYWtlZmlsZSBiL3JjMS9ydW50aW1lL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK29tcF9yb290Pz0uCitpbmNsdWRlICQob21wX3Jvb3QpL3Rvb2xzL2NvbW1vbi5pbmMKKy5QSE9OWTogZGVmYXVsdCBhbGwgb21wCisKK2RlZmF1bHQ6IG9tcAorCithbGw6IG9tcCBzdHVicworCitvbXA6IGluZm8gbWtkaXIKKwlAZWNobyAkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIGxpYiBpbmMgY29tbW9uCisJJChvbXBfcm9vdCkvdG9vbHMvYnVpbGQucGwgJChidWlsZF9hcmdzKSAtLWFyY2g9JChhcmNoKSAtLW1vZGU9JChtb2RlKSBsaWIgaW5jIGNvbW1vbgorCitzdHViczogbWtkaXIKKwlAZWNobyAkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIC0tc3R1YnMgbGliIGluYyBjb21tb24gCisJJChvbXBfcm9vdCkvdG9vbHMvYnVpbGQucGwgJChidWlsZF9hcmdzKSAtLWFyY2g9JChhcmNoKSAtLW1vZGU9JChtb2RlKSAtLXN0dWJzIGxpYiBpbmMgY29tbW9uCisKKy5QSE9OWTogY2xlYW4gaW5mbworCitjbGVhbjoKKwkkKHNoZWxsICQoUk0pIC1yZiAkKG9tcF9yb290KSQoU0xBU0gpdG1wKQorCUBlY2hvIGNsZWFuIGRvbmUKKworbWtkaXI6CisJJChzaGVsbCAkKE1EKSAkKG9tcF9yb290KSQoU0xBU0gpdG1wID4kKE5VTCkgMj4kKE5VTCkpCisJQGVjaG8gQ3JlYXRlZCAkKG9tcF9yb290KSQoU0xBU0gpdG1wIGRpcmVjdG9yeQorCitpbmZvOgorCUBlY2hvIG9tcF9yb290PSQob21wX3Jvb3QpCisJQGVjaG8gb21wX29zPSQob21wX29zKQorCUBlY2hvIGFyY2g9JChhcmNoKQorCUBlY2hvIGNvbXBpbGVyPSQoY29tcGlsZXIpCQorCUBlY2hvIG1pYz0kKG1pYykKKwlAZWNobyBtb2RlPSQobW9kZSkKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvUkVBRE1FLnR4dCBiL3JjMS9ydW50aW1lL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMjA3YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMTcgQEAKKworICAgICAgICAgICAgICAgUkVBRE1FIGZvciBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbgorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuICAKK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOgorCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnIAorCitpbiB0aGlzIGRpcmVjdG9yeS4KKworVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlCitpbmRleC5odG1sIGZpbGUgdGhlcmUuCisKK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20KK3d3dy5kb3h5Z2VuLm9yZy4KKworCitIb3cgdG8gQnVpbGQgdGhlIEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bworYnVpbGQgdGhlIEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5LiAgVG8gc2VlIHRoZSBkZWZhdWx0IHNldHRpbmdzLCAKK3R5cGU6CisKK21ha2UgaW5mbworCitZb3UgY2FuIGNoYW5nZSB0aGUgTWFrZWZpbGUncyBiZWhhdmlvciB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworb21wX3Jvb3Q6ICAgIFRoZSBwYXRoIHRvIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRvcC1sZXZlbAorCSAgICAgTWFrZWZpbGUuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbiB0aGUgdmFsdWUgb2YgdGhlIAorCSAgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworb21wX29zOiAgICAgIE9wZXJhdGluZyBzeXN0ZW0uICBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMuIEN1cnJlbnRseSBzdXBwb3J0cyAibGludXgiLCAiZnJlZWJzZCIsICJtYWNvcyIsIGFuZAorCSAgICAgIndpbmRvd3MiLgorCithcmNoOiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IAorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIAorICAgICAgICAgICAgICAgICAiMzJlIiBmb3IgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICJtaWMiIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUKKwkgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQorCSAgICAgbmVjZXNzYXJ5IHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lCisJICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSAoYnV0IGFuIEludGVsKFIpIFhlb24gUGhpKFRNKQorCSAgICAgY29wcm9jZXNzb3IgY2FyZCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLgorCitjb21waWxlcjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIiAKKwkgICAgIG9yICJpY2wiIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Ygb21wX29zLiBBbHNvIHN1cHBvcnRzIAorCSAgICAgc29tZSB2ZXJzaW9ucyBvZiAiZ2NjIiogd2hlbiBvbXBfb3MgaXMgImxpbnV4Ii4gVGhlIHNlbGVjdGVkIAorCSAgICAgY29tcGlsZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgCisJICAgICBjb3JyZXNwb25kaW5nIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguIAorCSAgICAgU2VlICJTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zIiBiZWxvdyBmb3IgbW9yZSAKKwkgICAgIGluZm9ybWF0aW9uIG9uIGNvbXBpbGVyIHZlcnNpb25zLgorCittb2RlOiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4KKworVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3IgCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGdjYyBpbnN0ZWFkIG9mIGljYywgdHlwZToKKworbWFrZSBjb21waWxlcj1nY2MKKworVGhlcmUgaXMgYWxzbyBhbiBleHBlcmltZW50YWwgQ01ha2UgYnVpbGQgc3lzdGVtLiBUaGlzIGlzICpub3QqIHlldAorc3VwcG9ydGVkIGZvciBwcm9kdWN0aW9uIHVzZSBhbmQgcmVzdWx0aW5nIGJpbmFyaWVzIGhhdmUgbm90IGJlZW4gY2hlY2tlZAorZm9yIGNvbXBhdGliaWxpdHkuCisKK1N1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElBLTMyIGFyY2hpdGVjdHVyZSwgSW50ZWwoUikgNjQsIGFuZCAKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgIGNsYW5nICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgIFllcygxLDUpICAgIHwgIFllcygyLDQpICAgfCBZZXMoNCw2LDcpIHwKK3wgRnJlZUJTRCogICAgfCAgIE5vICAgICAgICAgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpIHwKK3wgT1MgWCogICAgICAgfCAgIFllcygxLDMsNCkgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpIHwKK3wgV2luZG93cyogT1MgfCAgIFllcygxLDQpICAgIHwgIE5vICAgICAgICAgfCBObyAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCBhcmUgCisgICAgc3VwcG9ydGVkICgxMi4xIGlzIHJlY29tbWVuZGVkKS4KKygyKSBnY2MgdmVyc2lvbiA0LjYuMiBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wIAorICAgIG9yIGxhdGVyIGFyZSByZXF1aXJlZC4KKyg2KSBjbGFuZyB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgY2xhbmcgY3VycmVudGx5IGRvZXMgbm90IG9mZmVyIGEgc29mdHdhcmUtaW1wbGVtZW50ZWQgMTI4IGJpdCBleHRlbmRlZCAKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogIGljYy9pY2wsIGdjYy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWwuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmIGIvcmMxL3J1bnRpbWUvZG9jL1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZjk4YwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL3JjMS9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM3N2NiCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMTgyMiBAQAorIyBEb3h5ZmlsZSAxLm84LjINCisNCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtDQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuDQorIw0KKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLg0KKyMgVGhlIGZvcm1hdCBpczoNCisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOg0KKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKS4NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUNCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwNCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQ0KKyMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUNCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOA0KKw0KKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3Igc2VxdWVuY2Ugb2Ygd29yZHMpIHRoYXQgc2hvdWxkDQorIyBpZGVudGlmeSB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IGlmIHlvdSBkbyBub3QgdXNlIERveHl3aXphcmQgeW91IG5lZWQNCisjIHRvIHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBwcm9qZWN0IG5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLg0KKw0KK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiSW50ZWwmcmVnOyZuYnNwO09wZW5NUCogUnVudGltZSBMaWJyYXJ5Ig0KKw0KKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLg0KKyMgVGhpcyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvcg0KKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuDQorDQorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9DQorDQorIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uDQorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyDQorIyBhIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0Lg0KKw0KK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPQ0KKw0KKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMNCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdA0KKyMgZXhjZWVkIDU1IHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4NCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKQ0KKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbg0KKyMgd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLg0KKw0KK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCisNCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlDQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0DQorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuDQorIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2YNCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZA0KKyMgb3RoZXJ3aXNlIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uDQorDQorQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PDQorDQorIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbA0KKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMNCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4NCisjIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2gsIG90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOg0KKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwNCisjIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRXNwZXJhbnRvLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sDQorIyBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaA0KKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLA0KKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLA0KKyMgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVWtyYWluaWFuLCBhbmQgVmlldG5hbWVzZS4NCisNCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaA0KKw0KKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluDQorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4NCisjIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuDQorDQorQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kDQorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4NCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUNCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4NCisNCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTDQorDQorIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3INCisjIHRoYXQgaXMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nDQorIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlDQorIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzDQorIyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4NCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkNCisjIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0Ig0KKyMgIlRoZSAkbmFtZSBmaWxlIiAiaXMiICJwcm92aWRlcyIgInNwZWNpZmllcyIgImNvbnRhaW5zIg0KKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiDQorDQorQUJCUkVWSUFURV9CUklFRiAgICAgICA9DQorDQorIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuDQorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmDQorIyBkZXNjcmlwdGlvbi4NCisNCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8NCisNCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbA0KKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlDQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudA0KKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uDQorDQorSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwNCisjIHBhdGggYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0DQorIyB0byBOTyB0aGUgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZC4NCisNCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZw0KKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzDQorIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZg0KKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0Lg0KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUNCisjIHBhdGggdG8gc3RyaXAuIE5vdGUgdGhhdCB5b3Ugc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbw0KKyMgcmVsYXRpdmUgcGF0aHMsIHdoaWNoIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMNCisjIHN0YXJ0ZWQuDQorDQorU1RSSVBfRlJPTV9QQVRIICAgICAgICA9DQorDQorIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZg0KKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzDQorIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuDQorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzDQorIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdA0KKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuDQorDQorU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9DQorDQorIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXINCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdXIgZmlsZSBzeXN0ZW0NCisjIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4NCisNCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4NCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jDQorIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cw0KKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikNCisNCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8NCisNCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwNCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQ0KKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIGNvbW1lbnRzDQorIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcNCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikNCisNCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIERveHlnZW4NCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLw0KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuDQorIyBUaGUgbmV3IGRlZmF1bHQgaXMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQNCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4NCisNCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8NCisNCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZA0KKyMgbWVtYmVyIGluaGVyaXRzIHRoZSBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQNCisjIHJlLWltcGxlbWVudHMuDQorDQorSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQ0KKyMgYSBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbA0KKyMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4NCisNCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8NCisNCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLg0KKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4NCisNCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOA0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0cw0KKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuDQorIyBGb3IgZXhhbXBsZSBhZGRpbmcgInNpZGVlZmZlY3Q9XHBhciBTaWRlIEVmZmVjdHM6XG4iIHdpbGwgYWxsb3cgeW91IHRvDQorIyBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2gNCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLg0KKyMgWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQgbmV3bGluZXMuDQorDQorQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJvdGhlcj08c3VwPio8L3N1cD4iDQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLg0KKyMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZw0KKyMgImNsYXNzPWl0Y2w6OmNsYXNzIiB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlDQorIyBpdGNsOjpjbGFzcyBtZWFuaW5nLg0KKw0KK1RDTF9TVUJTVCAgICAgICAgICAgICAgPQ0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQw0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLg0KKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdA0KKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuDQorDQorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmENCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3INCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkDQorIyBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBGb3J0cmFuLg0KKw0KK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMDQorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3INCisjIFZIREwuDQorDQorT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PDQorDQorIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0DQorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbg0KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdA0KKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwNCisjIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwNCisjIEphdmFzY3JpcHQsIENTaGFycCwgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwsIEMsDQorIyBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0DQorIyBpcyBQSFApLCBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUNCisjIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlIHRoZQ0KKyMgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uDQorDQorRVhURU5TSU9OX01BUFBJTkcgICAgICA9DQorDQorIyBJZiBNQVJLRE9XTl9TVVBQT1JUIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwNCisjIGNvbW1lbnRzIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUNCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4NCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UNCisjIGNhbiBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuDQorIyBEaXNhYmxlIG9ubHkgaW4gY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLg0KKw0KK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMNCisNCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQgY2xhc3NlcywNCisjIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4gYmUNCisjIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQgb3INCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4NCisNCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50DQorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQNCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOyB2LnMuDQorIyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlcyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24NCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4NCisNCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8NCisNCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvDQorIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0Lg0KKw0KK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgc291cmNlcyBvbmx5Lg0KKyMgRG94eWdlbiB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljDQorIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4NCisNCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8NCisNCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0bw0KKyMgaW5kaWNhdGUgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzDQorIyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBtYWtlIGRveHlnZW4gcmVwbGFjZSB0aGUgZ2V0IGFuZA0KKyMgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yaw0KKyMgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUgdHlwZS4gSWYgdGhpcw0KKyMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZA0KKyMgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLg0KKw0KK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMNCisNCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MNCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QNCisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdA0KKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4NCisNCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8NCisNCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YNCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhDQorIyBzdWJncm91cCBvZiB0aGF0IHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0bw0KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcNCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLg0KKw0KK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMNCisNCisjIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kDQorIyB1bmlvbnMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcNCisjIEBpbmdyb3VwKSBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3INCisjIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4NCisNCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8NCisNCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kDQorIyB1bmlvbnMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwgbmFtZXNwYWNlLCBvciBncm91cA0KKyMgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCksDQorIyBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4NCisjIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PDQorDQorIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0NCisjIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbw0KKyMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0DQorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLA0KKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5DQorIyBiZSB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZA0KKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLg0KKw0KK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTw0KKw0KKyMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0bw0KKyMgZGV0ZXJtaW5lIHdoaWNoIHN5bWJvbHMgdG8ga2VlcCBpbiBtZW1vcnkgYW5kIHdoaWNoIHRvIGZsdXNoIHRvIGRpc2suDQorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4NCisjIEZvciBzbWFsbCB0byBtZWRpdW0gc2l6ZSBwcm9qZWN0cyAoPDEwMDAgaW5wdXQgZmlsZXMpIHRoZSBkZWZhdWx0IHZhbHVlIGlzDQorIyBwcm9iYWJseSBnb29kIGVub3VnaC4gRm9yIGxhcmdlciBwcm9qZWN0cyBhIHRvbyBzbWFsbCBjYWNoZSBzaXplIGNhbiBjYXVzZQ0KKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lDQorIyBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWx0eS4NCisjIElmIHRoZSBzeXN0ZW0gaGFzIGVub3VnaCBwaHlzaWNhbCBtZW1vcnkgaW5jcmVhc2luZyB0aGUgY2FjaGUgd2lsbCBpbXByb3ZlIHRoZQ0KKyMgcGVyZm9ybWFuY2UgYnkga2VlcGluZyBtb3JlIHN5bWJvbHMgaW4gbWVtb3J5LiBOb3RlIHRoYXQgdGhlIHZhbHVlIHdvcmtzIG9uDQorIyBhIGxvZ2FyaXRobWljIHNjYWxlIHNvIGluY3JlYXNpbmcgdGhlIHNpemUgYnkgb25lIHdpbGwgcm91Z2hseSBkb3VibGUgdGhlDQorIyBtZW1vcnkgdXNhZ2UuIFRoZSBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYToNCisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsDQorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4NCisNCitTWU1CT0xfQ0FDSEVfU0laRSAgICAgID0gMA0KKw0KKyMgU2ltaWxhciB0byB0aGUgU1lNQk9MX0NBQ0hFX1NJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlDQorIyBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4NCisjIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZSBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlDQorIyBzYW1lIHN5bWJvbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZg0KKyMgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuDQorIyBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzDQorIyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbg0KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuDQorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzDQorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTDQorDQorRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcw0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbA0KKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlDQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpDQorIyBkZWZpbmVkIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTDQorDQorIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbA0KKyMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbg0KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PDQorDQorIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQ0KKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkDQorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlDQorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQNCisjIGFub255bW91cyBuYW1lc3BhY2VzIGFyZSBoaWRkZW4uDQorDQorRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PDQorDQorIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUNCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4NCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4NCisNCitISURFX1VORE9DX01FTUJFUlMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cw0KKyMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19DTEFTU0VTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLg0KKw0KK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkNCisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlDQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suDQorDQorSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PDQorDQorIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uDQorIyB0aGF0IGlzIHR5cGVkIGFmdGVyIGEgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0DQorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4NCisjIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4NCisNCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBEb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZQ0KKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvDQorIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyDQorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MNCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLg0KKw0KK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGggdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLg0KKw0KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBwdXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoYXQgZmlsZS4NCisNCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGxpc3QgaW5jbHVkZSBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuDQorDQorRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdDQorIyBpcyBpbnNlcnRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuDQorDQorSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4NCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMNCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4NCisjIGRlY2xhcmF0aW9uIG9yZGVyLg0KKw0KK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5DQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4NCisjIGRlY2xhcmF0aW9uIG9yZGVyLg0KKw0KK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0DQorIyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorIyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZSByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5DQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuDQorIyBUaGlzIHRhZyB3aWxsIGJlIGlnbm9yZWQgZm9yIGJyaWVmIGRvY3MgaWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTw0KKyMgYW5kIGlnbm9yZWQgZm9yIGRldGFpbGVkIGRvY3MgaWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8uDQorDQorU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQ0KKyMgaGllcmFyY2h5IG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGdyb3VwIG5hbWVzIHdpbGwgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuDQorDQorU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlDQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvDQorIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsDQorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4NCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUNCisjIGFscGhhYmV0aWNhbCBsaXN0Lg0KKw0KK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0bw0KKyMgZG8gcHJvcGVyIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGENCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4NCisjIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UNCisjIGJ5IGRvaW5nIGEgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuDQorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLg0KKw0KK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvDQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1Zw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nDQorIyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTDQorDQorIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsDQorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuDQorDQorRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9DQorDQorIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcw0KKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluDQorIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQNCisjIGhlcmUgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4NCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXINCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuDQorDQorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwDQorDQorIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQNCisjIGF0IHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUNCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTDQorDQorIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUNCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4NCisNCisjIFdlIHByb2JhYmx5IHdpbGwgd2FudCB0aGlzLCBidXQgd2UgaGF2ZSBubyBmaWxlIGRvY3VtZW50YXRpb24geWV0IHNvIGl0J3Mgc2ltcGxlciB0byByZW1vdmUNCisjIGl0IGZvciBub3cuDQorU0hPV19GSUxFUyAgICAgICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUNCisjIE5hbWVzcGFjZXMgcGFnZS4NCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgNCisjIGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0DQorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20NCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQ0KKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZg0KKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUNCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQNCisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLg0KKw0KK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQ0KKw0KKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQNCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkDQorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUNCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4NCisjIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQNCisjIERveHlnZW5MYXlvdXQueG1sIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuDQorDQorTEFZT1VUX0ZJTEUgICAgICAgICAgICA9DQorDQorIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzDQorIyBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIGRhdGEuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlDQorIyAuYmliIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFVzaW5nIHRoaXMgY29tbWFuZA0KKyMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28NCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uIEZvciBMYVRlWCB0aGUgc3R5bGUNCisjIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcw0KKyMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZSBzZWFyY2ggcGF0aC4NCisNCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZA0KKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlDQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rDQorIyBOTyBpcyB1c2VkLg0KKw0KK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIFdBUk5fSUZfVU5ET0NVTUVOVEVEIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzDQorIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbA0KKyMgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4NCisNCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yDQorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lDQorIyBwYXJhbWV0ZXJzIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0DQorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4NCisNCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTDQorDQorIyBUaGUgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvcg0KKyMgZnVuY3Rpb25zIHRoYXQgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMNCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dA0KKyMgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZg0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8NCisNCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQNCisjIGRveHlnZW4gY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0DQorIyB0YWdzLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZQ0KKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4NCisjICR2ZXJzaW9uLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZA0KKyMgYmUgb2J0YWluZWQgdmlhIEZJTEVfVkVSU0lPTl9GSUxURVIpDQorDQorV0FSTl9GT1JNQVQgICAgICAgICAgICA9DQorDQorIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nDQorIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuDQorIyB0byBzdGRlcnIuDQorDQorV0FSTl9MT0dGSUxFICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluDQorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yDQorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMNCisjIHdpdGggc3BhY2VzLg0KKw0KK0lOUFVUICAgICAgICAgICAgICAgICAgPSBzcmMgIGRvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaCANCisjIFRoZSBpdHRub3RpZnkgY29kZSBhbHNvIGhhcyBkb3h5Z2VuIGRvY3VtZW50YXRpb24sIGJ1dCBpZiB3ZSBpbmNsdWRlIGl0IGhlcmUNCisjIGl0IHRha2VzIG92ZXIgZnJvbSB1cyENCisjIHNyYy90aGlyZHBhcnR5L2l0dG5vdGlmeSAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzDQorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzDQorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdA0KKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcg0KKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOA0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6DQorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmQgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGgNCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkNCisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwNCisNCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcCANCisjIFdlIG1heSBhbHNvIHdhbnQgdG8gaW5jbHVkZSB0aGUgYXNtIGZpbGVzIHdpdGggYXBwcm9wcmlhdGUgaWZkZWYgdG8gZW5zdXJlDQorIyBkb3h5Z2VuIGRvZXNuJ3Qgc2VlIHRoZSBjb250ZW50LCBqdXN0IHRoZSBkb2N1bWVudGF0aW9uLi4uDQorDQorIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMNCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLg0KKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KKyMgT25seSBsb29rIGluIHRoZSBvbmUgZGlyZWN0b3J5Lg0KK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlDQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQ0KKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuDQorIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzDQorIyBydW4uDQorDQorRVhDTFVERSAgICAgICAgICAgICAgICA9IHNyYy90ZXN0LXRvdWNoLmMNCisNCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkDQorIyBmcm9tIHRoZSBpbnB1dC4NCisNCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8NCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQ0KKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLiBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZA0KKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMNCisjIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKg0KKw0KK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQ0KKw0KKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMNCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlDQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUNCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsDQorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0DQorDQorRVhDTFVERV9TWU1CT0xTICAgICAgICA9DQorDQorIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlDQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuDQorDQorRVhBTVBMRV9QQVRIICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayBhbGwgZmlsZXMgYXJlIGluY2x1ZGVkLg0KKw0KK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQ0KKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlDQorIyBjb21tYW5kcyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLg0KKyMgUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PDQorDQorIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGltYWdlIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUNCisjIHRoZSBcaW1hZ2UgY29tbWFuZCkuDQorDQorSU1BR0VfUEFUSCAgICAgICAgICAgICA9DQorDQorIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkDQorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtDQorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZCA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxmaWx0ZXI+DQorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4NCisjIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlciBwcm9ncmFtIHdyaXRlcw0KKyMgdG8gc3RhbmRhcmQgb3V0cHV0Lg0KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQ0KKyMgaWdub3JlZC4NCisNCitJTlBVVF9GSUxURVIgICAgICAgICAgID0NCisNCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4NCisjIGJhc2lzLg0KKyMgRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlDQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4NCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06DQorIyBwYXR0ZXJuPWZpbHRlciAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlcg0KKyMgaW5mbyBvbiBob3cgZmlsdGVycyBhcmUgdXNlZC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIGVtcHR5IG9yIGlmDQorIyBub24gb2YgdGhlIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLg0KKw0KK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZw0KKyMgSU5QVVRfRklMVEVSKSB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB3aGVuIHByb2R1Y2luZyBzb3VyY2UNCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLg0KKw0KK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTw0KKw0KKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUNCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KQ0KKyMgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4NCisjIHVzaW5nICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLiBUaGlzIG9wdGlvbiBvbmx5IGhhcyBlZmZlY3Qgd2hlbg0KKyMgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBlbmFibGVkLg0KKw0KK0ZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbA0KKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuDQorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28NCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLg0KKw0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMNCisNCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5DQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PDQorDQorIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0DQorIyBkb3h5Z2VuIHRvIGhpZGUgYW55IHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUNCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4NCisNCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUw0KKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkDQorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcw0KKyMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4NCisNCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8NCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkNCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tDQorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsDQorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4NCisjIE90aGVyd2lzZSB0aGV5IHdpbGwgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTDQorDQorIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUNCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbg0KKyMgYnVpbHQtaW4gc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZQ0KKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91DQorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuDQorDQorVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcg0KKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuDQorDQorVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgNCisjIG9mIGFsbCBjb21wb3VuZHMgd2lsbCBiZSBnZW5lcmF0ZWQuIEVuYWJsZSB0aGlzIGlmIHRoZSBwcm9qZWN0DQorIyBjb250YWlucyBhIGxvdCBvZiBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4NCisNCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gWUVTDQorDQorIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4NCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucw0KKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkNCisNCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQ0KKw0KKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbA0KKyMgY2xhc3NlcyB3aWxsIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4NCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQNCisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuDQorDQorSUdOT1JFX1BSRUZJWCAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIEhUTUwgb3V0cHV0Lg0KKw0KK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK0hUTUxfT1VUUFVUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uDQorDQorSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sDQorDQorIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBhIGN1c3RvbSBoZWFkZXIgeW91IGFyZSByZXNwb25zaWJsZQ0KKyMgIGZvciB0aGUgcHJvcGVyIGluY2x1c2lvbiBvZiBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzIHRoYXQgZG94eWdlbg0KKyMgbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQuDQorIyBJdCBpcyBhZHZpc2VkIHRvIGdlbmVyYXRlIGEgZGVmYXVsdCBoZWFkZXIgdXNpbmcgImRveHlnZW4gLXcgaHRtbA0KKyMgaGVhZGVyLmh0bWwgZm9vdGVyLmh0bWwgc3R5bGVzaGVldC5jc3MgWW91ckNvbmZpZ0ZpbGUiIGFuZCB0aGVuIG1vZGlmeQ0KKyMgdGhhdCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkNCisjIGhhdmUgdG8gcmVkbyB0aGlzIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuIG9yIHdoZW4NCisjIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzIHN1Y2ggYXMgR0VORVJBVEVfVFJFRVZJRVchDQorDQorSFRNTF9IRUFERVIgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGZvb3RlciBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgZm9vdGVyLg0KKw0KK0hUTUxfRk9PVEVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcNCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8NCisjIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UNCisjIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcw0KKyMgdGFnIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUgb2Jzb2xldGUuDQorDQorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwNCisjIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQNCisjIHN0eWxlIHNoZWV0cyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUNCisjIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQNCisjIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlDQorIyByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8NCisjIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0hUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yDQorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlDQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQ0KKyMgJHJlbHBhdGgkIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UNCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0DQorIyB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4NCisNCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0NCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0Lg0KKyMgRG94eWdlbiB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMNCisjIGFjY29yZGluZyB0byB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwNCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCisjIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sDQorIyAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMCBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLg0KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuDQorDQorSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMA0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mDQorIyB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlDQorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuDQorDQorSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMA0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9HQU1NQSB0YWcgY29udHJvbHMgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYXBwbGllZCB0bw0KKyMgdGhlIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdw0KKyMgMTAwIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UNCisjIHRoZSBvdXRwdXQgZGFya2VyLiBUaGUgdmFsdWUgZGl2aWRlZCBieSAxMDAgaXMgdGhlIGFjdHVhbCBnYW1tYSBhcHBsaWVkLA0KKyMgc28gODAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLA0KKyMgYW5kIDEwMCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdhbW1hLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MA0KKw0KKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MDQorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcNCisjIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLg0KKw0KK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwNCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlDQorIyBwYWdlIGhhcyBsb2FkZWQuDQorDQorSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PDQorDQorIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mDQorIyBlbnRyaWVzIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXINCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQNCisjIHRoZSB0cmVlIHRvIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUNCisjIHZpc2libGUgKHVubGVzcyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuDQorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkNCisjIGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcw0KKyMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZCB0cmVlIGJ5IGRlZmF1bHQuDQorDQorSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMA0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzDQorIyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBpbnRyb2R1Y2VkIHdpdGggT1NYIDEwLjUgKExlb3BhcmQpLg0KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQ0KKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4gdGhhdA0KKyMgZGlyZWN0b3J5IGFuZCBydW5uaW5nICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluDQorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQNCisjIGl0IGF0IHN0YXJ0dXAuDQorIyBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbA0KKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorDQorR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUNCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlDQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkNCisjIGNhbiBiZSBncm91cGVkLg0KKw0KK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyINCisNCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdA0KKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGENCisjIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4NCisjIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuDQorDQorRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkNCisjIGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lDQorIyBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXINCisNCisjIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuDQorDQorRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcg0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZQ0KKyMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXBpbGVkIEhUTUwgaGVscCBmaWxlICguY2htKQ0KKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0gZmlsZS4gWW91DQorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUNCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitDSE1fRklMRSAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mDQorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuDQorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLg0KKw0KK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcNCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0DQorIyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4NCisNCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORw0KKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQ0KKyMgY29udGVudC4NCisNCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZw0KKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQ0KKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4NCisNCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzDQorIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3Lg0KKw0KK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZA0KKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZA0KKyMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhDQorIyBRdCBDb21wcmVzc2VkIEhlbHAgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuDQorIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4NCisNCitRQ0hfRklMRSAgICAgICAgICAgICAgID0NCisNCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nDQorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQ0KKw0KK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nDQorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtZm9sZGVycw0KKw0KK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MNCisNCisjIElmIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tIGZpbHRlciB0bw0KKyMgYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzDQorDQorUUhQX0NVU1RfRklMVEVSX05BTUUgICA9DQorDQorIyBUaGUgUUhQX0NVU1RfRklMVF9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQ0KKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMiPg0KKyMgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tIEZpbHRlcnM8L2E+Lg0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPQ0KKw0KKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMNCisjIHByb2plY3Qncw0KKyMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4NCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPg0KKyMgUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXM8L2E+Lg0KKw0KK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFFIR19MT0NBVElPTiB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuDQorIyBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlIGdlbmVyYXRlZA0KKyMgLnFocCBmaWxlLg0KKw0KK1FIR19MT0NBVElPTiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyAgd2lsbCBiZSBnZW5lcmF0ZWQsIHdoaWNoIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIGZvcm0gYW4gRWNsaXBzZSBoZWxwDQorIyBwbHVnaW4uIFRvIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzDQorIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTA0KKyMgZmlsZXMgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mDQorIyB0aGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzDQorIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlDQorIyB0aGUgaGVscCBhcHBlYXJzLg0KKw0KK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTw0KKw0KKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luDQorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUNCisjIHRoaXMgbmFtZS4NCisNCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpDQorIyBhdCB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZA0KKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4gU2luY2UgdGhlIHRhYnMgaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUNCisjIG5hdmlnYXRpb24gdHJlZSB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBOTyBpZiB5b3UgYWxyZWFkeSBzZXQNCisjIEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4NCisNCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgNCisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLg0KKyMgSWYgdGhlIHRhZyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0DQorIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMNCisjIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZCAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLg0KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuDQorIyBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXggeW91DQorIyBjb3VsZCBjb25zaWRlciB0byBzZXQgRElTQUJMRV9JTkRFWCB0byBOTyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLg0KKw0KK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTw0KKw0KKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcw0KKyMgKHJhbmdlIFswLDEuLjIwXSkgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bQ0KKyMgdmFsdWVzIGZyb20gYXBwZWFyaW5nIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLg0KKw0KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0DQorDQorIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQ0KKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlDQorIyBpcyBzaG93bi4NCisNCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwDQorDQorIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuDQorIyBsaW5rcyB0byBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuDQorDQorRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PDQorDQorIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQNCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0DQorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQNCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5DQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLg0KKw0KK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMA0KKw0KKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzDQorIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZQ0KKyMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLg0KKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzDQorIyBpbiB0aGUgSFRNTCBvdXRwdXQgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0Lg0KKw0KK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMNCisNCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4DQorIyAoc2VlIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlDQorIyByZW5kZXJpbmcgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90DQorIyBoYXZlIExhVGVYIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MDQorIyBvdXRwdXQuIFdoZW4gZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQNCisjIGNvbmZpZ3VyZSB0aGUgcGF0aCB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4NCisNCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8NCisNCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQ0KKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24NCisjIGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXgNCisjIGRpcmVjdG9yeSBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4NCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvDQorIyB0aGUgTWF0aEpheCBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQNCisjIGluc3RhbGxpbmcgTWF0aEpheC4NCisjIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbA0KKyMgY29weSBvZiBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4NCisNCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdA0KKw0KKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgTWF0aEpheCBleHRlbnNpb24NCisjIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLg0KKw0KK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQ0KKw0KKyMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3gNCisjIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0DQorIyBhbmQgREhUTUwgYW5kIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcNCisjIEhUTUwgaGVscCAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzDQorIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZA0KKyMgdHlwaWNhbGx5IGJlIGRpc2FibGVkLiBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZQ0KKyMgY2FuIGJlIHNsb3csIHRoZW4gZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4NCisNCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUNCisjIGltcGxlbWVudGVkIHVzaW5nIGEgUEhQIGVuYWJsZWQgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGF0IHRoZSB3ZWIgY2xpZW50DQorIyB1c2luZyBKYXZhc2NyaXB0LiBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIHNlYXJjaCBQSFAgc2NyaXB0IGFuZCBpbmRleA0KKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcg0KKyMgYmFzZWQgYXBwcm9hY2ggaXMgdGhhdCBpdCBzY2FsZXMgYmV0dGVyIHRvIGxhcmdlIHByb2plY3RzIGFuZCBhbGxvd3MNCisjIGZ1bGwgdGV4dCBzZWFyY2guIFRoZSBkaXNhZHZhbnRhZ2VzIGFyZSB0aGF0IGl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIHNldHVwDQorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuDQorDQorU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0Lg0KKw0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK0xBVEVYX09VVFBVVCAgICAgICAgICAgPQ0KKw0KKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUNCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3INCisjIGdlbmVyYXRpbmcgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZQ0KKyMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleA0KKw0KKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvDQorIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZQ0KKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuDQorDQorTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleA0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0DQorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvDQorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4NCisNCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8NCisNCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkDQorIyBieSB0aGUgcHJpbnRlci4gUG9zc2libGUgdmFsdWVzIGFyZTogYTQsIGxldHRlciwgbGVnYWwgYW5kDQorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4NCisNCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlDQorDQorIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYDQorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKw0KK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPQ0KKw0KKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3INCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbA0KKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchDQorDQorTEFURVhfSEVBREVSICAgICAgICAgICA9IGRvYy9kb3h5Z2VuL2hlYWRlci50ZXgNCisNCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXINCisjIHRoZSBsYXN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchDQorDQorTEFURVhfRk9PVEVSICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZA0KKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbA0KKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMNCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgcGRmIHZpZXdlci4NCisNCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZg0KKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQ0KKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uDQorDQorVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXFxiYXRjaG1vZGUuDQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwDQorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuDQorIyBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuDQorDQorTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QNCisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQ0KKyMgaW4gdGhlIG91dHB1dC4NCisNCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8NCisNCisjIElmIExBVEVYX1NPVVJDRV9DT0RFIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZQ0KKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuDQorIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzDQorIyBzdWNoIGFzIFNPVVJDRV9CUk9XU0VSLg0KKw0KK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTw0KKw0KKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUNCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBUaGUgZGVmYXVsdCBzdHlsZSBpcyAicGxhaW4iLiBTZWUNCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uDQorDQorTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0DQorIyBUaGUgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB2ZXJ5IHByZXR0eSB3aXRoDQorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLg0KKw0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorUlRGX09VVFBVVCAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0DQorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQNCisjIHdpbGwgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbA0KKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyDQorIyBwcm9ncmFtcyB3aGljaCBzdXBwb3J0IHRob3NlIGZpZWxkcy4NCisjIE5vdGU6IHdvcmRwYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLg0KKw0KK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTw0KKw0KKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncw0KKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZQ0KKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4NCisNCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0NCisNCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuDQorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuDQorDQorUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIG1hbiBwYWdlcw0KKw0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBtYW4nIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK01BTl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvDQorIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpDQorDQorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9DQorDQorIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LA0KKyMgdGhlbiBpdCB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eQ0KKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcw0KKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kDQorIyB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLiBUaGUgZGVmYXVsdCBpcyBOTy4NCisNCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YNCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sDQorDQorIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfU0NIRU1BICAgICAgICAgICAgID0NCisNCisjIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBEVEQsDQorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUNCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLg0KKw0KK1hNTF9EVEQgICAgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGR1bXAgdGhlIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nDQorIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQNCisjIGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBYTUwgb3V0cHV0Lg0KKw0KK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGFuIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBhdXRvZ2VuLnNmLm5ldCkgZmlsZQ0KKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwNCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsDQorIyBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50Lg0KKw0KK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YNCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMNCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQ0KKyMgbW9tZW50Lg0KKw0KK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlDQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQ0KKyMgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4NCisNCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUNCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4NCisjIFRoaXMgaXMgdXNlZnVsDQorIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uDQorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcw0KKyMgdGFnIGlzIHNldCB0byBOTyB0aGUgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyDQorIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuDQorDQorUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUNCisjIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguDQorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUNCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLg0KKw0KK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3INCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlDQorIyBmaWxlcy4NCisNCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTDQorDQorIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvDQorIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwNCisjIGNvbXBpbGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkDQorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLg0KKw0KK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMNCisjIHRoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlDQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLg0KKw0KK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMNCisjIHBvaW50ZWQgdG8gYnkgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgd2hlbiBhICNpbmNsdWRlIGlzIGZvdW5kLg0KKw0KK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQ0KKyMgdGhlIHByZXByb2Nlc3Nvci4NCisNCitJTkNMVURFX1BBVEggICAgICAgICAgID0NCisNCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQNCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUNCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsDQorIyBiZSB1c2VkLg0KKw0KK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPQ0KKw0KKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdA0KKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mDQorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lDQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUNCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZw0KKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcg0KKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4NCisNCitQUkVERUZJTkVEICAgICAgICAgICAgID0gT01QXzMwX0VOQUJMRUQ9MSwgT01QXzQwX0VOQUJMRUQ9MQ0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuDQorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4NCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdA0KKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4NCisNCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0NCisNCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4NCisjIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MNCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQ0KKyMgc2VtaWNvbG9uLCBiZWNhdXNlIHRoZXNlIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdCByZW1vdmVkLg0KKw0KK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiBGb3IgZWFjaA0KKyMgdGFnIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlDQorIyBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoNCisjDQorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLg0KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoNCisjDQorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uDQorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMNCisjIG9yIFVSTHMuIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzDQorIyBOT1QgaW5jbHVkZSB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaA0KKyMgZG94eWdlbiBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLg0KKw0KK1RBR0ZJTEVTICAgICAgICAgICAgICAgPQ0KKw0KKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4NCisNCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0NCisNCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzDQorIyB3aWxsIGJlIGxpc3RlZC4NCisNCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZA0KKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwNCisjIGJlIGxpc3RlZC4NCisNCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTDQorDQorIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQNCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4NCisNCitQRVJMX1BBVEggICAgICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlDQorIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0DQorIyB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0bw0KKyMgaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUgcG93ZXJmdWwgZ3JhcGhzLg0KKw0KK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMNCisNCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjDQorIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUNCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUNCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlDQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLg0KKw0KK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQ0KKw0KKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUNCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQNCisjIG9yIGlzIG5vdCBhIGNsYXNzLg0KKw0KK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMNCisNCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcw0KKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24NCisjIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24NCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorDQorSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzDQorIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbA0KKyMgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQNCisjIGV4cGxpY2l0bHkgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UNCisjIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuDQorDQorRE9UX05VTV9USFJFQURTICAgICAgICA9IDANCisNCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQgZm9yIGFsbCBkb3QgZmlsZXMgdGhhdA0KKyMgZG94eWdlbiBnZW5lcmF0ZXMuIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgeW91IGNhbiBzcGVjaWZ5DQorIyB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQNCisjIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZw0KKyMgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZQ0KKyMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuDQorDQorRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQ0KKw0KKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBmb250IG9mIGRvdCBncmFwaHMuDQorIyBUaGUgZGVmYXVsdCBzaXplIGlzIDEwcHQuDQorDQorRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIEhlbHZldGljYSBmb250Lg0KKyMgSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiB1c2UgRE9UX0ZPTlRQQVRIIHRvDQorIyBzZXQgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0Lg0KKw0KK0RPVF9GT05UUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZA0KKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQ0KKyMgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLg0KKw0KK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZA0KKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZA0KKyMgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZSBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4NCisNCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTDQorDQorIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzDQorDQorR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQNCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nDQorIyBMYW5ndWFnZS4NCisNCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlDQorIyB0aGUgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlDQorIyBncmFwaCBtYXkgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMNCisjIHRocmVzaG9sZCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZQ0KKyMgbWFuYWdhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlDQorIyBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdCBpcyBlbmZvcmNlZC4NCisNCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTANCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZQ0KKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuDQorDQorVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVA0KKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQNCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoDQorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLg0KKw0KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kDQorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gNCisjIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yDQorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLg0KKw0KK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocw0KKyMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24NCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZQ0KKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcg0KKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4NCisNCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTDQorDQorIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTDQorIyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzDQorIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuDQorDQorRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMNCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgc3ZnLCBwbmcsIGpwZywgb3IgZ2lmLg0KKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQNCisjIEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzDQorIyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzIHJlcXVpcmVtZW50KS4NCisNCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nDQorDQorIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8NCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLg0KKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLg0KKyMgVGVzdGVkIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLiBGb3IgSUUgOSsgeW91DQorIyBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuDQorDQorSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PDQorDQorIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQ0KKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4NCisNCitET1RfUEFUSCAgICAgICAgICAgICAgID0NCisNCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxkb3RmaWxlIGNvbW1hbmQpLg0KKw0KK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQ0KKyMgXG1zY2ZpbGUgY29tbWFuZCkuDQorDQorTVNDRklMRV9ESVJTICAgICAgICAgICA9DQorDQorIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZg0KKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoDQorIyBiZWNvbWVzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzDQorIyB2aXN1YWxpemVkIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUNCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4NCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUNCisjIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguDQorDQorRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwDQorDQorIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQ0KKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlDQorIyBmcm9tIHRoZSByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2Rlcw0KKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzDQorIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlDQorIyBjb2RlIGJhc2VzLiBBbHNvIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkNCisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4NCisNCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMA0KKw0KKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50DQorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3QNCisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsDQorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZg0KKyMgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvIHJlYWQpLg0KKw0KK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQNCisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMNCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApDQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Lg0KKw0KK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZSBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZA0KKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4NCisNCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlDQorIyB0aGUgdmFyaW91cyBncmFwaHMuDQorDQorRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUw0KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9yYzEvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzc1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4CkBAIC0wLDAgKzEsOTIgQEAKKyUgTGF0ZXggaGVhZGVyIGZvciBkb3h5Z2VuIDEuOC4zLjEKK1xkb2N1bWVudGNsYXNze2Jvb2t9CitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9CitcdXNlcGFja2FnZXttYWtlaWR4fQorXHVzZXBhY2thZ2V7bmF0YmlifQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9CitcdXNlcGFja2FnZXttdWx0aWNvbH0KK1x1c2VwYWNrYWdle2Zsb2F0fQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9CitcdXNlcGFja2FnZXtjb2xvcn0KK1x1c2VwYWNrYWdle2lmdGhlbn0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9CitcdXNlcGFja2FnZXt0ZXh0Y29tcH0KK1x1c2VwYWNrYWdle2FsbHR0fQorXHVzZXBhY2thZ2V7aWZwZGZ9CitcaWZwZGYKK1x1c2VwYWNrYWdlW3BkZnRleCwKKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgICAgXXtoeXBlcnJlZn0KK1xlbHNlCitcdXNlcGFja2FnZVtwczJwZGYsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcdXNlcGFja2FnZXtwc3BpY3R1cmV9CitcZmkKK1x1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9CitcdXNlcGFja2FnZVtzY2FsZWQ9LjkwXXtoZWx2ZXR9CitcdXNlcGFja2FnZXtjb3VyaWVyfQorXHVzZXBhY2thZ2V7c2VjdHN0eX0KK1x1c2VwYWNrYWdle2Ftc3N5bWJ9CitcdXNlcGFja2FnZVt0aXRsZXNde3RvY2xvZnR9CitcdXNlcGFja2FnZXtkb3h5Z2VufQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0KK1xtYWtlaW5kZXgKK1xzZXRjb3VudGVye3RvY2RlcHRofXszfQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9CitccmVuZXdjb21tYW5ke1xmYW1pbHlkZWZhdWx0fXtcc2ZkZWZhdWx0fQorXGhmdXp6PTE1cHQKK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9CitcaGJhZG5lc3M9NzUwCitcdG9sZXJhbmNlPTc1MAorXGJlZ2lue2RvY3VtZW50fQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj1mYWxzZSxjaXRlY29sb3I9Ymx1ZX0KK1xiZWdpbnt0aXRsZXBhZ2V9CitcdnNwYWNlKns3Y219CitcYmVnaW57Y2VudGVyfQore1xMYXJnZSBJbnRlbFx0ZXh0c3VwZXJzY3JpcHR7XHRleHRyZWdpc3RlcmVkfSAgT3Blbk1QXHRleHRzdXBlcnNjcmlwdHsqfSBSdW50aW1lIExpYnJhcnkgfVxcCitcdnNwYWNlKnsxY219Cit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwKK1x2c3BhY2UqezAuNWNtfQore1xzbWFsbCAkZGF0ZXRpbWUgfVxcCitcZW5ke2NlbnRlcn0KK1xlbmR7dGl0bGVwYWdlfQorCit7XGJmIEZUQyBPcHRpbWl6YXRpb24gTm90aWNlfQorXFwKK0ludGVsJ3MgY29tcGlsZXJzIG1heSBvciBtYXkgbm90IG9wdGltaXplIHRvIHRoZSBzYW1lIGRlZ3JlZSBmb3Igbm9uLUludGVsIG1pY3JvcHJvY2Vzc29ycyBmb3IKK29wdGltaXphdGlvbnMgdGhhdCBhcmUgbm90IHVuaXF1ZSB0byBJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFRoZXNlIG9wdGltaXphdGlvbnMgaW5jbHVkZSBTU0UyLAorU1NFMywgYW5kIFNTRTMgaW5zdHJ1Y3Rpb24gc2V0cyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4gSW50ZWwgZG9lcyBub3QgZ3VhcmFudGVlIHRoZQorYXZhaWxhYmlsaXR5LCBmdW5jdGlvbmFsaXR5LCBvciBlZmZlY3RpdmVuZXNzIG9mIGFueSBvcHRpbWl6YXRpb24gb24gbWljcm9wcm9jZXNzb3JzIG5vdAorbWFudWZhY3R1cmVkIGJ5IEludGVsLgorCitNaWNyb3Byb2Nlc3Nvci1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucyBpbiB0aGlzIHByb2R1Y3QgYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBJbnRlbAorbWljcm9wcm9jZXNzb3JzLiBDZXJ0YWluIG9wdGltaXphdGlvbnMgbm90IHNwZWNpZmljIHRvIEludGVsIG1pY3JvYXJjaGl0ZWN0dXJlIGFyZSByZXNlcnZlZCBmb3IKK0ludGVsIG1pY3JvcHJvY2Vzc29ycy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhYmxlIHByb2R1Y3QgVXNlciBhbmQgUmVmZXJlbmNlIEd1aWRlcyBmb3IKK21vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBzcGVjaWZpYyBpbnN0cnVjdGlvbiBzZXRzIGNvdmVyZWQgYnkgdGhpcyBub3RpY2UuCisKK05vdGljZSByZXZpc2lvbiBcIzIwMTEwODA0CisKK3tcYmYgVHJhZGVtYXJrc30KK1xcCitJbnRlbCwgWGVvbiwgYW5kIEludGVsIFhlb24gUGhpIGFyZSB0cmFkZW1hcmtzIG9mIEludGVsIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlciBjb3VudHJpZXMuCisKK1x0ZXh0c3VwZXJzY3JpcHR7Kn0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorCitUaGUgT3Blbk1QIG5hbWUgYW5kIHRoZSBPcGVuTVAgbG9nbyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIHRoZSBPcGVuTVAgQXJjaGl0ZWN0dXJlIFJldmlldyBCb2FyZC4KKworVGhpcyBkb2N1bWVudCBpcyBDb3B5cmlnaHQgXHRleHRjb3B5cmlnaHQgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorIAorXGNsZWFyZW1wdHlkb3VibGVwYWdlCitccGFnZW51bWJlcmluZ3tyb21hbn0KK1x0YWJsZW9mY29udGVudHMKK1xjbGVhcmVtcHR5ZG91YmxlcGFnZQorXHBhZ2VudW1iZXJpbmd7YXJhYmljfQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj10cnVlLGNpdGVjb2xvcj1ibHVlfQpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oIGIvcmMxL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmU3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8vIFRoaXMgZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBjb2RlOyBpdCBqdXN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgdGV4dCBhbmQgZm9ybWF0dGluZw0KKy8vIGZvciBkb3h5Z2VuLg0KKw0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworDQorLyohIEBtYWlucGFnZSBJbnRlbCZyZWc7Jm5ic3A7IE9wZW5NUCogUnVudGltZSBMaWJyYXJ5IEludGVyZmFjZQ0KK0BzZWN0aW9uIHNlY19pbnRybyBJbnRyb2R1Y3Rpb24NCisNCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZQ0KK0ludGVsJnJlZzsmbmJzcDtPcGVuTVBcb3RoZXIgcnVudGltZSBsaWJyYXJ5IHRvIHRoZSBjb21waWxlci4NCitSb3V0aW5lcyB0aGF0IGFyZSBkaXJlY3RseSBjYWxsZWQgYXMgc2ltcGxlIGZ1bmN0aW9ucyBieSB1c2VyIGNvZGUgYXJlDQorbm90IGN1cnJlbnRseSBkZXNjcmliZWQgaGVyZSwgc2luY2UgdGhlaXIgZGVmaW5pdGlvbiBpcyBpbiB0aGUgT3Blbk1QDQorc3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3Blbm1wLm9yZw0KKw0KK1RoZSBhaW0gaGVyZSBpcyB0byBleHBsYWluIHRoZSBpbnRlcmZhY2UgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIHJ1bnRpbWUuDQorDQorVGhlIG92ZXJhbGwgZGVzaWduIGlzIGRlc2NyaWJlZCwgYW5kIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGludGVyZmFjZQ0KK2hhcyBpdHMgb3duIGRlc2NyaXB0aW9uLiAoQXQgbGVhc3QsIHRoYXQncyB0aGUgYW1iaXRpb24sIHdlIG1heSBub3QgYmUgdGhlcmUgeWV0KS4NCisNCitAc2VjdGlvbiBzZWNfYnVpbGRpbmcgQnVpbGRpbmcgdGhlIFJ1bnRpbWUNCitGb3IgdGhlIGltcGF0aWVudCwgd2UgY292ZXIgYnVpbGRpbmcgdGhlIHJ1bnRpbWUgYXMgdGhlIGZpcnN0IHRvcGljIGhlcmUuDQorDQorQSB0b3AtbGV2ZWwgTWFrZWZpbGUgaXMgcHJvdmlkZWQgdGhhdCBhdHRlbXB0cyB0byBkZXJpdmUgYSBzdWl0YWJsZQ0KK2NvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZW52aXJvbm1lbnRzLiAgVG8gc2VlIHRoZQ0KK2RlZmF1bHQgc2V0dGluZ3MsIHR5cGU6DQorQGNvZGUNCislIG1ha2UgaW5mbw0KK0BlbmRjb2RlDQorDQorWW91IGNhbiBjaGFuZ2UgdGhlIE1ha2VmaWxlJ3MgYmVoYXZpb3Igd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6DQorDQorIC0gPGI+b21wX3Jvb3Q8L2I+OiAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0b3AtbGV2ZWwNCisgICAgICAgICAgICAgTWFrZWZpbGUuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbiB0aGUgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuDQorDQorIC0gPGI+b21wX29zPC9iPjogICAgICBPcGVyYXRpbmcgc3lzdGVtLiAgQnkgZGVmYXVsdCwgdGhlIGJ1aWxkIHdpbGwgYXR0ZW1wdCB0bw0KKyAgICAgICAgICAgICBkZXRlY3QgdGhpcy4gQ3VycmVudGx5IHN1cHBvcnRzICJsaW51eCIsICJtYWNvcyIsIGFuZA0KKyAgICAgICAgICAgICAid2luZG93cyIuDQorDQorIC0gPGI+YXJjaDwvYj46ICAgICAgICBBcmNoaXRlY3R1cmUuIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8NCisJICAgICBkZXRlY3QgdGhpcyBpZiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiBDdXJyZW50bHkgDQorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUNCisgICAgICAgICAgICAgLSAiMzIiIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgDQorICAgICAgICAgICAgIC0gIjMyZSIgZm9yIEludGVsJnJlZzsmbmJzcDs2NCBhcmNoaXRlY3R1cmUNCisgICAgICAgICAgICAgLSAibWljIiBmb3IgSW50ZWwmcmVnOyZuYnNwO01hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSAoDQorICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUNCisgICAgICAgICAgICAgY29tcGlsZXIsIGFuZCBhcHByb3ByaWF0ZSBrMW9tIGJpbnV0aWxzIHdpbGwgYmUgdXNlZC4gVGhlDQorICAgICAgICAgICAgIG5lY2Vzc2FyeSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgYnVpbGQgbWFjaGluZQ0KKyAgICAgICAgICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSwgYnV0IGFuDQorCSAgICAgSW50ZWwmcmVnOyZuYnNwO1hlb24gUGhpJnRyYWRlOyZuYnNwOw0KKyAgICAgICAgICAgICBjb3Byb2Nlc3NvciBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLg0KKw0KKyAtIDxiPmNvbXBpbGVyPC9iPjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIg0KKyAgICAgICAgICAgICBvciAiaWNsIiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIG9tcF9vcy4gQWxzbyBzdXBwb3J0cw0KKyAgICAgICAgICAgICAiZ2NjIiB3aGVuIG9tcF9vcyBpcyAibGludXgiIGZvciBnY2Ncb3RoZXIgdmVyc2lvbnMNCisgICAgICAgICAgICAgNC42LjIgYW5kIGhpZ2hlci4gRm9yIGljYyBvbiBPUyBYXG90aGVyLCBPUyBYXG90aGVyIHZlcnNpb25zIA0KKwkgICAgIGdyZWF0ZXIgdGhhbiAxMC42IGFyZSBub3Qgc3VwcG9ydGVkIGN1cnJlbnRseS4gQWxzbywgaWNjDQorCSAgICAgdmVyc2lvbiAxMy4wIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBzZWxlY3RlZCBjb21waWxlciBzaG91bGQgYmUNCisgICAgICAgICAgICAgaW5zdGFsbGVkIGFuZCBpbiB0aGUgdXNlcidzIHBhdGguIFRoZSBjb3JyZXNwb25kaW5nDQorICAgICAgICAgICAgIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguDQorDQorIC0gPGI+bW9kZTwvYj46ICAgICAgICBMaWJyYXJ5IG1vZGU6IGRlZmF1bHQgaXMgInJlbGVhc2UiLiAgQWxzbyBzdXBwb3J0cyAiZGVidWciLg0KKw0KK1RvIHVzZSBhbnkgb2YgdGhlIG9wdGlvbnMgYWJvdmUsIHNpbXBsZSBhZGQgJmx0O29wdGlvbl9uYW1lJmd0Oz0mbHQ7dmFsdWUmZ3Q7LiAgRm9yDQorZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBnY2MgaW5zdGVhZCBvZiBpY2MsIHR5cGU6DQorQGNvZGUNCislIG1ha2UgY29tcGlsZXI9Z2NjDQorQGVuZGNvZGUNCisNCitVbmRlcm5lYXRoIHRoZSBob29kIG9mIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUsIHRoZSBydW50aW1lIGlzIGJ1aWx0IGJ5DQorYSBwZXJsIHNjcmlwdCB0aGF0IGluIHR1cm4gZHJpdmVzIGEgZGV0YWlsZWQgcnVudGltZSBzeXN0ZW0gbWFrZS4gIFRoZQ0KK3NjcmlwdCBjYW4gYmUgZm91bmQgYXQgPHR0PnRvb2xzL2J1aWxkLnBsPC90dD4sIGFuZCB3aWxsIHByaW50DQoraW5mb3JtYXRpb24gYWJvdXQgYWxsIGl0cyBmbGFncyBhbmQgY29udHJvbHMgaWYgaW52b2tlZCBhcyANCitAY29kZSANCislIHRvb2xzL2J1aWxkLnBsIC0taGVscCANCitAZW5kY29kZQ0KKw0KK0lmIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHMsIGl0IHdpbGwgdHJ5IHRvIGJ1aWxkIGEgc2V0IG9mIGxpYnJhcmllcw0KK3RoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgbWFjaGluZSBvbiB3aGljaCB0aGUgYnVpbGQgaXMgaGFwcGVuaW5nLiANCitUaGVyZSBhcmUgbWFueSBvcHRpb25zIGZvciBidWlsZGluZyBvdXQgb2YgdHJlZSwgYW5kIGNvbmZpZ3VyaW5nIGxpYnJhcnkNCitmZWF0dXJlcyB0aGF0IGNhbiBhbHNvIGJlIHVzZWQuIENvbnN1bHQgdGhlIDx0dD4tLWhlbHA8L3R0PiBvdXRwdXQgZm9yIGRldGFpbHMuDQorDQorQHNlY3Rpb24gc2VjX3N1cHBvcnRlZCBTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorDQorVGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsJnJlZzsmbmJzcDsgNjQsIGFuZA0KK0ludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLiAgVGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zDQorc3VwcG9ydGVkIGFyZSBzaG93biBpbiB0aGUgdGFibGUgYmVsb3cuDQorDQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5pY2MvaWNsPHRoPmdjYw0KKzx0cj48dGQ+TGludXhcb3RoZXIgT1M8dGQ+WWVzKDEsNSk8dGQ+WWVzKDIsNCkNCis8dHI+PHRkPk9TIFhcb3RoZXI8dGQ+WWVzKDEsMyw0KTx0ZD5Obw0KKzx0cj48dGQ+V2luZG93c1xvdGhlciBPUzx0ZD5ZZXMoMSw0KTx0ZD5Obw0KKzwvdGFibGU+DQorKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwmcmVnOyZuYnNwOyA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IA0KKyAgICBhcmUgc3VwcG9ydGVkICgxMi4xIGlzIHJlY29tbWVuZGVkKS48YnI+DQorKDIpIGdjYyB2ZXJzaW9uIDQuNi4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg0KSBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLjxicj4NCisoNSkgT24gSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCBvciBsYXRlciBhcmUgcmVxdWlyZWQuDQorDQorQHNlY3Rpb24gc2VjX2Zyb250ZW5kIEZyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwNCisNCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yDQordGhpcyBSVEw6IGljYy9pY2wsIGdjYy4gIENvZGUgZ2VuZXJhdGlvbiBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwNCitsYXRlciBpbiB0aGlzIGRvY3VtZW50Lg0KKw0KK0BzZWN0aW9uIHNlY19vdXRsaW5pbmcgT3V0bGluaW5nDQorDQorVGhlIHJ1bnRpbWUgaW50ZXJmYWNlIGlzIGJhc2VkIG9uIHRoZSBpZGVhIHRoYXQgdGhlIGNvbXBpbGVyDQorIm91dGxpbmVzIiBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgYXJlIHRvIHJ1biBpbiBwYXJhbGxlbCBpbnRvIHNlcGFyYXRlDQorZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYmUgaW52b2tlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgRm9yIGluc3RhbmNlLA0KK3NpbXBsZSBjb2RlIGxpa2UgdGhpcw0KKw0KK0Bjb2RlDQordm9pZCBmb28oKQ0KK3sNCisjcHJhZ21hIG9tcCBwYXJhbGxlbA0KKyAgICB7DQorICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KKyAgICB9DQorfQ0KK0BlbmRjb2RlDQoraXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIHRoYXQgbG9va3MgY29uY2VwdHVhbGx5IGxpa2UgdGhpcyAod2hlcmUNCit0aGUgbmFtZXMgdXNlZCBhcmUgbWVyZWx5IGlsbHVzdHJhdGl2ZTsgdGhlIHJlYWwgbGlicmFyeSBmdW5jdGlvbg0KK25hbWVzIHdpbGwgYmUgdXNlZCBsYXRlciBhZnRlciB3ZSd2ZSBkaXNjdXNzZWQgc29tZSBtb3JlIGlzc3Vlcy4uLikNCisNCitAY29kZQ0KK3N0YXRpYyB2b2lkIG91dGxpbmVkRm9vQm9keSgpDQorew0KKyAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KK30NCisNCit2b2lkIGZvbygpDQorew0KKyAgICBfX09NUF9ydW50aW1lX2Zvcmsob3V0bGluZWRGb29Cb2R5LCAodm9pZCopMCk7ICAgLy8gTm90IHRoZSByZWFsIGZ1bmN0aW9uIG5hbWUhDQorfQ0KK0BlbmRjb2RlDQorDQorQHN1YnNlY3Rpb24gU0VDX1NIQVJFRFZBUlMgQWRkcmVzc2luZyBzaGFyZWQgdmFyaWFibGVzDQorDQorSW4gcmVhbCB1c2VzIG9mIHRoZSBPcGVuTVBcb3RoZXIgQVBJIHRoZXJlIGFyZSBub3JtYWxseSByZWZlcmVuY2VzIA0KK2Zyb20gdGhlIG91dGxpbmVkIGNvZGUgIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgaW4gc2NvcGUgaW4gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uIA0KK1RoZXJlZm9yZSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBtdXN0IGJlIGFibGUgdG8gYWRkcmVzcyANCit0aGVzZSB2YXJpYWJsZXMuIFRoZSBydW50aW1lIHN1cHBvcnRzIHR3byBhbHRlcm5hdGUgd2F5cyBvZiBkb2luZw0KK3RoaXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19PVCBDdXJyZW50IFRlY2huaXF1ZQ0KK1RoZSB0ZWNobmlxdWUgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5IGlzIHRvIHJlY2VpdmUNCithIHNlcGFyYXRlIHBvaW50ZXIgdG8gZWFjaCBzaGFyZWQgdmFyaWFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZnJvbQ0KK3RoZSBvdXRsaW5lZCBmdW5jdGlvbi4gIFRoaXMgaXMgd2hhdCBpcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy4NCisNCitXZSBob3BlIHNvb24gdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBpbnRlcmZhY2UgdG8gc3VwcG9ydCB0aGUNCithbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIFRoZQ0KK2FsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGhhcyBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzIGZvciBzbWFsbA0KK3BhcmFsbGVsIHJlZ2lvbnMgdGhhdCBoYXZlIG1hbnkgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX1BUIEZ1dHVyZSBUZWNobmlxdWUNCitUaGUgaWRlYSBpcyB0byB0cmVhdCB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXMgdGhvdWdoIGl0DQord2VyZSBhIGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb24sIGFuZCBwYXNzIGl0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoDQoraXMgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcmVudCdzIHN0YWNrIGZyYW1lLiBQcm92aWRlZCB0aGF0IHRoZSBjb21waWxlcg0KK2tub3dzIHRoZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBmcmFtZSB3aGVuIGl0IGlzIGdlbmVyYXRpbmcgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24gaXQgY2FuIHRoZW4gYWNjZXNzIHRoZSB1cC1sZXZlbCB2YXJpYWJsZXMgYXQgYXBwcm9wcmlhdGUNCitvZmZzZXRzIGZyb20gdGhlIHBhcmVudCBmcmFtZS4gIFRoaXMgaXMgYSBjbGFzc2ljYWwgY29tcGlsZXIgdGVjaG5pcXVlDQorZnJvbSB0aGUgMTk2MHMgdG8gc3VwcG9ydCBsYW5ndWFnZXMgbGlrZSBBbGdvbCAoYW5kIGl0cyBkZXNjZW5kYW50cykNCit0aGF0IHN1cHBvcnQgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbnMuDQorDQorVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIHRlY2huaXF1ZSBpcyB0aGF0IHRoZXJlIGlzIG5vIGNvZGUgcmVxdWlyZWQNCithdCB0aGUgZm9yayBwb2ludCB0byBtYXJzaGFsIHRoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uLg0KK1NpbmNlIHRoZSBydW50aW1lIGtub3dzIHN0YXRpY2FsbHkgaG93IG1hbnkgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZQ0KK291dGxpbmVkIGZ1bmN0aW9uLCBpdCBjYW4gZWFzaWx5IGNvcHkgdGhlbSB0byB0aGUgdGhyZWFkJ3Mgc3RhY2sNCitmcmFtZS4gIFRoZXJlZm9yZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZvcmsgY29kZSBpcyBpbmRlcGVuZGVudCBvZg0KK3RoZSBudW1iZXIgb2Ygc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSB0aGUgb3V0bGluZWQNCitmdW5jdGlvbi4NCisNCitJZiBpdCBpcyBoYXJkIHRvIGRldGVybWluZSB0aGUgc3RhY2sgbGF5b3V0IG9mIHRoZSBwYXJlbnQgd2hpbGUgZ2VuZXJhdGluZyB0aGUNCitvdXRsaW5lZCBjb2RlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcHByb2FjaCBieSBjb2xsZWN0aW5nIGFsbCBvZg0KK3RoZSB2YXJpYWJsZXMgaW4gdGhlIHBhcmVudCB0aGF0IGFyZSBhY2Nlc3NlZCBmcm9tIG91dGxpbmVkIGZ1bmN0aW9ucyBpbnRvDQorYSBzaW5nbGUgYHN0cnVjdGAgd2hpY2ggaXMgcGxhY2VkIG9uIHRoZSBzdGFjaywgYW5kIHdob3NlIGFkZHJlc3MgaXMgcGFzc2VkDQordG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9ucy4gSW4gdGhpcyB3YXkgdGhlIG9mZnNldHMgb2YgdGhlIHNoYXJlZCB2YXJpYWJsZXMNCithcmUga25vd24gKHNpbmNlIHRoZXkgYXJlIGluc2lkZSB0aGUgc3RydWN0KSB3aXRob3V0IG5lZWRpbmcgdG8ga25vdw0KK3RoZSBjb21wbGV0ZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBzdGFjay1mcmFtZS4gRnJvbSB0aGUgcG9pbnQgb2Ygdmlldw0KK29mIHRoZSBydW50aW1lIGVpdGhlciBvZiB0aGVzZSB0ZWNobmlxdWVzIGlzIGVxdWl2YWxlbnQsIHNpbmNlIGluIGVpdGhlcg0KK2Nhc2UgaXQgb25seSBoYXMgdG8gcGFzcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gdG8gYWxsb3cgDQoraXQgdG8gYWNjZXNzIHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQSBzY2hlbWUgbGlrZSB0aGlzIGlzIGhvdyBnY2Ncb3RoZXIgZ2VuZXJhdGVzIG91dGxpbmVkIGZ1bmN0aW9ucy4NCisNCitAc2VjdGlvbiBTRUNfSU5URVJGQUNFUyBMaWJyYXJ5IEludGVyZmFjZXMNCitUaGUgbGlicmFyeSBmdW5jdGlvbnMgdXNlZCBmb3Igc3BlY2lmaWMgcGFydHMgb2YgdGhlIE9wZW5NUFxvdGhlciBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbg0KK2FyZSBkb2N1bWVudGVkIGluIGRpZmZlcmVudCBtb2R1bGVzLg0KKw0KKyAtIEByZWYgQkFTSUNfVFlQRVMgZnVuZGFtZW50YWwgdHlwZXMgdXNlZCBieSB0aGUgcnVudGltZSBpbiBtYW55IHBsYWNlcw0KKyAtIEByZWYgREVQUkVDQVRFRCAgZnVuY3Rpb25zIHRoYXQgYXJlIGluIHRoZSBsaWJyYXJ5IGJ1dCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkDQorIC0gQHJlZiBTVEFSVFVQX1NIVVRET1dOIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBmaW5hbGl6aW5nIHRoZSBydW50aW1lDQorIC0gQHJlZiBQQVJBTExFTCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBgb21wIHBhcmFsbGVsYA0KKyAtIEByZWYgVEhSRUFEX1NUQVRFUyBmdW5jdGlvbnMgZm9yIHN1cHBvcnRpbmcgdGhyZWFkIHN0YXRlIGlucXVpcmllcw0KKyAtIEByZWYgV09SS19TSEFSSU5HIGZ1bmN0aW9ucyBmb3Igd29yayBzaGFyaW5nIGNvbnN0cnVjdHMgc3VjaCBhcyBgb21wIGZvcmAsIGBvbXAgc2VjdGlvbnNgDQorIC0gQHJlZiBUSFJFQURQUklWQVRFIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRocmVhZCBwcml2YXRlIGRhdGEsIGNvcHlpbiBldGMNCisgLSBAcmVmIFNZTkNIUk9OSVpBVElPTiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBgb21wIGNyaXRpY2FsYCwgYG9tcCBiYXJyaWVyYCwgYG9tcCBtYXN0ZXJgLCByZWR1Y3Rpb25zIGV0Yw0KKyAtIEByZWYgQVRPTUlDX09QUyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBhdG9taWMgb3BlcmF0aW9ucw0KKyAtIERvY3VtZW50YXRpb24gb24gdGFza2luZyBoYXMgc3RpbGwgdG8gYmUgd3JpdHRlbi4uLg0KKw0KK0BzZWN0aW9uIFNFQ19FWEFNUExFUyBFeGFtcGxlcw0KK0BzdWJzZWN0aW9uIFNFQ19XT1JLU0hBUklOR19FWEFNUExFIFdvcmsgU2hhcmluZyBFeGFtcGxlDQorVGhpcyBleGFtcGxlIHNob3dzIHRoZSBjb2RlIGdlbmVyYXRlZCBmb3IgYSBwYXJhbGxlbCBmb3Igd2l0aCByZWR1Y3Rpb24gYW5kIGR5bmFtaWMgc2NoZWR1bGluZy4NCisNCitAY29kZQ0KK2V4dGVybiBmbG9hdCBmb28oIHZvaWQgKTsNCisNCitpbnQgbWFpbiAoKSB7DQorICAgIGludCBpOyANCisgICAgZmxvYXQgciA9IDAuMDsgDQorICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljKSByZWR1Y3Rpb24oKzpyKSANCisgICAgZm9yICggaSA9IDA7IGkgPCAxMDsgaSArKyApIHsNCisgICAgICAgIHIgKz0gZm9vKCk7IA0KKyAgICB9DQorfQ0KK0BlbmRjb2RlDQorDQorVGhlIHRyYW5zZm9ybWVkIGNvZGUgbG9va3MgbGlrZSB0aGlzLg0KK0Bjb2RlDQorZXh0ZXJuIGZsb2F0IGZvbyggdm9pZCApOyANCisNCitpbnQgbWFpbiAoKSB7DQorICAgIHN0YXRpYyBpbnQgemVybyA9IDA7IA0KKyAgICBhdXRvIGludCBndGlkOyANCisgICAgYXV0byBmbG9hdCByID0gMC4wOyANCisgICAgX19rbXBjX2JlZ2luKCAmIGxvYzMsIDAgKTsgDQorICAgIC8vIFRoZSBndGlkIGlzIG5vdCBhY3R1YWxseSByZXF1aXJlZCBpbiB0aGlzIGV4YW1wbGUgc28gY291bGQgYmUgb21pdHRlZDsNCisgICAgLy8gV2Ugc2hvdyBpdHMgaW5pdGlhbGl6YXRpb24gaGVyZSBiZWNhdXNlIGl0IGlzIG9mdGVuIHJlcXVpcmVkIGZvciBjYWxscyBpbnRvDQorICAgIC8vIHRoZSBydW50aW1lIGFuZCBzaG91bGQgYmUgbG9jYWxseSBjYWNoZWQgbGlrZSB0aGlzLg0KKyAgICBndGlkID0gX19rbXBjX2dsb2JhbCB0aHJlYWQgbnVtKCAmIGxvYzMgKTsgDQorICAgIF9fa21wY19mb3JrIGNhbGwoICYgbG9jNywgMSwgbWFpbl83X3BhcmFsbGVsXzMsICYgciApOyANCisgICAgX19rbXBjX2VuZCggJiBsb2MwICk7IA0KKyAgICByZXR1cm4gMDsgDQorfQ0KKw0KK3N0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgeyBmbG9hdCByXzEwX3JwcjsgfTsgDQorDQorc3RhdGljIGttcF9jcml0aWNhbF9uYW1lIGxjayA9IHsgMCB9Ow0KK3N0YXRpYyBpZGVudF90IGxvYzEwOyAvLyBsb2MxMC5mbGFncyBzaG91bGQgY29udGFpbiBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSBiaXQgc2V0IA0KKyAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb21waWxlciBoYXMgZ2VuZXJhdGVkIGFuIGF0b21pYyByZWR1Y3Rpb24uDQorDQordm9pZCBtYWluXzdfcGFyYWxsZWxfMyggaW50ICpndGlkLCBpbnQgKmJ0aWQsIGZsb2F0ICpyXzdfc2hwICkgew0KKyAgICBhdXRvIGludCBpXzdfcHI7IA0KKyAgICBhdXRvIGludCBsb3dlciwgdXBwZXIsIGxpdGVyLCBpbmNyOyANCisgICAgYXV0byBzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81IHJlZHVjZTsgDQorICAgIHJlZHVjZS5yXzEwX3JwciA9IDAuRjsgDQorICAgIGxpdGVyID0gMDsgDQorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzQoICYgbG9jNywqZ3RpZCwgMzUsIDAsIDksIDEsIDEgKTsgDQorICAgIHdoaWxlICggX19rbXBjX2Rpc3BhdGNoX25leHRfNCggJiBsb2M3LCAqZ3RpZCwgJiBsaXRlciwgJiBsb3dlciwgJiB1cHBlciwgJiBpbmNyICkgKSB7DQorICAgICAgICBmb3IoIGlfN19wciA9IGxvd2VyOyB1cHBlciA+PSBpXzdfcHI7IGlfN19wciArKyApIA0KKyAgICAgICAgICByZWR1Y2Uucl8xMF9ycHIgKz0gZm9vKCk7IA0KKyAgICB9DQorICAgIHN3aXRjaCggX19rbXBjX3JlZHVjZV9ub3dhaXQoICYgbG9jMTAsICpndGlkLCAxLCA0LCAmIHJlZHVjZSwgbWFpbl8xMF9yZWR1Y2VfNSwgJiBsY2sgKSApIHsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICpyXzdfc2hwICs9IHJlZHVjZS5yXzEwX3JwcjsNCisgICAgICAgICAgIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCggJiBsb2MxMCwgKmd0aWQsICYgbGNrICk7DQorICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCggJiBsb2MxMCwgKmd0aWQsIHJfN19zaHAsIHJlZHVjZS5yXzEwX3JwciApOw0KKyAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0OjsNCisgICAgfQ0KK30gDQorDQordm9pZCBtYWluXzEwX3JlZHVjZV81KCBzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81ICpyZWR1Y2VfbGhzLCANCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgKnJlZHVjZV9yaHMgKSANCit7IA0KKyAgICByZWR1Y2VfbGhzLT5yXzEwX3JwciArPSByZWR1Y2VfcmhzLT5yXzEwX3JwcjsgDQorfQ0KK0BlbmRjb2RlDQorDQorQGRlZmdyb3VwIEJBU0lDX1RZUEVTIEJhc2ljIFR5cGVzDQorVHlwZXMgdGhhdCBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBydW50aW1lLg0KKw0KK0BkZWZncm91cCBERVBSRUNBVEVEIERlcHJlY2F0ZWQgRnVuY3Rpb25zDQorRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LCBhbmQNCitzaG91bGQgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUuDQorDQorQGRlZmdyb3VwIFNUQVJUVVBfU0hVVERPV04gU3RhcnR1cCBhbmQgU2h1dGRvd24NCitUaGVzZSBmdW5jdGlvbnMgYXJlIGZvciBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93bi4NCisNCitAZGVmZ3JvdXAgUEFSQUxMRUwgUGFyYWxsZWwgKGZvcmsvam9pbikNCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyA8dHQ+XCNwcmFnbWEgb21wIHBhcmFsbGVsPC90dD4uDQorDQorQGRlZmdyb3VwIFRIUkVBRF9TVEFURVMgVGhyZWFkIEluZm9ybWF0aW9uDQorVGhlc2UgZnVuY3Rpb25zIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQuDQorDQorQGRlZmdyb3VwIFdPUktfU0hBUklORyBXb3JrIFNoYXJpbmcNCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyANCis8dHQ+XCNwcmFnbWEgb21wIGZvcjwvdHQ+LCA8dHQ+XCNwcmFnbWEgb21wIHNlY3Rpb25zPC90dD4sIDx0dD5cI3ByYWdtYSBvbXAgc2luZ2xlPC90dD4gYW5kIA0KKzx0dD5cI3ByYWdtYSBvbXAgbWFzdGVyPC90dD4gY29uc3RydWN0cy4gDQorDQorV2hlbiBoYW5kbGluZyBsb29wcywgdGhlcmUgYXJlIGRpZmZlcmVudCBmdW5jdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQgMzIgYW5kIDY0IGJpdCBpbnRlZ2VyIHR5cGVzDQord2hpY2ggaGF2ZSB0aGUgbmFtZSBzdWZmaXhlcyBgXzRgLCBgXzR1YCwgYF84YCBhbmQgYF84dWAuIFRoZSBzZW1hbnRpY3Mgb2YgZWFjaCBvZiB0aGUgZnVuY3Rpb25zIGlzIHRoZSBzYW1lLA0KK3NvIHRoZXkgYXJlIG9ubHkgZGVzY3JpYmVkIG9uY2UuDQorDQorU3RhdGljIGxvb3Agc2NoZWR1bGluZyBpcyBoYW5kbGVkIGJ5ICBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNCBhbmQgZnJpZW5kcy4gT25seSBhIHNpbmdsZSBjYWxsIGlzIG5lZWRlZCwNCitzaW5jZSB0aGUgaXRlcmF0aW9ucyB0byBiZSBleGVjdXRlZCBieSBhbnkgZ2l2ZSB0aHJlYWQgY2FuIGJlIGRldGVybWluZWQgYXMgc29vbiBhcyB0aGUgbG9vcCBwYXJhbWV0ZXJzIGFyZSBrbm93bi4NCisNCitEeW5hbWljIHNjaGVkdWxpbmcgaXMgaGFuZGxlZCBieSB0aGUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80IGFuZCBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQgZnVuY3Rpb25zLiANCitUaGUgaW5pdCBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBpbiBlYWNoIHRocmVhZCBvdXRzaWRlIHRoZSBsb29wLCB3aGlsZSB0aGUgbmV4dCBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaA0KK3RpbWUgdGhhdCB0aGUgcHJldmlvdXMgY2h1bmsgb2Ygd29yayBoYXMgYmVlbiBleGhhdXN0ZWQuIA0KKw0KK0BkZWZncm91cCBTWU5DSFJPTklaQVRJT04gU3luY2hyb25pemF0aW9uDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgYmFycmllcnMuDQorDQorQGRlZmdyb3VwIFRIUkVBRFBSSVZBVEUgVGhyZWFkIHByaXZhdGUgZGF0YSBzdXBwb3J0DQorVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgY29weWluL291dCBhbmQgdGhyZWFkIHByaXZhdGUgZGF0YS4NCisNCitAZGVmZ3JvdXAgVEFTS0lORyBUYXNraW5nIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBhcmUgdXNlZCB0byBpbXBsZW1lbnQgdGFza2luZyBjb25zdHJ1Y3RzLg0KKw0KKyovDQorDQpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0IGIvcmMxL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjk5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMzcgQEAKK3NldChPTVBfU0hMSUJFWFQgIiR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSIpCisKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICJkYXRlIiAiKyVZLSVtLSVkICVIOiVNOiVTIiBPVVRQVVRfVkFSSUFCTEUgQlVJTERfVElNRSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJcbiIgIiIgQlVJTERfVElNRSAke0JVSUxEX1RJTUV9KQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAuCisgIGluY2x1ZGUKKyAgaW5jbHVkZS8ke09NUF9WRVJTSU9OfQorICBpMThuCisgIHRoaXJkcGFydHkvaXR0bm90aWZ5CisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorKQorCitpZihXSU4zMikKKyAgc2V0KE9TX0dFTiAid2luIikKK2Vsc2VpZihBUFBMRSkKKyAgc2V0KE9TX0dFTiAibWFjIikKK2Vsc2VpZihVTklYKQorICBzZXQoT1NfR0VOICJsaW4iKQorZWxzZSgpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIE9TIikKK2VuZGlmKCkKKworaWYoIiR7QVJDSH0iIFNUUkVRVUFMICIiKQorICBzZXQoQVJDSCAiMzJlIikKK2VuZGlmKCkKKworc2V0KEFSQ0hfU1RSICJJbnRlbChSKSA2NCIpCisKK3NldChGRUFUVVJFX0ZMQUdTICItRCBVU0VfSVRUX0JVSUxEIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIE5ERUJVRyIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfQVJDSF9TVFI9XCJcXFwiJHtBUkNIX1NUUn1cXFwiXCIiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgX0dOVV9TT1VSQ0UiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgX1JFRU5UUkFOVCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfVVNFX0FTU0VSVCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBCVUlMRF9JOCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBCVUlMRF9UViIpCitpZihBUFBMRSkKKyAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gLWN1cnJlbnRfdmVyc2lvbiA1LjAiKQorICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSAtY29tcGF0aWJpbGl0eV92ZXJzaW9uIDUuMCIpCitlbmRpZigpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfTElCUkFSWV9GSUxFPVxcXCJsaWJpb21wNS4ke09NUF9TSExJQkVYVH1cXFwiIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9WRVJTSU9OX01BSk9SPSR7VkVSU0lPTn0iKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgQ0FDSEVfTElORT02NCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfQURKVVNUX0JMT0NLVElNRT0xIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEJVSUxEX1BBUkFMTEVMX09SREVSRUQiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgS01QX0FTTV9JTlRSSU5TIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIFVTRV9MT0FEX0JBTEFOQ0UiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgVVNFX0NCTEtEQVRBIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEdVSURFRExMX0VYUE9SVFMiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgS01QX0dPTVBfQ09NUEFUIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9VU0VfQURBUFRJVkVfTE9DS1M9MSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1M9MCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBPTVBfNTBfRU5BQkxFRD0wIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIE9NUF80MV9FTkFCTEVEPTAiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgT01QXzQwX0VOQUJMRUQ9MSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBPTVBfMzBfRU5BQkxFRD0xIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIFVTRV9JVFRfTk9USUZZPTEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgSU5URUxfSVRUTk9USUZZX1BSRUZJWD1fX2ttcF9pdHRfIikKK2lmIChOT1QgQVBQTEUpCisgIHNldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9UREFUQV9HVElEIikKK2VuZGlmKCkKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIF9LTVBfQlVJTERfVElNRT1cIlxcXCIke0JVSUxEX1RJTUV9IFVUQ1xcXCJcIiIpCisKK3NldChDT01NT05fRkxBR1MgIi1mUElDIikKK3NldChDT01NT05fRkxBR1MgIiR7Q09NTU9OX0ZMQUdTfSAtV25vLXVudXNlZC12YWx1ZSIpCitzZXQoQ09NTU9OX0ZMQUdTICIke0NPTU1PTl9GTEFHU30gLVduby1zd2l0Y2giKQorc2V0KENPTU1PTl9GTEFHUyAiJHtDT01NT05fRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitzZXQoQ09NTU9OX0ZMQUdTICIke0NPTU1PTl9GTEFHU30gLWZuby1leGNlcHRpb25zIikKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7RkVBVFVSRV9GTEFHU30gJHtDT01NT05fRkxBR1N9IikKK3NldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICR7RkVBVFVSRV9GTEFHU30gJHtDT01NT05fRkxBR1N9IikKKworc2V0KEFTTV9TT1VSQ0VTCisgIHpfTGludXhfYXNtLnMKKykKK3NldChTT1VSQ0VTCisgIHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYworICBrbXBfYWZmaW5pdHkuY3BwCisgIGttcF9hbGxvYy5jCisgIGttcF9hdG9taWMuYworICBrbXBfY2FuY2VsLmNwcAorICBrbXBfY3N1cHBvcnQuYworICBrbXBfZGVidWcuYworICBrbXBfZGlzcGF0Y2guY3BwCisgIGttcF9lbnZpcm9ubWVudC5jCisgIGttcF9lcnJvci5jCisgIGttcF9mdG5fY2RlY2wuYworICBrbXBfZnRuX2V4dHJhLmMKKyAga21wX2dsb2JhbC5jCisgIGttcF9nc3VwcG9ydC5jCisgIGttcF9pMThuLmMKKyAga21wX2lvLmMKKyAga21wX2l0dC5jCisgIGttcF9sb2NrLmNwcAorICBrbXBfcnVudGltZS5jCisgIGttcF9zY2hlZC5jcHAKKyAga21wX3NldHRpbmdzLmMKKyAga21wX3N0ci5jCisgIGttcF90YXNrZGVwcy5jcHAKKyAga21wX3Rhc2tpbmcuYworICBrbXBfdGFza3EuYworICBrbXBfdGhyZWFkcHJpdmF0ZS5jCisgIGttcF91dGlsaXR5LmMKKyAga21wX3ZlcnNpb24uYworICB6X0xpbnV4X3V0aWwuYworKQorCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtTT1VSQ0VTfSBQUk9QRVJUSUVTIExBTkdVQUdFIENYWCkKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0FTTV9TT1VSQ0VTfSBQUk9QRVJUSUVTIExBTkdVQUdFIENYWCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQga21wX2kxOG5faWQuaW5jCisgICAgQ09NTUFORCBwZXJsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbCAtLW9zPSR7T1NfR0VOfSAtLWFyY2g9JHtBUkNIfSAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09a21wX2kxOG5faWQuaW5jICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pMThuL2VuX1VTLnR4dAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQga21wX2kxOG5fZGVmYXVsdC5pbmMKKyAgICBDT01NQU5EIHBlcmwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsIC0tb3M9JHtPU19HRU59IC0tYXJjaD0ke0FSQ0h9IC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD1rbXBfaTE4bl9kZWZhdWx0LmluYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaTE4bi9lbl9VUy50eHQKKykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUIG9tcC5oCisgICAgQ09NTUFORCBwZXJsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi90b29scy9leHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBSZXZpc2lvbj1cIlxcJCRSZXZpc2lvblwiIC1EIERhdGU9XCJcXCQkRGF0ZVwiIC1EIEtNUF9UWVBFPVwiUGVyZm9ybWFuY2VcIiAtRCBLTVBfQVJDSD1cIlxcXCIke0FSQ0hfU1RSfVxcXCJcIiAtRCBLTVBfVkVSU0lPTl9NQUpPUj0ke1ZFUlNJT059IC1EIEtNUF9WRVJTSU9OX01JTk9SPTAgLUQgS01QX1ZFUlNJT05fQlVJTEQ9MDAwMDAwMDAgLUQgS01QX0JVSUxEX0RBVEU9XCIke0JVSUxEX1RJTUV9IFVUQ1wiIC1EIEtNUF9UQVJHRVRfQ09NUElMRVI9MTIgLUQgS01QX0RJQUc9MCAtRCBLTVBfREVCVUdfSU5GTz0wIC1EIE9NUF9WRVJTSU9OPSR7T01QX1ZFUlNJT059ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlLyR7T01QX1ZFUlNJT05fTlVNfS9vbXAuaC52YXIgb21wLmgKKykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUIHpfTGludXhfYXNtLm8KKyAgICBDT01NQU5EICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSAtYyAtbyB6X0xpbnV4X2FzbS5vIC1EIEtNUF9BU01fSU5UUklOUyAtRCBLTVBfR09NUF9DT01QQVQgLUQgS01QX0FSQ0hfWDg2XzY0IC14IGFzc2VtYmxlci13aXRoLWNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtBU01fU09VUkNFU30KKykKKworYWRkX2N1c3RvbV90YXJnZXQoZ2VuX2ttcF9pMThuIERFUEVORFMga21wX2kxOG5faWQuaW5jIGttcF9pMThuX2RlZmF1bHQuaW5jIG9tcC5oIHpfTGludXhfYXNtLm8pCisKK2lmKE5PVCBBUFBMRSkKKyAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHBvcnRzX3NvLnR4dCIpCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KGlvbXA1IFNIQVJFRCAke1NPVVJDRVN9IHpfTGludXhfYXNtLm8pCithZGRfZGVwZW5kZW5jaWVzKGlvbXA1IGdlbl9rbXBfaTE4bikKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9kZWZzLm1rIGIvcmMxL3J1bnRpbWUvc3JjL2RlZnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYTJiZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9kZWZzLm1rCkBAIC0wLDAgKzEsNjUgQEAKKyMgZGVmcy5taworIyAkUmV2aXNpb246IDQyMDYxICQKKyMgJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBjb21tb24gZm9yIE9wZW5NUCBSVEwgYW5kIERTTCBtYWtlZmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSW5jbHVkZSByZWFsbHkgY29tbW9uIGRlZmluaXRpb25zLgoraW5jbHVkZSAkKExJQk9NUF9XT1JLKXRvb2xzL3NyYy9jb21tb24tZGVmcy5taworCisjCisjIERpcmVjdG9yaWVzLgorIworCisjIENoZWNrIGFuZCBub3JtYWxpemUgTElCT01QX0VYUE9SVFMuCitpZmVxICIkKExJQk9NUF9FWFBPUlRTKSIgIiIKKyAgICAkKGVycm9yIExJQk9NUF9FWFBPUlRTIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0KQorZW5kaWYKK2lmbmVxICIkKHdvcmRzICQoTElCT01QX0VYUE9SVFMpKSIgIjEiCisgICAgJChlcnJvciBMSUJPTVBfRVhQT1JUUyBtdXN0IG5vdCBjb250YWluIHNwYWNlcykKK2VuZGlmCitvdmVycmlkZSBMSUJPTVBfRVhQT1JUUyA6PSAkKHN1YnN0IFwsLywkKExJQk9NUF9FWFBPUlRTKSkKK2lmZXEgIiQoZmlsdGVyICUvLCQoTElCT01QX0VYUE9SVFMpKSIgIiIKKyAgICBvdmVycmlkZSBMSUJPTVBfRVhQT1JUUyA6PSAkKExJQk9NUF9FWFBPUlRTKS8KK2VuZGlmCisjIE91dHB1dCBkaXJlY3Rvcmllcy4KK291dF9kaXIgICAgICA9ICQoTElCT01QX0VYUE9SVFMpCitvdXRfY21uX2RpciAgPSAkKG91dF9kaXIpY29tbW9uJChzdWZmaXgpLworb3V0X3B0Zl9kaXIgID0gJChvdXRfZGlyKSQocGxhdGZvcm0pJChzdWZmaXgpLworX291dF9saWJfZGlyID0gJChvdXRfZGlyKSQoMSkkKHN1ZmZpeCkvbGliJChpZiAkKGZpbHRlciBtYWNfJSwkKDEpKSwudGhpbikvCitvdXRfbGliX2RpciAgPSAkKGNhbGwgX291dF9saWJfZGlyLCQocGxhdGZvcm0pKQorb3V0X2wxMG5fZGlyID0gJChvdXRfbGliX2RpcikkKGlmICQoZmlsdGVyIGxpbiBtYWMsJChvcykpLGxvY2FsZS8pCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBfb3V0X2xpYl9mYXRfZGlyID0gJChvdXRfZGlyKSQoMSkkKHN1ZmZpeCkvbGliLworICAgIG91dF9saWJfZmF0X2RpciAgPSAkKGNhbGwgX291dF9saWJfZmF0X2RpciwkKHBsYXRmb3JtKSkKKyAgICBvdXRfbDEwbl9mYXRfZGlyID0gJChvdXRfbGliX2ZhdF9kaXIpbG9jYWxlLworZW5kaWYKKworIworIyBSZXRyaWV2ZSBidWlsZCBudW1iZXIsCisjCisKK2lmZXEgIiQoY2xlYW4pIiAiIgorICAgICMgUGFyc2Uga21wX3ZlcnNpb24uYyBmaWxlLCBsb29rIGZvciAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCB5eXl5bW1kZCIgc3RyaW5nLAorICAgICMgbGVhdmUgb25seSAieXl5eW1tZGQiLiBOb3RlOiBTcGFjZSBhZnRlciAkJDEgaXMgaW1wb3J0YW50LCBpdCBoZWxwcyB0byBkZXRlY3QgcG9zc2libGUgZXJyb3JzLgorICAgIGJ1aWxkIDo9ICQoc3RyaXAgJChzaGVsbCAkKHBlcmwpIC1wIC1lICckJF8gPX4gc3teKD86XHMqXCNkZWZpbmVccytLTVBfVkVSU0lPTl9CVUlMRFxzKyhbMC05XXs4fSl8LiopXHMqXG59eyQkMSB9JyAkKExJQk9NUF9XT1JLKXNyYy9rbXBfdmVyc2lvbi5jKSkKKyAgICBpZm5lcSAiJCh3b3JkcyAkKGJ1aWxkKSkiICIxIgorICAgICAgICAkKGVycm9yIEZhaWxlZCB0byBwYXNlICJrbXBfdmVyc2lvbi5jIiwgY2Fubm90IGV4dHJhY3QgYnVpbGQgbnVtYmVyKQorICAgIGVuZGlmCisgICAgJChjYWxsIHNheSxCdWlsZCAgOiAkKGJ1aWxkKSQoaWYgJChmaWx0ZXIgMDAwMDAwMDAsJChidWlsZCkpLCAoZGV2ZWxvcG1lbnQpKSkKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMgYi9yYzEvcnVudGltZS9zcmMvZGxsZXhwb3J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlmMWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKQEAgLTAsMCArMSw5MTUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZXByZWNhdGVkIGVudHJ5IHBvaW50cyAobnVtYmVycyBhcmUgcmVzZXJ2ZWQpOgorLSBfX2ttcGNfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgICAgICAxMDkKKy0gX19rbXBjX2VuZF9iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgMTIyCistIF9fa21wY19mb3JfaW5pdF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMQorLSBfX2ttcGNfZm9yX2luaXRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzIKKy0gX19rbXBjX2Zvcl9uZXh0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMzCistIF9fa21wY19mb3JfbmV4dF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzNAorLSBfX2ttcGNfZm9ya19jYWxsX2JvdW5kICAgICAgICAgICAgICAgICAgICAxMzkKKy0gX19rbXBjX3JlZHVjZV9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgICAgMTQ5CistIF9fa21wY19vbXBfdGFza19iZWdpbiAgICAgICAgICAgICAgICAgICAgIDE5NAorLSBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUgICAgICAgICAgICAgICAgICAxOTUKKy0ga21wY19zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjE4CistIGttcGNfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIDIxOQorLSBrbXBjX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMjAKKy0ga21wY19zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgMjIxCistIGttcGNfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgIDIyMworLSBtcGFpNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAKKy0gbXBhaThhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAxCistIG1wYXI0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMgorLSBtcGFyOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMKKy0gbXBheDR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0CistIG1wYXg4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNQorLSBtcG9iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDYKKy0gbXBvZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3CistIG1wb2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOAorLSBtcG9mcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDkKKy0gbXBvam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwCistIG1wb3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMQorLSBtcHBhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKy0gbXBwYWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEzCistIG1wcGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNAorLSBtcHBiZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTUKKy0gbXBwZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE2CistIG1wcGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNworLSBtcHBkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTgKKy0gbXBwZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE5CistIG1wcGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMAorLSBtcHBlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjEKKy0gbXBwZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIyCistIG1wcGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMworLSBtcHBlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjQKKy0gbXBwZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI1CistIG1wcGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNgorLSBtcHBlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjcKKy0gbXBwZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI4CistIG1wcGZrdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOQorLSBtcHBmb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKKy0gbXBwZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMxCistIG1wcGlvYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMgorLSBtcHBpd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzMKKy0gbXBwam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM0CistIG1wcG50aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNQorLSBtcHBwcWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzYKKy0gbXBwcHFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM3CistIG1wcHBxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOAorLSBtcHB0aWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzkKKy0gbXBwdHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQwCistIG1wcHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MQorLSBtcHB0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDIKKy0gbXBwdnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQzCistIG1wcHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NAorLSBtcHB4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDUKKy0gbXBweG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ2CistIG1wcHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NworLSBtcHB4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDgKKy0gbXBweHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ5CistIG1wcHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MAorLSBtcHB4dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTEKKy0gbXBzYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUyCistIG1wc2NwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NworLSBtcHNlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTMKKy0gbXBzZXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU0CistIG1wc2ZkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NQorLSBtcHNmZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTYKKy0gbXBzaWQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU3CistIG1wc2lkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OAorLSBtcHNuZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTkKKy0gbXBzbmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYwCistIG1wc29udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MQorLSBtcHNyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjIKKy0gbXBzdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYzCistIG1wc3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NAorLSBtcHN4cmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjUKKy0gbXB0YWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY2CistIG1wdGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NworLSBtcHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjgKKy0gbXB0ZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY5CistIG1wdGRpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MAorLSBtcHRkaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzEKKy0gbXB0ZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcyCistIG1wdGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MworLSBtcHRkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzQKKy0gbXB0ZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc1CistIG1wdGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NgorLSBtcHRlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcKKy0gbXB0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc4CistIG1wdGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OQorLSBtcHRlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODAKKy0gbXB0ZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgxCistIG1wdGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MgorLSBtcHRwcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODMKKy0gbXB0cHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg0CistIG1wdHBwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NQorLSBtcHR0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODYKKy0gbXB0dHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg3CistIG1wdHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OAorLSBtcHR2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODkKKy0gbXB0eGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkwCistIG1wdHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MQorLSBtcHR4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTIKKy0gbXB0eG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkzCistIG1wdHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NAorLSBtcHR4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTUKKy0gbXBwY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2CistIGZ0bl9zZXRfbGlicmFyeV9nYW5nICAgICAgICAgICAgICAgICAgICAgIDczNgorLSBrbXBfc2V0X2xpYnJhcnlfZ2FuZworLSBrbXBfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjAKKy0ga21wX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgNzYxCistIGttcF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MgorLSBrbXBfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICA3NjMKKy0ga21wX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgNzY0CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k0ICAgICAgICAgICAgICAgIDc2NQorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pOCAgICAgICAgICAgICAgICA3NjYKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjQgICAgICAgICAgICAgICAgNzY3CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I4ICAgICAgICAgICAgICAgIDc2OAorLSBrbXBfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgICAgICA3NzAKKy0ga21wX2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgICAgICAgNzcxCistIGttcF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICAgICAgIDc3MgorLSBrbXBfbmVzdF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICA3NzMKKy0ga21wX25lc3RfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgNzc0CistIGttcF9uZXN0X2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgIDc3NQorLSBrbXBfZ2V0X3Byb2Nlc3NfbnVtICAgICAgICAgICAgICAgICAgICAgICA3ODEKKy0ga21wX2dldF9udW1fcHJvY2Vzc2VzICAgICAgICAgICAgICAgICAgICAgNzgyCistIGttcF9nZXRfcHJvY2Vzc190aHJlYWRfbnVtICAgICAgICAgICAgICAgIDc4MworLSBrbXBfcHJpdmF0ZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgICA3ODQgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgNzg1ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9wcml2YXRlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgIDc4NiAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICA3ODcgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX2lzX3NoYXJhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg4ICAgIyBub3QgaW1wbGVtZW50ZWQ/CisKKyVpZm5kZWYgc3R1YgorCisKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgIyBhcHBlYXIgaW4gYSBiYWNrdHJhY2Ugb2YgYSB0aHJlYWQgd2hpY2ggaXMgYmxvY2tlZCBpbiB0aGUgUlRMLgorICAgICMKKworICAgICMgUmVndWxhciBlbnRyeSBwb2ludHMKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfOAorICAgICAgICBfX2ttcF93YWl0X3NsZWVwCisgICAgICAgIF9fa21wX2ZvcmtfY2FsbAorICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisgICAgICAgIF9fa21wX3JlbGVhc2UKKyAgICAgICAgX19rbXBfbGF1bmNoX21vbml0b3IKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcgorICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IKKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXIKKyAgICAgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaworCisgICAgJWlmZGVmIEtNUF9ERUJVRworICAgICAgICAjIGFsbG93cyBjb25zb2xlIG91dHB1dCBjYXBhYmlsaXR5IGZvciBhcHBsaWNhdGlvbnMgdGhvc2UgZG9uJ3QgaGF2ZSBpdAorICAgICAgICBfX2ttcF9wcmludGYKKyAgICAlZW5kaWYKKworCisKKyAgICAgICAgIyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uOgorICAgICAgICBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ICAgIERBVEEKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeSAgICAgICAgICBEQVRBCisgICAgICAgICVpZmRlZiBtc3ZjX2NvbXBhdAorICAgICAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgIERBVEEKKyAgICAgICAgJWVuZGlmCisKKyMgICAgVlRfZ2V0dGhpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgdnRndGhpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworICAgIF9fa21wY19hdG9taWNfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMDAKKyAgICBfX2ttcGNfYXRvbWljXzggICAgICAgICAgICAgICAgICAgICAgICAgMTAxCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkICAgICAgICAgICAgICAgIDEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZCAgICAgICAgICAgICAgICAxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICAgICAgMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkICAgICAgICAgICAgICAgIDEwNQorICAgIF9fa21wY19iYXJyaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAxMDYKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXIgICAgICAgICAgICAgICAgICAgMTA3CisgICAgX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCAgICAgICAgICAgIDEwOAorICAgIF9fa21wY19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAKKyAgICBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgMTExCisgICAgX19rbXBjX2JvdW5kX3RocmVhZF9udW0gICAgICAgICAgICAgICAgIDExMgorICAgIF9fa21wY19jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgICAgICAxMTMKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV80ICAgICAgICAgICAgICAgICAgMTE0CisgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCAgICAgICAgICAgICAgICAgIDExNQorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzQgICAgICAgICAgICAgICAgICAxMTYKKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84ICAgICAgICAgICAgICAgICAgMTE3CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfNCAgICAgICAgICAgICAgICAgIDExOAorICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzggICAgICAgICAgICAgICAgICAxMTkKKyAgICBfX2ttcGNfZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwCisgICAgX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgIDEyMQorICAgIF9fa21wY19lbmRfY3JpdGljYWwgICAgICAgICAgICAgICAgICAgICAxMjMKKyAgICBfX2ttcGNfZW5kX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgMTI0CisgICAgX19rbXBjX2VuZF9vcmRlcmVkICAgICAgICAgICAgICAgICAgICAgIDEyNQorICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgICAgICAxMjYKKyAgICBfX2ttcGNfZW5kX3NpbmdsZSAgICAgICAgICAgICAgICAgICAgICAgMTI3CisgICAgX19rbXBjX2VuZF90YXNrcSAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorICAgIF9fa21wY19lbmRfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAxMjkKKyAgICBfX2ttcGNfZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwCisgICAgX19rbXBjX2Zvcl9zdGF0aWNfZmluaSAgICAgICAgICAgICAgICAgIDEzNQorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNCAgICAgICAgICAgICAgICAxMzYKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzggICAgICAgICAgICAgICAgMTM3CisgICAgX19rbXBjX2ZvcmtfY2FsbCAgICAgICAgICAgICAgICAgICAgICAgIDEzOAorICAgIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAxNDAKKyAgICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICAgICAgICAgICAgICAgMTQxCisgICAgX19rbXBjX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgIDE0MgorICAgIF9fa21wY19pbnZva2VfdGFza19mdW5jICAgICAgICAgICAgICAgICAxNDMKKyAgICBfX2ttcGNfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0CisgICAgX19rbXBjX29rX3RvX2ZvcmsgICAgICAgICAgICAgICAgICAgICAgIDE0NQorICAgIF9fa21wY19vcmRlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAxNDYKKyAgICBfX2ttcGNfcG9wX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgMTQ3CisgICAgX19rbXBjX3B1c2hfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgIDE0OAorICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgICAgICAxNTAKKyAgICBfX2ttcGNfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUxCisgICAgX19rbXBjX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MgorICAgIF9fa21wY190YXNrX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAxNTMKKyAgICBfX2ttcGNfdGFza3EgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU0CisgICAgX19rbXBjX3Rhc2txX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgIDE1NQorICAgIF9fa21wY190aHJlYWRwcml2YXRlICAgICAgICAgICAgICAgICAgICAxNTYKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgICAgICAgICAgICAgMTU3CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIgICAgICAgICAgIDE1OAorICAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyAgICAgICAxNTkKKyMgICAgX19rbXBjX3NzcF9iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgIDE2MAorIyAgICBfX2ttcGNfc3NwX2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgMTYxCisjICAgIF9fa21wY19zc3BfZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAxNjIKKyMgICAgX19rbXBjX3NzcF9wb3N0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2MworIyAgICBfX2ttcGNfc3NwX3Bvc3RfOCAgICAgICAgICAgICAgICAgICAgICAgMTY0CisjICAgIF9fa21wY19zc3Bfd2FpdF80ICAgICAgICAgICAgICAgICAgICAgICAxNjUKKyMgICAgX19rbXBjX3NzcF93YWl0XzggICAgICAgICAgICAgICAgICAgICAgIDE2NgorIyAgICBfX2ttcGNfc3NwX2Rpc3RhbmNlXzQgICAgICAgICAgICAgICAgICAgMTY3CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfOCAgICAgICAgICAgICAgICAgICAxNjgKKyMgICAgX19rbXBjX2luX3NzcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OQorIyAgICBfX2ttcGNfc3NwX3RocmVhZF9udW0gICAgICAgICAgICAgICAgICAgMTcwCisjICAgIF9fa21wY19zc3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNzEKKyAgICBfX2ttcGNfY29weXByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgMTcyCisjICAgIF9fa21wY19zc3BfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAxNzMKKyMgICAgX19rbXBjX3NzcF9zZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3NAorICAgIF9fa21wY19pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzUKKyAgICBfX2ttcGNfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgMTc2CisgICAgX19rbXBjX3NldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDE3NworICAgIF9fa21wY191bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAxNzgKKyAgICBfX2ttcGNfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgMTc5CisgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4MAorICAgIF9fa21wY19kZXN0cm95X25lc3RfbG9jayAgICAgICAgICAgICAgICAxODEKKyAgICBfX2ttcGNfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgMTgyCisgICAgX19rbXBjX3Vuc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgIDE4MworICAgIF9fa21wY190ZXN0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAxODQKKyMgICAgX19rbXBjX3NzcF9pbml0X3RocmVhZCAgICAgICAgICAgICAgICAgIDE4NQorIyAgICBfX2ttcGNfc3NwX3NldF9ldmVudCAgICAgICAgICAgICAgICAgICAgMTg2CisgICAgX19rbXBjX3JlZHVjZV9ub3dhaXQgICAgICAgICAgICAgICAgICAgIDE4NworICAgIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAxODgKKyAgICBfX2ttcGNfcmVkdWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5CisgICAgX19rbXBjX2VuZF9yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgIDE5MAorCisjIE9wZW5NUCAzLjAKKworJWlmZGVmIE9NUF8zMAorICAgIF9fa21wY19vbXBfdGFza19hbGxvYyAgICAgICAgICAgICAgICAgICAxOTEKKyAgICBfX2ttcGNfb21wX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgICAgMTkyCisgICAgX19rbXBjX29tcF90YXNrd2FpdCAgICAgICAgICAgICAgICAgICAgIDE5MworICAgIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjAgICAgICAgICAgICAgICAxOTYKKyAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwICAgICAgICAgICAgMTk3CisgICAgX19rbXBjX29tcF90YXNrX3BhcnRzICAgICAgICAgICAgICAgICAgIDE5OAorJWVuZGlmICMgT01QXzMwCisKKyMgICBfX29tcF9jb2xsZWN0b3JfYXBpICAgICAgICAgICAgICAgICAgMTk5CisKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIHRlc3RpbmcgcHVycG9zZXMuIFRoZXJlIGlzIG5vIG5lZWQgaW4gc3RhYmxlIG9yZGluYWwgbnVtYmVyOgorICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kCisKKyVlbmRpZiAgIyBub3QgZGVmaW5lZCBzdHViCisKK2ttcGNfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwCitrbXBjX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMQorJWlmbmRlZiBzdHViCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbGliZ3VpZGUsIGJ1dCBkZWNsYXJlZCBuZWl0aGVyIGluIG9tcC5oIG5vdCBpbiBvbXBfbGliLmguCisjICAgIGttcGNfZ2V0X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgICAyMDIKKyMgICAga21wY19nZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIwMworIyAgICBrbXBjX2dldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjA0CisjICAgIGttcGNfZ2V0X3Bvb2xzdGF0ICAgICAgICAgICAgICAgICAgICAgICAyMDUKKyMgICAga21wY19wb29scHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNworIyAgICBrbXBjX3ByaW50X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgMjA4CisjICAgIGttcGNfc2V0X3Bvb2xtb2RlICAgICAgICAgICAgICAgICAgICAgICAyMTQKKyMgICAga21wY19zZXRfcG9vbHNpemUgICAgICAgICAgICAgICAgICAgICAgIDIxNQorJWVuZGlmCitrbXBjX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNgora21wY19yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDkKK2ttcGNfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgMjExCitrbXBjX3NldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMgorIyBrbXBjX3NldF9wYXJhbGxlbF9uYW1lICAgICAgICAgICAgICAgICAgICAgIDIxMwora21wY19zZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAyMTYKK2ttcGNfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgMjIyCisjIGttcGNfc2V0X3N0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE3CitrbXBjX3NldF9kZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNAorCisjIE9NUCAzLjAgZW50cnkgcG9pbnRzIGZvciB1bnNpZ25lZCBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZXMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfMzAKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84dSAgICAgICAgICAgMjI1CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1ICAgICAgICAgICAgIDIyNgorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dSAgICAgICAgICAgICAyMjcKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUgICAgICAgICAgICAgMjI4CisgICAgICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNHUgICAgICAgICAgIDIyOQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80dSAgICAgICAgICAgICAyMzAKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUgICAgICAgICAgICAgMjMxCisgICAgICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzR1ICAgICAgICAgICAgIDIzMgorICAgICVlbmRpZiAjIE9NUF8zMAorJWVuZGlmCisKKyVpZm5kZWYgc3R1YgorICAgIF9fa21wY19nZXRfdGFza2lkICAgICAgICAgICAgICAgICAgICAgICAyMzMKKyAgICBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQgICAgICAgICAgICAgICAgMjM0CislZW5kaWYKKworIyBPcGVuTVAgMy4xIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfb21wX3Rhc2t5aWVsZCAgICAgICAgICAgICAgICAyMzUKKyAgICAlZW5kaWYgIyBPTVBfMzAKKyAgICBfX2ttcGNfcGxhY2VfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgMjM2CislZW5kaWYKKworIyBPcGVuTVAgNC4wIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF80MAorICAgICAgICBfX2ttcGNfcHVzaF9wcm9jX2JpbmQgICAgICAgICAgICAgICAyMzcKKyAgICAgICAgX19rbXBjX3Rhc2tncm91cCAgICAgICAgICAgICAgICAgICAgMjM4CisgICAgICAgIF9fa21wY19lbmRfdGFza2dyb3VwICAgICAgICAgICAgICAgIDIzOQorICAgICAgICBfX2ttcGNfcHVzaF9udW1fdGVhbXMgICAgICAgICAgICAgICAyNDAKKyAgICAgICAgX19rbXBjX2ZvcmtfdGVhbXMgICAgICAgICAgICAgICAgICAgMjQxCisgICAgICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgICAgICAgICAgIDI0MgorICAgICAgICBfX2ttcGNfb21wX3dhaXRfZGVwcyAgICAgICAgICAgICAgICAyNDMKKyAgICAgICAgX19rbXBjX2NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgMjQ0CisgICAgICAgIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCAgICAgICAgICAgIDI0NQorICAgICAgICBfX2ttcGNfY2FuY2VsX2JhcnJpZXIgICAgICAgICAgICAgICAyNDYKKyAgICAlZW5kaWYgIyBPTVBfNDAKKyVlbmRpZgorCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyB0aGF0IGhhdmUgYm90aCBsb3dlci0gYW5kIHVwcGVyLSBjYXNlIHZlcnNpb25zIGZvciBGb3J0cmFuLgorIyBOdW1iZXIgZm9yIGxvd2VyY2FzZSB2ZXJzaW9uIGlzIGluZGljYXRlZC4gIE51bWJlciBmb3IgdXBwZXJjYXNlIGlzIG9idGFpbmVkIGJ5IGFkZGluZyAxMDAwLgorIyBVc2VyIEFQSSBlbnRyeSBwb2ludHMgYXJlIGVudHJ5IHBvaW50cyB0aGF0IHN0YXJ0IHdpdGggJ2ttcF8nIG9yICdvbXBfJy4KKworb21wX2Rlc3Ryb3lfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDAKK29tcF9kZXN0cm95X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgNzAxCitvbXBfZ2V0X2R5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMgorb21wX2dldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDMKK29tcF9nZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA0CitvbXBfZ2V0X251bV9wcm9jcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNQorb21wX2dldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDYKK29tcF9nZXRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3CitvbXBfZ2V0X3d0aWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOAorb21wX2dldF93dGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDkKK29tcF9pbl9wYXJhbGxlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwCitvbXBfaW5pdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMQorb21wX2luaXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTIKK29tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEzCitvbXBfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNAorb21wX3NldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTUKK29tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2CitvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcxNworb21wX3Rlc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTgKK29tcF90ZXN0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgNzE5CitvbXBfdW5zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMAorb21wX3Vuc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICA3MjEKKworb21wY19zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjIKK29tcGNfc2V0X25lc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzCitvbXBjX3NldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgIDcyNAorCitrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNQora21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYKK2ttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI3CitrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOAora21wX2dldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjkKK2ttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMwCisja21wX3ByaW50X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzEKK2ttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMyCitrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNAora21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzUKK2ttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICAgICAgICAgICAgICAgICAgNzM3CitrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAgICAgICAgICAgICAgICAgIDczOAora21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgICAgICAgICAgICAgICAgICA3MzkKKyMga21wX3NldF9wYXJhbGxlbF9uYW1lICAgICAgICAgICAgICAgICAgICAgICA3NDAKK2ttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQxCisjIGttcF9zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQyCitrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzICAgICAgICAgICAgICAgICAgIDc0Mwora21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDQKK2ttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAgNzQ1CitrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Ngora21wX3NldF93YXJuaW5nc19vbiAgICAgICAgICAgICAgICAgICAgICAgICA3NzkKK2ttcF9zZXRfd2FybmluZ3Nfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgNzgwCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgICAgICAgICAgICAgNzg5CisgICAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MAorICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgICA3OTEKKyAgICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgNzkyCisgICAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICAgICAgICAgICAgIDc5MworICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTQKKyAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk1CisgICAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NgorICAgIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTcKKyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgNzk4CisgICAgb21wY19zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgIDc5OQorICAgIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICA4MDAKKyAgICBvbXBjX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgODAxCisgICAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MAorICAgIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTEKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICAgICAgICAgICAgODUyCisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgIDg1MworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICA4NTQKKyAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU1CisgICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg1NgorICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICA4NTcKKyAgICBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgODU4CisgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1OQorICAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NjAKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCAzLjEKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9pbl9maW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NjEKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCA0MAorCislaWZkZWYgT01QXzQwCisgICAgb21wX2dldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MgorICAgI29tcF9zZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjMKKyAgICNvbXBfY3Vycl9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgODY0CisgICAgb21wX2dldF9udW1fdGVhbXMgICAgICAgICAgICAgICAgICAgICAgIDg2NQorICAgIG9tcF9nZXRfdGVhbV9udW0gICAgICAgICAgICAgICAgICAgICAgICA4NjYKKyAgICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAgICAgICAgICAgICAgICAgICAgODY3CisgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzICAgICAgICAgICAgIDg2OAorJWVuZGlmICMgT01QXzQwCisKKyVpZm5kZWYgc3R1YgorICAgICMgT3JkaW5hbHMgYmV0d2VlbiA5MDAgYW5kIDk5OSBhcmUgcmVzZXJ2ZWQKKworICAgICMgT3JkaW5hbHMgYmV0d2VlbiAxMDAwIGFuZCAxOTk5IGFyZSByZXNlcnZlZAorICAgICMgZm9yIHVzZXItY2FsbGFibGUgdXBwZXJjYXNlIEZvcnRyYW4gZW50cmllcy4KKworCisgICAgIyBBVE9NSUMgZW50cmllcworCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkICAgICAgICAgICAgICAyMDk3CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiAgICAgICAgICAgICAgMjA5OAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwgICAgICAgICAgICAgIDIwOTkKKyAgICNfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2ICAgICAgICAgICAgICAyMDAwICMgbW92ZWQgdXAgYmVjYXVzZSBvZiBtaXN0YWtlIGluIG51bWJlciAoc3VwcG9zZWQgdG8gYmUgMjEwMCkKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQgICAgICAgICAgICAgIDIxMDEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViICAgICAgICAgICAgICAyMTAyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCAgICAgICAgICAgICAgMjEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYgICAgICAgICAgICAgIDIxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4ICAgICAgICAgICAgICAyMTA1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiAgICAgICAgICAgICAgMjEwNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwICAgICAgICAgICAgMjEwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcCAgICAgICAgICAgIDIxMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAgICAgICAgICAgICAyMTA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwICAgICAgICAgICAgMjExMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAgICAgICAgICAgIDIxMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcCAgICAgICAgICAgIDIxMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAgICAgICAgICAgICAyMTEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwICAgICAgICAgICAgMjExNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcCAgICAgICAgICAgIDIxMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwICAgICAgICAgICAyMTE2CisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAgICAgICAgICAgICAyMTE3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwICAgICAgICAgICAgMjExOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcCAgICAgICAgICAgIDIxMTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAgICAgICAgICAgICAyMTIwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcCAgICAgICAgICAgMjEyMQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwICAgICAgICAgICAgMjEyMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcCAgICAgICAgICAgIDIxMjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAgICAgICAgICAgICAyMTI0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwICAgICAgICAgICAgMjEyNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAgICAgICAgICAgIDIxMjYKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcCAgICAgICAgICAgIDIxMjcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAgICAgICAgICAgICAyMTI4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwICAgICAgICAgICAgMjEyOQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcCAgICAgICAgICAgIDIxMzAKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcCAgICAgICAgICAgIDIxMzEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAgICAgICAgICAgICAyMTMyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwICAgICAgICAgICAgMjEzMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMzQKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAgICAgICAgICAgIDIxMzUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwICAgICAgICAgICAyMTM2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCAgICAgICAgICAgMjEzNworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAgICAgICAgICAgIDIxMzgKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDggICAgICAgIDIxNjkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4ICAgICAgICAyMTcwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4ICAgICAgICAyMTc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OCAgICAgICAgMjE3NQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCAgICAgICAgMjE3OQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDggICAgICAgIDIxODAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDggICAgICAgIDIxODQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4ICAgICAgICAyMTg1CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4ICAgICAgICAyMTg3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OCAgICAgICAgMjE4OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDggICAgICAgIDIxODkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4ICAgICAgICAyMTkwCisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4ICAgICAgICAyMjMxCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCAgICAgICAgMjIzMgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDggICAgICAgIDIyMzMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4ICAgICAgICAyMjM0CisKKyAgICBfX2ttcGNfYXRvbWljXzEgICAgICAgICAgICAgICAgICAgICAgICAyMjQ3CisgICAgX19rbXBjX2F0b21pY18yICAgICAgICAgICAgICAgICAgICAgICAgMjI0OAorICAgI19fa21wY19hdG9taWNfNCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAwCisgICAjX19rbXBjX2F0b21pY184ICAgICAgICAgICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDEKKyAgICBfX2ttcGNfYXRvbWljXzEwICAgICAgICAgICAgICAgICAgICAgICAyMjUxCisgICAgX19rbXBjX2F0b21pY18xNiAgICAgICAgICAgICAgICAgICAgICAgMjI1MgorICAgIF9fa21wY19hdG9taWNfMjAgICAgICAgICAgICAgICAgICAgICAgIDIyNTMKKyAgICBfX2ttcGNfYXRvbWljXzMyICAgICAgICAgICAgICAgICAgICAgICAyMjU0CisKKyAgICAlaWZkZWYgYXJjaF8zMgorCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisKKyAgICAlZW5kaWYKKworICAgICVpZm5kZWYgYXJjaF82NAorCisgICAgICAgICMgQVRPTUlDIGV4dGVuc2lvbnMgZm9yIE9wZW5NUCAzLjEgc3BlYyAoeDg2IGFuZCB4NjQgb25seSkKKworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZCAgICAgICAgICAgICAgICAyMjY1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkICAgICAgICAgICAgICAgIDIyNjYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQgICAgICAgICAgICAgICAgMjI2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZCAgICAgICAgICAgICAgICAyMjY4CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkICAgICAgICAgICAgICAgIDIyNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQgICAgICAgICAgICAgICAgMjI3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQgICAgICAgICAgICAgICAyMjcxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQgICAgICAgICAgICAgICAgMjI3MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZCAgICAgICAgICAgICAgICAyMjc0CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCAgICAgICAgICAgICAgIDIyNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9yZCAgICAgICAyMjc3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3dyICAgICAgICAgICAgICAgIDIyNzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfd3IgICAgICAgICAgICAgICAgMjI4MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciAgICAgICAgICAgICAgICAyMjgxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyICAgICAgICAgICAgICAgIDIyODIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfd3IgICAgICAgICAgICAgICAgMjI4MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciAgICAgICAgICAgICAgICAyMjg0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF93ciAgICAgICAgICAgICAgIDIyODUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3dyICAgICAgICAgICAgICAgMjI4NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciAgICAgICAgICAgICAgICAyMjg3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3dyICAgICAgICAgICAgICAgIDIyODgKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3dyICAgICAgICAgICAgICAgMjI4OQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IgICAgICAgICAgICAgICAyMjkwCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyICAgICAgIDIyOTEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IgICAgICAgMjI5MgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCAgICAgICAgICAgMjI5MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdCAgICAgICAgICAyMjk0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQgICAgICAgICAgIDIyOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQgICAgICAgICAgMjI5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0ICAgICAgICAgICAyMjk3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQgICAgICAgICAgIDIyOTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCAgICAgICAgICAgMjI5OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0ICAgICAgICAgICAyMzAwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0ICAgICAgICAgIDIzMDEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCAgICAgICAgICAgMjMwMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0ICAgICAgICAgICAyMzAzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQgICAgICAgICAgIDIzMDQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQgICAgICAgICAgMjMwNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0ICAgICAgICAgICAyMzA2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0ICAgICAgICAgIDIzMDcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCAgICAgICAgICAgMjMwOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0ICAgICAgICAgICAyMzA5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQgICAgICAgICAgIDIzMTAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCAgICAgICAgICAgMjMxMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdCAgICAgICAgICAyMzEyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQgICAgICAgICAgIDIzMTMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCAgICAgICAgICAgMjMxNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0ICAgICAgICAgICAyMzE1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCAgICAgICAgICAgMjMxNworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0ICAgICAgICAgICAyMzE4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQgICAgICAgICAgIDIzMTkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdCAgICAgICAgICAgMjMyMAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0ICAgICAgICAgICAyMzIxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHQgICAgICAgICAgIDIzMjIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQgICAgICAgICAgMjMyMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0ICAgICAgICAgICAyMzI0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0ICAgICAgICAgIDIzMjUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCAgICAgICAgICAgMjMyNgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmJfY3B0ICAgICAgICAgICAyMzI3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQgICAgICAgICAgIDIzMjgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCAgICAgICAgICAgMjMyOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdCAgICAgICAgICAyMzMwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQgICAgICAgICAgIDIzMzEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQgICAgICAgICAgMjMzMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0ICAgICAgICAgICAyMzMzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0ICAgICAgICAgIDIzMzQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdCAgICAgICAgICAgMjMzNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0ICAgICAgICAgICAyMzM2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQgICAgICAgICAgIDIzMzcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdCAgICAgICAgICAgMjMzOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdCAgICAgICAgICAyMzM5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQgICAgICAgICAgIDIzNDAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdCAgICAgICAgICAgMjM0MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0ICAgICAgICAgICAyMzQyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQgICAgICAgICAgIDIzNDMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCAgICAgICAgICAgMjM0NAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdCAgICAgICAgICAyMzQ1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQgICAgICAgICAgIDIzNDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQgICAgICAgICAgMjM0NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0ICAgICAgICAgICAyMzQ4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0ICAgICAgICAgIDIzNDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCAgICAgICAgICAgMjM1MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdCAgICAgICAgICAyMzUxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQgICAgICAgICAgIDIzNTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdCAgICAgICAgICAgMjM1MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0ICAgICAgICAgICAyMzU0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQgICAgICAgICAgIDIzNTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdCAgICAgICAgICAgMjM1NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0ICAgICAgICAgICAyMzU3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQgICAgICAgICAgIDIzNTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdCAgICAgICAgICAgMjM1OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0ICAgICAgICAgICAyMzYwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQgICAgICAgICAgIDIzNjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCAgICAgICAgICAgMjM2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0ICAgICAgICAgICAyMzYzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQgICAgICAgICAgIDIzNjQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQgICAgICAgICAgMjM2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCAgICAgICAgICAyMzY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0ICAgICAgICAgIDIzNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQgICAgICAgICAgMjM2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdCAgICAgICAgICAyMzY5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0ICAgICAgICAgIDIzNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCAgICAgICAgICAgMjM3MQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0ICAgICAgICAgICAyMzcyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQgICAgICAgICAgIDIzNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCAgICAgICAgICAgMjM3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdCAgICAgICAgICAyMzc1CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0ICAgICAgICAgIDIzNzYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHQgICAgICAgICAgMjM3NworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdCAgICAgICAgICAyMzc4CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0ICAgICAgICAgIDIzNzkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQgICAgICAgICAgMjM4MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdCAgICAgICAgICAyMzgxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0ICAgICAgICAgIDIzODIKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCAgICAgICAgICAgMjM4MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0ICAgICAgICAgICAyMzg0CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQgICAgICAgICAgIDIzODUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCAgICAgICAgICAgMjM4NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0ICAgICAgICAgICAyMzg3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQgICAgICAgICAgIDIzODgKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCAgICAgICAgICAgMjM4OQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0ICAgICAgICAgICAyMzkwCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0ICAgICAgICAgIDIzOTEKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQgICAgICAgICAgMjM5MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdCAgICAgICAgICAyMzkzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0ICAgICAgICAgIDIzOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQgICAgICAgICAgMjM5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCAgICAgICAgICAyMzk2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0ICAgICAgICAgIDIzOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQgICAgICAgICAgMjM5OAorICAgICAgICNfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0X3RtcCAgICAgICAgICAgIDI0MDkKKworICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0ICAyMzk5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQgIDI0MDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCAgMjQwMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0ICAyNDAyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQgIDI0MDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCAgMjQwNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0ICAyNDA1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQgIDI0MDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdCAgMjQwNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0ICAyNDA4CisgICAgICAgICVlbmRpZgorCisgICAgICAgIF9fa21wY19hdG9taWNfc3RhcnQgICAgICAgICAgICAgICAgICAgIDI0MTAKKyAgICAgICAgX19rbXBjX2F0b21pY19lbmQgICAgICAgICAgICAgICAgICAgICAgMjQxMQorCisgICAgICAgICVpZmRlZiBPTVBfNDAKKworICAgICAgICAgICAgIyBBVE9NSUMgZXh0ZW5zaW9ucyBmb3IgT3Blbk1QIDQuMCBzcGVjICh4ODYgYW5kIHg2NCBvbmx5KQorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AgICAgICAgICAgIDI0MTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCAgICAgICAgICAgMjQxMworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3dwICAgICAgICAgICAyNDE0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AgICAgICAgICAgIDI0MTUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N3cCAgICAgICAgICAgMjQxNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwICAgICAgICAgICAyNDE3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwICAgICAgICAgIDI0MTgKKyAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cCAgICAgICAgMjQxOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwICAgICAgICAgICAyNDIwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AgICAgICAgICAgIDI0MjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AgICAgICAgICAgMjQyMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCAgICAgICAgICAyNDIzCisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AgIDI0MjQKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCAgMjQyNQorICAgICAgICAgICAgJWVuZGlmCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2ICAgMjQyNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYgICAyNDI3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYgIDI0MjgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2ICAgMjQyOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYgICAyNDMwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYgIDI0MzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2ICAgMjQzMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYgICAyNDMzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYgIDI0MzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2ICAgMjQzNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYgICAyNDM2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYgIDI0MzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2ICAgMjQzOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYgICAyNDM5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYgIDI0NDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2ICAgMjQ0MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYgICAyNDQyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYgIDI0NDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2ICAgMjQ0NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYgICAyNDQ1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYgIDI0NDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2ICAgMjQ0NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYgICAyNDQ4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYgIDI0NDkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2ICAgMjQ1MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYgICAyNDUxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldiAgIDI0NTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2ICAgMjQ1MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2ICAyNDU0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYgIDI0NTUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiAgMjQ1NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2ICAyNDU3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldiAgIDI0NTgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2ICAgMjQ1OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYgICAyNDYwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldiAgIDI0NjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiAgMjQ2MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2ICAyNDYzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYgIDI0NjQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiAgMjQ2NQorCisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYgIDI0NjYKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2ICAyNDY3CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0X3JldiAgMjQ2OAorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdF9yZXYgIDI0NjkKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICVlbmRpZiAgICMgT01QXzQwCisKKworICAgICVlbmRpZiAgICMgYXJjaF82NAorCislZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9yYzEvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjZTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApAQCAtMCwwICsxLDEwNSBAQAorIyBleHBvcnRzX3NvLnR4dCAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGlzIGlzIHZlcnNpb24gc2NyaXB0IGZvciBPTVAgUlRMIHNoYXJlZCBsaWJyYXJ5IChsaWJpb21wNSouc28pCisKK1ZFUlNJT04geworCisgICAgZ2xvYmFsOiAjIEV4cG9ydGVkIHN5bWJvbHMuCisKKyAgICAgICAgIworICAgICAgICAjICJOb3JtYWwiIHN5bWJvbHMuCisgICAgICAgICMKKyAgICAgICAgb21wXyo7ICAgICAjIFN0YW5kYXJkIE9wZW5NUCBmdW5jdGlvbnMuCisgICAgICAgIG9tcGNfKjsgICAgIyBvbXAuaCByZW5hbWVzIHNvbWUgc3RhbmRhcmQgZnVuY3Rpb25zIHRvIG9tcGNfKi4KKyAgICAgICAga21wXyo7ICAgICAjIEludGVsIGV4dGVuc2lvbnMuCisgICAgICAgIGttcGNfKjsgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBfX2ttcGNfKjsgICMgRnVuY3Rpb25zIGNhbGxlZCBieSBjb21waWxlci1nZW5lcmF0ZWQgY29kZS4KKyAgICAgICAgR09NUF8qOyAgICAjIEdOVSBDIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorCisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfKjsgICAgICMgTXV0dWFsIGRldGVjdGlvbi9NUyBjb21wYXRpYmlsaXR5IHN5bWJvbHMuCisKKworCisgICAgICAgICMKKyAgICAgICAgIyBJbnRlcm5hbCBmdW5jdGlvbnMgZXhwb3J0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICAgICMKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fX2ttcF9hbGxvY2F0ZTsKKyAgICAgICAgX19fa21wX2ZyZWU7CisgICAgICAgIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGg7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICMKKyAgICAgICAgIyBJVFQgc3VwcG9ydC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbDsKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2s7CisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yOworICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVsZWFzZTsKKyAgICAgICAgX19rbXBfd2FpdF9zbGVlcDsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80OworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzg7CisKKyAgICAgICAgIyBpdHRub3RpZnkgc3ltYm9scyB0byBiZSB1c2VkIGJ5IGRlYnVnZ2VyCisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIGxvY2FsOiAjIE5vbi1leHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICo7ICAgICAgICAgIyBBbGwgb3RoZXIgc3ltYm9scyBhcmUgbm90IGV4cG9ydGVkLgorCit9OyAjIFZFUlNJT04KKworIyBzZXRzIHVwIEdDQyBPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorT01QXzEuMCB7Cit9OworT01QXzIuMCB7Cit9IE9NUF8xLjA7CitPTVBfMy4wIHsKK30gT01QXzIuMDsKK09NUF8zLjEgeworfSBPTVBfMy4wOworT01QXzQuMCB7Cit9IE9NUF8zLjE7CisKKyMgc2V0cyB1cCBHQ0MgR09NUF8gdmVyc2lvbiBkZXBlbmRlbmN5IGNoYWluCitHT01QXzEuMCB7Cit9OworR09NUF8yLjAgeworfSBHT01QXzEuMDsKK0dPTVBfMy4wIHsKK30gR09NUF8yLjA7CitHT01QXzQuMCB7Cit9IEdPTVBfMy4wOworCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwIGIvcmMxL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxNWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwCkBAIC0wLDAgKzEsNDk5IEBACisvKgorICogZXh0cmFjdEV4dGVybmFsLmNwcAorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKKy8qIEdpdmVuIGEgc2V0IG9mIG4gb2JqZWN0IGZpbGVzIGggKCdleHRlcm5hbCcgb2JqZWN0IGZpbGVzKSBhbmQgYSBzZXQgb2YgbQorICAgb2JqZWN0IGZpbGVzIG8gKCdpbnRlcm5hbCcgb2JqZWN0IGZpbGVzKSwKKyAgIDEuIERldGVybWluZXMgciwgdGhlIHN1YnNldCBvZiBoIHRoYXQgbyBkZXBlbmRzIG9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICAyLiBSZW1vdmVzIHRoZSBmaWxlcyBpbiBoIC0gciBmcm9tIHRoZSBmaWxlIHN5c3RlbQorICAgMy4gRm9yIGVhY2ggZXh0ZXJuYWwgc3ltYm9sIGRlZmluZWQgaW4gc29tZSBmaWxlIGluIHIsIHJlbmFtZSBpdCBpbiByIFUgbworICAgICAgYnkgcHJlZml4aW5nIGl0IHdpdGggIl9fa21wX2V4dGVybmFsXyIKKyAgIFVzYWdlOgorICAgaGlkZS5leGUgPG4+IDxmaWxlbmFtZXMgZm9yIGg+IDxmaWxlbmFtZXMgZm9yIG8+CisKKyAgIFRodXMsIHRoZSBwcmVmaXhlZCBzeW1ib2xzIGJlY29tZSBoaWRkZW4gaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBub3cgaGF2ZSBhIHNwZWNpYWwKKyAgIHByZWZpeC4KKyovCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3ZvaWQgc3RvcChjaGFyKiBlcnJvck1zZykgeworICAgIHByaW50ZigiJXNcbiIsIGVycm9yTXNnKTsKKyAgICBleGl0KDEpOworfQorCisvLyBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgLk9CSiBmaWxlCitjbGFzcyBTeW1ib2wgeworcHVibGljOgorICAgIF9faW50NjQgbmFtZTsKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzZWN0aW9uTnVtLCB0eXBlOworICAgIGNoYXIgc3RvcmFnZUNsYXNzLCBuQXV4OworfTsKKworY2xhc3MgX3JzdHJlYW0gOiBwdWJsaWMgaXN0cnN0cmVhbSB7Citwcml2YXRlOgorICAgIGNvbnN0IGNoYXIgKmJ1ZjsKK3Byb3RlY3RlZDoKKyAgICBfcnN0cmVhbShwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBwKTppc3Ryc3RyZWFtKHAuZmlyc3QscC5zZWNvbmQpLGJ1ZihwLmZpcnN0KXt9CisgICAgfl9yc3RyZWFtKCkgeworCWRlbGV0ZVtdYnVmOworICAgIH0KK307CisKKy8qIEEgc3RyZWFtIGVuY2FwdXNsYXRpbmcgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIG9yIHRoZSBjb250ZW50IG9mIGEgc3RyaW5nLCBvdmVycmlkaW5nIHRoZQorICAgPj4gb3BlcmF0b3IgdG8gcmVhZCB2YXJpb3VzIGludGVnZXIgdHlwZXMgaW4gYmluYXJ5IGZvcm0sIGFzIHdlbGwgYXMgYSBzeW1ib2wgdGFibGUKKyAgIGVudHJ5LgorKi8KK2NsYXNzIHJzdHJlYW0gOiBwdWJsaWMgX3JzdHJlYW0geworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGlubGluZSByc3RyZWFtJiBkb1JlYWQoVCAmeCkgeworCXJlYWQoKGNoYXIqKSZ4LCBzaXplb2YoVCkpOworCXJldHVybiAqdGhpczsKKyAgICB9CisgICAgc3RhdGljIHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+IGdldEJ1Zihjb25zdCBjaGFyICpmaWxlTmFtZSkgeworCWlmc3RyZWFtIHJhdyhmaWxlTmFtZSxpb3M6OmJpbmFyeSB8IGlvczo6aW4pOworCWlmKCFyYXcuaXNfb3BlbigpKQorCSAgICBzdG9wKCJyc3RyZWFtLmdldEJ1ZjogRXJyb3Igb3BlbmluZyBmaWxlIik7CisJcmF3LnNlZWtnKDAsaW9zOjplbmQpOworCXN0cmVhbXBvcyBmaWxlU2l6ZSA9IHJhdy50ZWxsZygpOworCWlmKGZpbGVTaXplIDwgMCkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIHJlYWRpbmcgZmlsZSIpOworCWNoYXIgKmJ1ZiA9IG5ldyBjaGFyW2ZpbGVTaXplXTsKKwlyYXcuc2Vla2coMCxpb3M6OmJlZyk7CisJcmF3LnJlYWQoYnVmLCBmaWxlU2l6ZSk7CisJcmV0dXJuIHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+KGJ1ZixmaWxlU2l6ZSk7CisgICAgfQorcHVibGljOgorICAgIC8vIGNvbnN0cnVjdCBmcm9tIGEgc3RyaW5nCisgICAgcnN0cmVhbShjb25zdCBjaGFyICpidWYsc3RyZWFtc2l6ZSBzaXplKTpfcnN0cmVhbShwYWlyPGNvbnN0IGNoYXIqLHN0cmVhbXNpemU+KGJ1Ziwgc2l6ZSkpe30KKyAgICAvKiBjb25zdHJ1Y3QgZnJvbSBhIGZpbGUgd2hvbGUgY29udGVudCBpcyBmdWxseSByZWFkIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZgorICAgICAgIHRoaXMgc3RyZWFtCisgICAgKi8KKyAgICByc3RyZWFtKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTpfcnN0cmVhbShnZXRCdWYoZmlsZU5hbWUpKXt9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihpbnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihzaG9ydCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KFN5bWJvbCAmZSkgeworCXJlYWQoKGNoYXIqKSZlLCAxOCk7CisJcmV0dXJuICp0aGlzOworICAgIH0KK307CisKKy8vIHN0cmluZyB0YWJsZSBpbiBhIC5PQkogZmlsZQorY2xhc3MgU3RyaW5nVGFibGUgeworcHJpdmF0ZToKKyAgICBtYXA8c3RyaW5nLCB1bnNpZ25lZD4gZGlyZWN0b3J5OworICAgIHNpemVfdCBsZW5ndGg7CisgICAgY2hhciAqZGF0YTsKKworICAgIC8vIG1ha2UgPGRpcmVjdG9yeT4gZnJvbSA8bGVuZ3RoPiBieXRlcyBpbiA8ZGF0YT4KKyAgICB2b2lkIG1ha2VEaXJlY3Rvcnkodm9pZCkgeworCXVuc2lnbmVkIGkgPSA0OworCXdoaWxlKGkgPCBsZW5ndGgpIHsKKwkgICAgc3RyaW5nIHMgPSBzdHJpbmcoZGF0YSArIGkpOworCSAgICBkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzLCBpKSk7CisJICAgIGkgKz0gcy5zaXplKCkgKyAxOworCX0KKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSA8bGVuZ3RoPiBhbmQgPGRhdGE+IHdpdGggY29udGVudHMgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudHMKKyAgICB2b2lkIGluaXQoY29uc3QgY2hhciAqX2RhdGEpIHsKKwl1bnNpZ25lZCBfbGVuZ3RoID0gKih1bnNpZ25lZCopX2RhdGE7CisKKwlpZihfbGVuZ3RoIDwgc2l6ZW9mKHVuc2lnbmVkKSB8fCBfbGVuZ3RoICE9ICoodW5zaWduZWQqKV9kYXRhKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZS5pbml0OiBJbnZhbGlkIHN5bWJvbCB0YWJsZSIpOworCWlmKF9kYXRhW19sZW5ndGggLSAxXSkgeworCSAgICAvLyB0byBwcmV2ZW50IHJ1bmF3YXkgc3RyaW5ncywgbWFrZSBzdXJlIHRoZSBkYXRhIGVuZHMgd2l0aCBhIHplcm8KKwkgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aCA9IF9sZW5ndGggKyAxXTsKKwkgICAgZGF0YVtfbGVuZ3RoXSA9IDA7CisJfSBlbHNlIHsKKwkgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aCA9IF9sZW5ndGhdOworCX0KKwkqKHVuc2lnbmVkKilkYXRhID0gbGVuZ3RoOworCW1lbWNweShkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgX2RhdGEgKyBzaXplb2YodW5zaWduZWQpLAorCSAgICAgICBsZW5ndGggLSBzaXplb2YodW5zaWduZWQpKTsKKwltYWtlRGlyZWN0b3J5KCk7CisgICAgfQorcHVibGljOgorICAgIFN0cmluZ1RhYmxlKHJzdHJlYW0gJmYpIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGJ5IHJlYWRpbmcgZnJvbSBmLgorCSAqLworCXN0cmVhbXBvcyBzOworCXVuc2lnbmVkIHN0clNpemU7CisJY2hhciAqc3RyRGF0YTsKKworCXMgPSBmLnRlbGxnKCk7CisJZj4+c3RyU2l6ZTsKKwlpZihzdHJTaXplIDwgc2l6ZW9mKHVuc2lnbmVkKSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIik7CisJc3RyRGF0YSA9IG5ldyBjaGFyW3N0clNpemVdOworCSoodW5zaWduZWQqKXN0ckRhdGEgPSBzdHJTaXplOworCS8vIHJlYWQgdGhlIHJhdyBkYXRhIGludG8gPHN0ckRhdGE+CisJZi5yZWFkKHN0ckRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBzdHJTaXplIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJcyA9IGYudGVsbGcoKSAtIHM7CisJaWYocyA8IHN0clNpemUpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBVbmV4cGVjdGVkIEVPRiIpOworCWluaXQoc3RyRGF0YSk7CisJZGVsZXRlW11zdHJEYXRhOworICAgIH0KKyAgICBTdHJpbmdUYWJsZShjb25zdCBzZXQ8c3RyaW5nPiAmc3RyaW5ncykgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgZnJvbSBnaXZlbiBzdHJpbmdzLgorCSAqLworCWNoYXIgKnA7CisJc2V0PHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworCXNpemVfdCBzOworCisJLy8gY291bnQgcmVxdWlyZWQgc2l6ZSBmb3IgZGF0YQorCWZvcihsZW5ndGggPSBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBzaXplX3QgbCA9ICgqaXQpLnNpemUoKTsKKworCSAgICBpZihsID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQlzdG9wKCJTdHJpbmdUYWJsZTogU3RyaW5nIHRvbyBsb25nIik7CisJICAgIGlmKGwgPiA4KSB7CisJCWxlbmd0aCArPSBsICsgMTsKKwkJaWYobGVuZ3RoID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFN5bWJvbCB0YWJsZSB0b28gbG9uZyIpOworCSAgICB9CisJfQorCWRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJLy8gcG9wdWxhdGUgZGF0YSBhbmQgZGlyZWN0b3J5CisJZm9yKHAgPSBkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgY29uc3Qgc3RyaW5nICZzdHIgPSAqaXQ7CisJICAgIHNpemVfdCBsID0gc3RyLnNpemUoKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIoc3RyLCBwIC0gZGF0YSkpOworCQltZW1jcHkocCwgc3RyLmNfc3RyKCksIGwpOworCQlwW2xdID0gMDsKKwkJcCArPSBsICsgMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgflN0cmluZ1RhYmxlKCkgeworCWRlbGV0ZVtdIGRhdGE7CisgICAgfQorICAgIC8qIFJldHVybnMgZW5jb2RpbmcgZm9yIGdpdmVuIHN0cmluZyBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiBzdHJpbmcgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA4IGJ1dCBzdHJpbmcgaXMgbm90IGluCisgICAgICAgdGhlIHN0cmluZyB0YWJsZS0tcmV0dXJucyAwLgorICAgICovCisgICAgX19pbnQ2NCBlbmNvZGUoY29uc3Qgc3RyaW5nICZzdHIpIHsKKwlfX2ludDY0IHI7CisKKwlpZihzdHIuc2l6ZSgpIDw9IDgpIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICAoKGNoYXIqKSZyKVs3XSA9IDA7CisJICAgIHN0cm5jcHkoKGNoYXIqKSZyLCBzdHIuY19zdHIoKSwgOCk7CisJICAgIHJldHVybiByOworCX0gZWxzZSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgbWFwPHN0cmluZyx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGlyZWN0b3J5LmZpbmQoc3RyKTsKKwkgICAgaWYoaXQgPT0gZGlyZWN0b3J5LmVuZCgpKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZW5jb2RlOiBTdHJpbmcgbm93IGZvdW5kIGluIHN0cmluZyB0YWJsZSIpOworCSAgICAoKHVuc2lnbmVkKikmcilbMF0gPSAwOworCSAgICAoKHVuc2lnbmVkKikmcilbMV0gPSAoKml0KS5zZWNvbmQ7CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgLyogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgeCBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiB4IHJlZmVyZW5jZXMgYW4gaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgdGFibGUtLXJldHVybnMKKyAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgorICAgICovCisgICAgc3RyaW5nIGRlY29kZShfX2ludDY0IHgpIGNvbnN0IHsKKwlpZigqKHVuc2lnbmVkKikmeCA9PSAwKSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgdW5zaWduZWQgJnAgPSAoKHVuc2lnbmVkKikmeClbMV07CisJICAgIGlmKHAgPj0gbGVuZ3RoKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZGVjb2RlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSBsb29rdXAiKTsKKwkgICAgcmV0dXJuIHN0cmluZyhkYXRhICsgcCk7CisJfSBlbHNlIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICBjaGFyICpwID0gKGNoYXIqKSZ4OworCSAgICBpbnQgaTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCA4ICYmIHBbaV07ICsraSk7CisJICAgIHJldHVybiBzdHJpbmcocCwgaSk7CisJfQorICAgIH0KKyAgICB2b2lkIHdyaXRlKG9zdHJlYW0gJm9zKSB7CisJb3Mud3JpdGUoZGF0YSwgbGVuZ3RoKTsKKyAgICB9Cit9OworCisvKiBmb3IgdGhlIG5hbWVkIG9iamVjdCBmaWxlLCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgZGVmaW5lZCBzeW1ib2xzIGFuZCB0aGUgc2V0IG9mIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzCisgICBhbmQgd3JpdGVzIHRoZW0gdG8gPGRlZmluZWQ+IGFuZCA8dW5kZWZpbmVkPiByZXNwZWN0aXZlbHkKKyovCit2b2lkIGNvbXB1dGVFeHRlcm5hbFN5bWJvbHMoY29uc3QgY2hhciAqZmlsZU5hbWUsIHNldDxzdHJpbmc+ICpkZWZpbmVkLCBzZXQ8c3RyaW5nPiAqdW5kZWZpbmVkKXsKKyAgICBzdHJlYW1wb3MgZmlsZVNpemU7CisgICAgc2l6ZV90IHN0clRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllczsKKyAgICByc3RyZWFtIGYoZmlsZU5hbWUpOworCisgICAgZi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGYudGVsbGcoKTsKKworICAgIGYuc2Vla2coOCk7CisgICAgZiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICAvLyBzZWVrIHRvIHRoZSBzdHJpbmcgdGFibGUKKyAgICBmLnNlZWtnKHN0clRhYlN0YXJ0ID0gc3ltVGFiU3RhcnQgKyAxOCAqIChzaXplX3Qpc3ltTkVudHJpZXMpOworICAgIGlmKGYuZW9mKCkpIHsKKwlwcmludGYoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IGZpbGVOYW1lPSclcycsIGZpbGVTaXplID0gJWx1LCBzeW1UYWJTdGFydCA9ICV1LCBzeW1ORW50cmllcyA9ICV1XG4iLAorCSAgICAgICBmaWxlTmFtZSwgKHVuc2lnbmVkIGxvbmcpIGZpbGVTaXplLCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXMpOworCXN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIDEiKTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGUoZik7IC8vIHJlYWQgdGhlIHN0cmluZyB0YWJsZQorICAgIGlmKGYudGVsbGcoKSAhPSBmaWxlU2l6ZSkKKwlzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICBmLmNsZWFyKCk7CisgICAgZi5zZWVrZyhzeW1UYWJTdGFydCk7IC8vIHNlZWsgdG8gdGhlIHN5bWJvbCB0YWJsZQorCisgICAgZGVmaW5lZC0+Y2xlYXIoKTsgdW5kZWZpbmVkLT5jbGVhcigpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJLy8gcHJvY2VzcyBlYWNoIGVudHJ5CisJU3ltYm9sIGU7CisKKwlpZihmLmVvZigpKQorCSAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiAyIik7CisJZj4+ZTsKKwlpZihmLmZhaWwoKSkKKwkgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJaWYoZS5uQXV4KSB7IC8vIGF1eGlsaWFyeSBlbnRyeTogc2tpcAorCSAgICBmLnNlZWtnKGUubkF1eCAqIDE4LCBpb3M6OmN1cik7CisJICAgIGkgKz0gZS5uQXV4OworCX0KKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGZpbGUsIGluc2VydCBpdAorCWlmKGUuc3RvcmFnZUNsYXNzID09IDIpCisJICAgIGlmKGUuc2VjdGlvbk51bSkKKwkJZGVmaW5lZC0+aW5zZXJ0KHN0cmluZ1RhYmxlLmRlY29kZShlLm5hbWUpKTsKKwkgICAgZWxzZQorCQl1bmRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisgICAgfQorfQorCisvKiBGb3IgZWFjaCBvY2N1cnJlbmNlIG9mIGFuIGV4dGVybmFsIHN5bWJvbCBpbiB0aGUgb2JqZWN0IGZpbGUgbmFtZWQgYnkKKyAgIGJ5IDxmaWxlTmFtZT4gdGhhdCBpcyBhIG1lbWJlciBvZiA8aGlkZT4sIHJlbmFtZXMgaXQgYnkgcHJlZml4aW5nCisgICB3aXRoICJfX2ttcF9leHRlcm5hbF8iLCB3cml0aW5nIGJhY2sgdGhlIGZpbGUgaW4tcGxhY2UKKyovCit2b2lkIGhpZGVTeW1ib2xzKGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzZXQ8c3RyaW5nPiAmaGlkZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgcHJlZml4KCJfX2ttcF9leHRlcm5hbF8iKTsKKyAgICBzZXQ8c3RyaW5nPiBzdHJpbmdzOyAvLyBzZXQgb2YgYWxsIG9jY3VycmluZyBzeW1ib2xzLCBhcHByb3ByaWF0ZWx5IHByZWZpeGVkCisgICAgc3RyZWFtcG9zIGZpbGVTaXplOworICAgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgICB1bnNpZ25lZCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXM7CisgICAgaW50IGk7CisgICAgcnN0cmVhbSBpbihmaWxlTmFtZSk7CisKKyAgICBpbi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGluLnRlbGxnKCk7CisKKyAgICBpbi5zZWVrZyg4KTsKKyAgICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICBpbi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgICBpZihpbi5lb2YoKSkKKwlzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU9sZChpbik7IC8vIHJlYWQgb3JpZ2luYWwgc3RyaW5nIHRhYmxlCisKKyAgICBpZihpbi50ZWxsZygpICE9IGZpbGVTaXplKQorCXN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICAvLyBjb21wdXRlIHNldCBvZiBvY2N1cnJpbmcgc3RyaW5ncyB3aXRoIHByZWZpeCBhZGRlZAorICAgIGZvcihpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKwlTeW1ib2wgZTsKKworCWluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKwlpZihpbi5lb2YoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW4gPj4gZTsKKwlpZihpbi5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwlpZihlLm5BdXgpCisJICAgIGkgKz0gZS5uQXV4OworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCS8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGZvdW5kIGluIDxoaWRlPiwgcHJlZml4IGFuZCBpbnNlcnQgaW50byBzdHJpbmdzLAorCS8vIG90aGVyd2lzZSwganVzdCBpbnNlcnQgaW50byBzdHJpbmdzIHdpdGhvdXQgcHJlZml4CisJc3RyaW5ncy5pbnNlcnQoIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/CisJCQlwcmVmaXggKyBzIDogcyk7CisgICAgfQorCisgICAgb2ZzdHJlYW0gb3V0KGZpbGVOYW1lLCBpb3M6OnRydW5jIHwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSk7CisgICAgaWYoIW91dC5pc19vcGVuKCkpCisJc3RvcCgiaGlkZVN5bWJvbHM6IEVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUiKTsKKworICAgIC8vIG1ha2UgbmV3IHN0cmluZyB0YWJsZSBmcm9tIHN0cmluZyBzZXQKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU5ldyA9IFN0cmluZ1RhYmxlKHN0cmluZ3MpOworCisgICAgLy8gY29weSBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUKKyAgICBpbi5zZWVrZygwKTsKKyAgICBjaGFyICpidWYgPSBuZXcgY2hhcltzeW1UYWJTdGFydF07CisgICAgaW4ucmVhZChidWYsIHN5bVRhYlN0YXJ0KTsKKyAgICBvdXQud3JpdGUoYnVmLCBzeW1UYWJTdGFydCk7CisgICAgZGVsZXRlIFtdYnVmOworCisgICAgLy8gY29weSBpbnB1dCBzeW1ib2wgdGFibGUgdG8gb3V0cHV0IHN5bWJvbCB0YWJsZSB3aXRoIG5hbWUgdHJhbnNsYXRpb24KKyAgICBmb3IoaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJU3ltYm9sIGU7CisKKwlpbi5zZWVrZyhzeW1UYWJTdGFydCArIGkqMTgpOworCWlmKGluLmVvZigpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKwlpbiA+PiBlOworCWlmKGluLmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCW91dC5zZWVrcChzeW1UYWJTdGFydCArIGkqMTgpOworCWUubmFtZSA9IHN0cmluZ1RhYmxlTmV3LmVuY29kZSggKGUuc3RvcmFnZUNsYXNzID09IDIgJiYgaGlkZS5maW5kKHMpICE9IGhpZGUuZW5kKCkpID8KKwkJCQkJcHJlZml4ICsgcyA6IHMpOworCW91dC53cml0ZSgoY2hhciopJmUsIDE4KTsKKwlpZihvdXQuZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSB3cml0ZSBlcnJvciIpOworCWlmKGUubkF1eCkgeworCSAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworCSAgICBpbnQgbkF1eCA9IGUubkF1eDsKKwkgICAgZm9yKGludCBqID0gMTsgaiA8PSBuQXV4OyArK2opIHsKKwkJaW4gPj4gZTsKKwkJb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgKGkgKyBqKSAqIDE4KTsKKwkJb3V0LndyaXRlKChjaGFyKikmZSwgMTgpOworCSAgICB9CisJICAgIGkgKz0gbkF1eDsKKwl9CisgICAgfQorICAgIC8vIG91dHB1dCBzdHJpbmcgdGFibGUKKyAgICBzdHJpbmdUYWJsZU5ldy53cml0ZShvdXQpOworfQorCisvLyByZXR1cm5zIHRydWUgaWZmIDxhPiBhbmQgPGI+IGhhdmUgbm8gY29tbW9uIGVsZW1lbnQKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBpc0Rpc2pvaW50KGNvbnN0IHNldDxUPiAmYSwgY29uc3Qgc2V0PFQ+ICZiKSB7CisgICAgc2V0PFQ+Ojpjb25zdF9pdGVyYXRvciBpdGEsIGl0YjsKKworICAgIGZvcihpdGEgPSBhLmJlZ2luKCksIGl0YiA9IGIuYmVnaW4oKTsgaXRhICE9IGEuZW5kKCkgJiYgaXRiICE9IGIuZW5kKCk7KSB7CisJY29uc3QgVCAmdGEgPSAqaXRhLCAmdGIgPSAqaXRiOworCWlmKHRhIDwgdGIpCisJICAgICsraXRhOworCWVsc2UgaWYgKHRiIDwgdGEpCisJICAgICsraXRiOworCWVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogcHJlY29uZGl0aW9uOiA8ZGVmaW5lZD4gYW5kIDx1bmRlZmluZWQ+IGFyZSBhcnJheXMgd2l0aCA8blRvdGFsPiBlbGVtZW50cyB3aGVyZQorICAgPG5Ub3RhbD4gPj0gPG5FeHRlcm5hbD4uICBUaGUgZmlyc3QgPG5FeHRlcm5hbD4gZWxlbWVudHMgY29ycmVzcG9uZCB0byB0aGUgZXh0ZXJuYWwgb2JqZWN0CisgICBmaWxlcyBhbmQgdGhlIHJlc3QgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorICAgcG9zdGNvbmRpdGlvbjogZmlsZSB4IGlzIHNhaWQgdG8gZGVwZW5kIG9uIGZpbGUgeSBpZiB1bmRlZmluZWRbeF0gYW5kIGRlZmluZWRbeV0gYXJlIG5vdAorICAgZGlzam9pbnQuICBSZXR1cm5zIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgdGhlIHNldCBvZiBpbnRlcm5hbCBvYmplY3QgZmlsZXMsIGFzIGEgc2V0IG9mCisgICBmaWxlIGluZGV4ZXMsIHVuZGVyIHRoZSAnZGVwZW5kcyBvbicgcmVsYXRpb24sIG1pbnVzIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorKi8KK3NldDxpbnQ+ICpmaW5kUmVxdWlyZWRFeHRlcm5hbChpbnQgbkV4dGVybmFsLCBpbnQgblRvdGFsLCBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCkgeworICAgIHNldDxpbnQ+ICpyZXF1aXJlZCA9IG5ldyBzZXQ8aW50PjsKKyAgICBzZXQ8aW50PiBmcmVzaFsyXTsKKyAgICBpbnQgaSwgY3VyID0gMDsKKyAgICBib29sIGNoYW5nZWQ7CisKKyAgICBmb3IoaSA9IG5Ub3RhbCAtIDE7IGkgPj0gbkV4dGVybmFsOyAtLWkpCisJZnJlc2hbY3VyXS5pbnNlcnQoaSk7CisgICAgZG8geworCWNoYW5nZWQgPSBmYWxzZTsKKwlmb3Ioc2V0PGludD46Oml0ZXJhdG9yIGl0ID0gZnJlc2hbY3VyXS5iZWdpbigpOyBpdCAhPSBmcmVzaFtjdXJdLmVuZCgpOyArK2l0KSB7CisJICAgIHNldDxzdHJpbmc+ICZzID0gdW5kZWZpbmVkWyppdF07CisKKwkgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpIHsKKwkJaWYocmVxdWlyZWQtPmZpbmQoaSkgPT0gcmVxdWlyZWQtPmVuZCgpKSB7CisJCSAgICBpZighaXNEaXNqb2ludChkZWZpbmVkW2ldLCBzKSkgeworCQkJLy8gZm91bmQgYSBuZXcgcXVhbGlmeWluZyBlbGVtZW50CisJCQlyZXF1aXJlZC0+aW5zZXJ0KGkpOworCQkJZnJlc2hbMSAtIGN1cl0uaW5zZXJ0KGkpOworCQkJY2hhbmdlZCA9IHRydWU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlmcmVzaFtjdXJdLmNsZWFyKCk7CisJY3VyID0gMSAtIGN1cjsKKyAgICB9IHdoaWxlKGNoYW5nZWQpOworICAgIHJldHVybiByZXF1aXJlZDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IG5FeHRlcm5hbCwgbkludGVybmFsLCBpOworICAgIHNldDxzdHJpbmc+ICpkZWZpbmVkLCAqdW5kZWZpbmVkOworICAgIHNldDxpbnQ+OjppdGVyYXRvciBpdDsKKworICAgIGlmKGFyZ2MgPCAzKQorCXN0b3AoIlBsZWFzZSBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlciBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyIpOworICAgIG5FeHRlcm5hbCA9IGF0b2koYXJndlsxXSk7CisgICAgaWYobkV4dGVybmFsIDw9IDApCisJc3RvcCgiUGxlYXNlIHNwZWNpZnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvYmplY3QgZmlsZW5hbWVzIik7CisgICAgaWYobkV4dGVybmFsICsgIDIgPiBhcmdjKQorCXN0b3AoIlRvbyBmZXcgZXh0ZXJuYWwgb2JqZWN0cyIpOworICAgIG5JbnRlcm5hbCA9IGFyZ2MgLSBuRXh0ZXJuYWwgLSAyOworICAgIGRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworICAgIHVuZGVmaW5lZCA9IG5ldyBzZXQ8c3RyaW5nPlthcmdjIC0gMl07CisKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNldCBvZiBkZWZpbmVkIGFuZCB1bmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scworICAgIGZvcihpID0gMjsgaSA8IGFyZ2M7ICsraSkKKwljb21wdXRlRXh0ZXJuYWxTeW1ib2xzKGFyZ3ZbaV0sIGRlZmluZWQgKyBpIC0gMiwgdW5kZWZpbmVkICsgaSAtIDIpOworCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgICBzZXQ8aW50PiAqcmVxdWlyZWRFeHRlcm5hbCA9IGZpbmRSZXF1aXJlZEV4dGVybmFsKG5FeHRlcm5hbCwgYXJnYyAtIDIsIGRlZmluZWQsIHVuZGVmaW5lZCk7CisgICAgc2V0PHN0cmluZz4gaGlkZTsKKworICAgIC8qIGRldGVybWluZSB0aGUgc2V0IG9mIHN5bWJvbHMgdG8gaGlkZS0tbmFtZWx5IGRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scyBvZiB0aGUKKyAgICAgICByZXF1aXJlZCBleHRlcm5hbCBmaWxlcworICAgICovCisgICAgZm9yKGl0ID0gcmVxdWlyZWRFeHRlcm5hbC0+YmVnaW4oKTsgaXQgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCk7ICsraXQpIHsKKwlpbnQgaWR4ID0gKml0OworCXNldDxzdHJpbmc+OjppdGVyYXRvciBpdDI7CisJLyogV2UgaGF2ZSB0byBpbnNlcnQgb25lIGVsZW1lbnQgYXQgYSB0aW1lIGluc3RlYWQgb2YgaW5zZXJ0aW5nIGEgcmFuZ2UgYmVjYXVzZQorCSAgIHRoZSBpbnNlcnQgbWVtYmVyIGZ1bmN0aW9uIHRha2luZyBhIHJhbmdlIGRvZXNuJ3QgZXhpc3Qgb24gV2luZG93cyogT1MsIGF0IGxlYXN0CisJICAgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgorCSovCisJZm9yKGl0MiA9IGRlZmluZWRbaWR4XS5iZWdpbigpOyBpdDIgIT0gZGVmaW5lZFtpZHhdLmVuZCgpOyArK2l0MikKKwkgICAgaGlkZS5pbnNlcnQoKml0Mik7CisgICAgfQorCisgICAgLyogcHJvY2VzcyB0aGUgZXh0ZXJuYWwgZmlsZXMtLXJlbW92aW5nIHRob3NlIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBhbmQgaGlkaW5nCisgICAgICAgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIG90aGVycworICAgICovCisgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpCisJaWYocmVxdWlyZWRFeHRlcm5hbC0+ZmluZChpKSAhPSByZXF1aXJlZEV4dGVybmFsLT5lbmQoKSkKKwkgICAgaGlkZVN5bWJvbHMoYXJndlsyICsgaV0sIGhpZGUpOworCWVsc2UKKwkgICAgcmVtb3ZlKGFyZ3ZbMiArIGldKTsKKyAgICAvLyBoaWRlIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGluIHRoZSBpbnRlcm5hbCBmaWxlcworICAgIGZvcihpID0gbkV4dGVybmFsICsgMjsgaSA8IGFyZ2M7ICsraSkKKwloaWRlU3ltYm9scyhhcmd2W2ldLCBoaWRlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dCBiL3JjMS9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTcyZDNlCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0CkBAIC0wLDAgKzEsNDY0IEBACisjIGVuX1VTLnR4dCAjCisjICRSZXZpc2lvbjogNDI2NTkgJAorIyAkRGF0ZTogMjAxMy0wOS0xMiAwOToyMjo0OCAtMDUwMCAoVGh1LCAxMiBTZXAgMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGVmYXVsdCBtZXNzYWdlcywgZW1iZWRkZWQgaW50byB0aGUgT3Blbk1QIFJUTCwgYW5kIHNvdXJjZSBmb3IgRW5nbGlzaCBjYXRhbG9nLgorCisKKyMgQ29tcGF0aWJsZSBjaGFuZ2VzICh3aGljaCBkb2VzIG5vdCByZXF1aXJlIHZlcnNpb24gYnVtcGluZyk6CisjICAgICAqIEVkaXRpbmcgbWVzc2FnZSAobnVtYmVyIGFuZCB0eXBlIG9mIHBsYWNlaG9sZGVycyBtdXN0IHJlbWFpbiwgcmVsYXRpdmUgb3JkZXIgb2YKKyMgICAgICAgcGxhY2Vob2xkZXJzIG1heSBiZSBjaGFuZ2VkLCBlLmcuICJGaWxlICUxJHMgbGluZSAlMiRkIiBtYXkgYmUgc2FmZWx5IGVkaXRlZCB0bworIyAgICAgICAiTGluZSAlMiRkIGZpbGUgJTEkcyIpLgorIyAgICAgKiBBZGRpbmcgbmV3IG1lc3NhZ2UgdG8gdGhlIGVuZCBvZiBzZWN0aW9uLgorIyBJbmNvbXBhdGlibGUgY2hhbmdlcyAodmVyc2lvbiBtdXN0IGJlIGJ1bWJlZCBieSAxKToKKyMgICAgICogSW50cm9kdWNpbmcgbmV3IHBsYWNlaG9sZGVycyB0byBleGlzdGluZyBtZXNzYWdlcy4KKyMgICAgICogQ2hhbmdpbmcgdHlwZSBvZiBwbGFjZWhvbGRlcnMgKGUuZy4gImxpbmUgJTEkZCIgLT4gImxpbmUgJTEkcyIpLgorIyAgICAgKiBSZWFycmFuZ2luZyBvcmRlciBvZiBtZXNzYWdlcy4KKyMgICAgICogRGVsZXRpbmcgbWVzc2FnZXMuCisjIFVzZSBzcGVjaWFsICJPQlNPTEVURSIgcHNldWRvaWRlbnRpZmllciBmb3Igb2Jzb2xldGUgZW50cmllcywgd2hpY2ggaXMga2VwdCBvbmx5IGZvciBiYWNrd2FyZAorIyBjb21wYXRpYmlsaXR5LiBXaGVuIHZlcnNpb24gaXMgYnVtcGVkLCBkbyBub3QgZm9yZ2V0IHRvIGRlbGV0ZSBhbGwgb2Jzb2xldGUgZW50cmllcy4KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVUQSAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNZXRhIGluZm9ybWF0aW9uIGFib3V0IG1lc3NhZ2UgY2F0YWxvZy4KKworTGFuZ3VhZ2UgIkVuZ2xpc2giCitDb3VudHJ5ICAiVVNBIgorTGFuZ0lkICAgIjEwMzMiCitWZXJzaW9uICAiMiIKK1JldmlzaW9uICIyMDEzMDkxMSIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBTVFJJTkdTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFN0cmluZ3MgYXJlIG5vdCBjb21wbGV0ZSBtZXNzYWdlcywganVzdCBmcmFnbWVudHMuIFdlIG5lZWQgdG8gd29yayBvbiBpdCBhbmQgcmVkdWNlIG51bWJlciBvZgorIyBzdHJpbmdzICh0byB6ZXJvPykuCisKK0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIgorVW5rbm93bkZpbGUgICAgICAgICAgICAgICAgICAiKHVua25vd24gZmlsZSkiCitOb3RBTnVtYmVyICAgICAgICAgICAgICAgICAgICJub3QgYSBudW1iZXIiCitCYWRVbml0ICAgICAgICAgICAgICAgICAgICAgICJiYWQgdW5pdCIKK0lsbGVnYWxDaGFyYWN0ZXJzICAgICAgICAgICAgImlsbGVnYWwgY2hhcmFjdGVycyIKK1ZhbHVlVG9vTGFyZ2UgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBsYXJnZSIKK1ZhbHVlVG9vU21hbGwgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBzbWFsbCIKK05vdE11bHRpcGxlNEsgICAgICAgICAgICAgICAgInZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIDRrIgorVW5rbm93blRvcG9sb2d5ICAgICAgICAgICAgICAiVW5rbm93biBwcm9jZXNzb3IgdG9wb2xvZ3kiCitDYW50T3BlbkNwdWluZm8gICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiAvcHJvYy9jcHVpbmZvIgorUHJvY0NwdWluZm8gICAgICAgICAgICAgICAgICAiL3Byb2MvY3B1aW5mbyIKK05vUHJvY1JlY29yZHMgICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChObyBwcm9jZXNzb3IgcmVjb3JkcykiCitUb29NYW55UHJvY1JlY29yZHMgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoVG9vIG1hbnkgcHJvY2Vzc29yIHJlY29yZHMpIgorQ2FudFJld2luZENwdWluZm8gICAgICAgICAgICAiQ2Fubm90IHJld2luZCBjcHVpbmZvIGZpbGUiCitMb25nTGluZUNwdWluZm8gICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobG9uZyBsaW5lKSIKK1Rvb01hbnlFbnRyaWVzICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBjb250YWlucyB0b28gbWFueSBlbnRyaWVzIgorTWlzc2luZ1Byb2NGaWVsZCAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcHJvY2Vzc29yIGZpZWxkIgorTWlzc2luZ1BoeXNpY2FsSURGaWVsZCAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcGh5c2ljYWwgaWQgZmllbGQiCitNaXNzaW5nVmFsQ3B1aW5mbyAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobWlzc2luZyB2YWwpIgorRHVwbGljYXRlRmllbGRDcHVpbmZvICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKGR1cGxpY2F0ZSBmaWVsZCkiCitQaHlzaWNhbElEc05vdFVuaXF1ZSAgICAgICAgICJQaHlzaWNhbCBub2RlL3BrZy9jb3JlL3RocmVhZCBpZHMgbm90IHVuaXF1ZSIKK0FwaWNOb3RQcmVzZW50ICAgICAgICAgICAgICAgIkFQSUMgbm90IHByZXNlbnQiCitJbnZhbGlkQ3B1aWRJbmZvICAgICAgICAgICAgICJJbnZhbGlkIGNwdWlkIGluZm8iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJBUElDIGlkcyBub3QgdW5pcXVlIgorSW5jb25zaXN0ZW50Q3B1aWRJbmZvICAgICAgICAiSW5jb25zaXN0ZW50IGNwdWlkIGluZm8iCitPdXRPZkhlYXBNZW1vcnkgICAgICAgICAgICAgICJPdXQgb2YgaGVhcCBtZW1vcnkiCitNZW1vcnlBbGxvY0ZhaWxlZCAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiCitDb3JlICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIgorVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkIgorUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSIKK05vZGUgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICI8dW5kZWY+IgorRGVjb2RpbmdMZWdhY3lBUElDICAgICAgICAgICAiZGVjb2RpbmcgbGVnYWN5IEFQSUMgaWRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAicGFyc2luZyAvcHJvYy9jcHVpbmZvIgorTm90RGVmaW5lZCAgICAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGRlZmluZWQiCitFZmZlY3RpdmVTZXR0aW5ncyAgICAgICAgICAgICJFZmZlY3RpdmUgc2V0dGluZ3M6IgorVXNlclNldHRpbmdzICAgICAgICAgICAgICAgICAiVXNlciBzZXR0aW5nczoiCitTdG9yYWdlTWFwV2FybmluZyAgICAgICAgICAgICJ3YXJuaW5nOiBwb2ludGVycyBvciBzaXplIGRvbid0IG1ha2Ugc2Vuc2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFVzIHBlciBwYWNrYWdlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZW5hYmxlZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkhUIGRpc2FibGVkIgorRGVjb2Rpbmd4MkFQSUMgICAgICAgICAgICAgICAiZGVjb2RpbmcgeDJBUElDIGlkcyIKK05vTGVhZjExU3VwcG9ydCAgICAgICAgICAgICAgImNwdWlkIGxlYWYgMTEgbm90IHN1cHBvcnRlZCIKK05vTGVhZjRTdXBwb3J0ICAgICAgICAgICAgICAgImNwdWlkIGxlYWYgNCBub3Qgc3VwcG9ydGVkIgorVGhyZWFkSURzTm90VW5pcXVlICAgICAgICAgICAidGhyZWFkIGlkcyBub3QgdW5pcXVlIgorVXNpbmdQdGhyZWFkICAgICAgICAgICAgICAgICAidXNpbmcgcHRocmVhZCBpbmZvIgorTGVnYWN5QXBpY0lEc05vdFVuaXF1ZSAgICAgICAibGVnYWN5IEFQSUMgaWRzIG5vdCB1bmlxdWUiCit4MkFwaWNJRHNOb3RVbmlxdWUgICAgICAgICAgICJ4MkFQSUMgaWRzIG5vdCB1bmlxdWUiCitEaXNwbGF5RW52QmVnaW4JCSAgICAgIk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEJFR0lOIgorRGlzcGxheUVudkVuZAkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgRU5EIgorRGV2aWNlCQkJICAgICAiW2RldmljZV0iCitIb3N0CQkJICAgICAiW2hvc3RdIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEZPUk1BVFMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogSW5mbyAjJTEkZDogJTIkc1xuIgorV2FybmluZyAgICAgICAgICAgICAgICAgICAgICAiT01QOiBXYXJuaW5nICMlMSRkOiAlMiRzXG4iCitGYXRhbCAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEVycm9yICMlMSRkOiAlMiRzXG4iCitTeXNFcnIgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFN5c3RlbSBlcnJvciAjJTEkZDogJTIkc1xuIgorSGludCAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBIaW50OiAlMiRzXG4iCisKK1ByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgIiUxJHMgcHJhZ21hIChhdCAlMiRzOiUzJHMoKTolNCRzKSIKKyAgICAjICUxIGlzIHByYWdtYSBuYW1lIChsaWtlICJwYXJhbGxlbCIgb3IgIm1hc3RlciIsCisgICAgIyAlMiBpcyBmaWxlIG5hbWUsCisgICAgIyAlMyBpcyBmdW5jdGlvbiAocm91dGluZSkgbmFtZSwKKyAgICAjICU0IGlzIHRoZSBsaW5lIG51bWJlciAoYXMgc3RyaW5nLCBzbyAicyIgdHlwZSBzcGVjaWZpZXIgc2hvdWxkIGJlIHVzZWQpLgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIE1FU1NBR0VTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1lc3NhZ2VzIG9mIGFueSBzZXZlcml0eTogaW5mb3JtYXRpb25hbCwgd2FybmluZywgb3IgZmF0YWwuCisjIFRvIG1haW50YWluIG1lc3NhZ2UgbnVtYmVycyAodGhleSBhcmUgdmlzaWJsZSB0byBjdXN0b21lcnMpLCBhZGQgbmV3IG1lc3NhZ2VzIHRvIHRoZSBlbmQuCisKKyMgVXNlIGZvbGxvd2luZyBwcmVmaXhlcyBmb3IgbWVzc2FnZXMgYW5kIGhpbnRzIHdoZW4gYXBwcm9wcmlhdGU6CisjICAgIEFmZiAtLSBBZmZpbml0eSBtZXNzYWdlcy4KKyMgICAgQ25zIC0tIENvbnNpc3RlbmN5IGNoZWNrIGZhaWx1cmVzIChLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0spLgorIyAgICBJdHQgLS0gSVRUIE5vdGlmeS1yZWxhdGVkIG1lc3NhZ2VzLgorIyAgICBSbWwgLS0gUk1MLXJlbGF0ZWQgbWVzc2FnZXMuCisKK0xpYnJhcnlJc1NlcmlhbCAgICAgICAgICAgICAgIkxpYnJhcnkgaXMgXCJzZXJpYWxcIi4iCitDYW50T3Blbk1lc3NhZ2VDYXRhbG9nICAgICAgICJDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IgorV2lsbFVzZURlZmF1bHRNZXNzYWdlcyAgICAgICAiRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuIgorTG9ja0lzVW5pbml0aWFsaXplZCAgICAgICAgICAiJTEkczogTG9jayBpcyB1bmluaXRpYWxpemVkIgorTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlICAgICAiJTEkczogTG9jayB3YXMgaW5pdGlhbGl6ZWQgYXMgc2ltcGxlLCBidXQgdXNlZCBhcyBuZXN0YWJsZSIKK0xvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIG5lc3RhYmxlLCBidXQgdXNlZCBhcyBzaW1wbGUiCitMb2NrSXNBbHJlYWR5T3duZWQgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIGFscmVhZHkgb3duZWQgYnkgcmVxdWVzdGluZyB0aHJlYWQiCitMb2NrU3RpbGxPd25lZCAgICAgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIHN0aWxsIG93bmVkIGJ5IGEgdGhyZWFkIgorTG9ja1Vuc2V0dGluZ0ZyZWUgICAgICAgICAgICAiJTEkczogQXR0ZW1wdCB0byByZWxlYXNlIGEgbG9jayBub3Qgb3duZWQgYnkgYW55IHRocmVhZCIKK0xvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgb3duZWQgYnkgYW5vdGhlciB0aHJlYWQiCitTdGFja092ZXJmbG93ICAgICAgICAgICAgICAgICJTdGFjayBvdmVyZmxvdyBkZXRlY3RlZCBmb3IgT3Blbk1QIHRocmVhZCAjJTEkZCIKK1N0YWNrT3ZlcmxhcCAgICAgICAgICAgICAgICAgIlN0YWNrIG92ZXJsYXAgZGV0ZWN0ZWQuICIKK0Fzc2VydGlvbkZhaWx1cmUgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsdXJlIGF0ICUxJHMoJTIkZCkuIgorQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgbmV3IHVzZXIgdGhyZWFkLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIkluaXRpYWxpemluZyAlMSRzLCBidXQgZm91bmQgJTIkcyBhbHJlYWR5IGluaXRpYWxpemVkLiIKK0NhbnRPcGVuRmlsZUZvclJlYWRpbmcgICAgICAgIkNhbm5vdCBvcGVuIGZpbGUgXCIlMSRzXCIgZm9yIHJlYWRpbmc6IgorQ2FudEdldEVudlZhciAgICAgICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudFNldEVudlZhciAgICAgICAgICAgICAgICAiU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudEdldEVudmlyb25tZW50ICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCBmYWlsZWQ6IgorQmFkQm9vbFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcz1cIiUyJHNcIjogV3JvbmcgdmFsdWUsIGJvb2xlYW4gZXhwZWN0ZWQuIgorU1NQTm90QnVpbHRJbiAgICAgICAgICAgICAgICAiTm8gSGVscGVyIFRocmVhZCBzdXBwb3J0IGJ1aWx0IGluIHRoaXMgT01QIGxpYnJhcnkuIgorU1BQU290ZlRlcm1pbmF0ZUZhaWxlZCAgICAgICAiSGVscGVyIHRocmVhZCBmYWlsZWQgdG8gc29mdCB0ZXJtaW5hdGUuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkLiIKK1JlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgICAgIlJlYWwtdGltZSBzY2hlZHVsaW5nIHBvbGljeSBpcyBub3Qgc3VwcG9ydGVkLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIk9NUCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0IG1heGltdW0gcHJpb3JpdHkgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kuICIKK0NhbnRDaGFuZ2VNb25pdG9yUHJpb3JpdHkgICAgIkNoYW5naW5nIHByaW9yaXR5IG9mIHRoZSBtb25pdG9yIHRocmVhZCBmYWlsZWQ6IgorTW9uaXRvcldpbGxTdGFydmUgICAgICAgICAgICAiRGVhZGxvY2tzIGFyZSBoaWdobHkgcG9zc2libGUgZHVlIHRvIG1vbml0b3IgdGhyZWFkIHN0YXJ2YXRpb24uIgorQ2FudFNldE1vbml0b3JTdGFja1NpemUgICAgICAiVW5hYmxlIHRvIHNldCBtb25pdG9yIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRTZXRXb3JrZXJTdGFja1NpemUgICAgICAgIlVuYWJsZSB0byBzZXQgT01QIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRJbml0VGhyZWFkQXR0cnMgICAgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiIKK0NhbnREZXN0cm95VGhyZWFkQXR0cnMgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgZGVzdHJveWluZyBmYWlsZWQ6IgorQ2FudFNldFdvcmtlclN0YXRlICAgICAgICAgICAiT01QIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitDYW50U2V0TW9uaXRvclN0YXRlICAgICAgICAgICJNb25pdG9yIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitOb1Jlc291cmNlc0ZvcldvcmtlclRocmVhZCAgICJTeXN0ZW0gdW5hYmxlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIE9NUCB0aHJlYWQ6IgorTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgbW9uaXRvciB0aHJlYWQ6IgorQ2FudFRlcm1pbmF0ZVdvcmtlclRocmVhZCAgICAiVW5hYmxlIHRvIHRlcm1pbmF0ZSBPTVAgdGhyZWFkOiIKK1NjaGVkdWxlS2luZE91dE9mUmFuZ2UgICAgICAgIldyb25nIHNjaGVkdWxlIHR5cGUgJTEkZCwgc2VlIDxvbXAuaD4gb3IgPG9tcF9saWIuaD4gZmlsZSBmb3IgdGhlIGxpc3Qgb2YgdmFsdWVzIHN1cHBvcnRlZC4iCitVbmtub3duU2NoZWR1bGluZ1R5cGUgICAgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBcIiUxJGRcIi4iCitJbnZhbGlkVmFsdWUgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorU21hbGxWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gc21hbGwuIgorTGFyZ2VWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gbGFyZ2UuIgorU3RnSW52YWxpZFZhbHVlICAgICAgICAgICAgICAiJTEkczogXCIlMiRzXCIgaXMgYW4gaW52YWxpZCB2YWx1ZTsgaWdub3JlZC4iCitCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCAgICAgICIlMSRzIHJlbGVhc2UgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitCYXJyR2F0aGVyVmFsdWVJbnZhbGlkICAgICAgICIlMSRzIGdhdGhlciB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgc3VwcG9ydGVkIG9ubHkgb24gZGVidWcgYnVpbGRzOyBpZ25vcmVkLiIKK1BhclJhbmdlU3ludGF4ICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvcjogVXNhZ2U6ICUxJHM9WyByb3V0aW5lPTxmdW5jPiB8IGZpbGVuYW1lPTxmaWxlPiB8IHJhbmdlPTxsYj46PHViPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IGV4Y2xfcmFuZ2U9PGxiPjo8dWI+IF0sLi4uIgorVW5iYWxhbmNlZFF1b3RlcyAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90ZXMgaW4gJTEkcy4iCitFbXB0eVN0cmluZyAgICAgICAgICAgICAgICAgICJFbXB0eSBzdHJpbmcgc3BlY2lmaWVkIGZvciAlMSRzOyBpZ25vcmVkLiIKK0xvbmdWYWx1ZSAgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgaXMgdG9vIGxvbmc7IGlnbm9yZWQuIgorSW52YWxpZENsYXVzZSAgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBjbGF1c2UgaW4gXCIlMiRzXCIuIgorRW1wdHlDbGF1c2UgICAgICAgICAgICAgICAgICAiRW1wdHkgY2xhdXNlIGluICUxJHMuIgorSW52YWxpZENodW5rICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkIGNodW5rIHNpemUuIgorTGFyZ2VDaHVuayAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0byBsYXJnZSBjaHVuayBzaXplLiIKK0lnbm9yZUNodW5rICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaWdub3JlZC4iCitDYW50R2V0UHJvY0ZyZXEgICAgICAgICAgICAgICJDYW5ub3QgZ2V0IHByb2Nlc3NvciBmcmVxdWVuY3ksIHVzaW5nIHplcm8gS01QX0lUVF9QUkVQQVJFX0RFTEFZLiIKK0VudlBhcmFsbGVsV2FybiAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgcGFyYWxsZWwgcmVnaW9uOyBpZ25vcmVkLiIKK0FmZlBhcmFtRGVmaW5lZCAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBoYXMgYmVlbiBzcGVjaWZpZWQgYWxyZWFkeSwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmSW52YWxpZFBhcmFtICAgICAgICAgICAgICAiJTEkczogcGFyYW1ldGVyIGludmFsaWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXMgICAgICAgICAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXNGb3JMb2dpYyAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgZm9yIGxvZ2ljYWwgb3IgcGh5c2ljYWwgdHlwZSwgaWdub3JpbmcgXCIlMiRkXCIuIgorQWZmTm9QYXJhbSAgICAgICAgICAgICAgICAgICAiJTEkczogJyUyJHMnIHR5cGUgZG9lcyBub3QgdGFrZSBhbnkgaW50ZWdlciBwYXJhbWV0ZXJzLCBpZ25vcmluZyB0aGVtLiIKK0FmZk5vUHJvY0xpc3QgICAgICAgICAgICAgICAgIiUxJHM6IHByb2NsaXN0IG5vdCBzcGVjaWZpZWQgd2l0aCBleHBsaWNpdCBhZmZpbml0eSB0eXBlLCB1c2luZyBcIm5vbmVcIi4iCitBZmZQcm9jTGlzdE5vVHlwZSAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBzcGVjaWZpZWQsIHNldHRpbmcgYWZmaW5pdHkgdHlwZSB0byBcImV4cGxpY2l0XCIuIgorQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkIHdpdGhvdXQgXCJleHBsaWNpdFwiIGFmZmluaXR5IHR5cGUsIHByb2NsaXN0IGlnbm9yZWQuIgorQWZmU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmWmVyb1N0cmlkZSAgICAgICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKHplcm8gc3RyaWRlKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlN0YXJ0R3JlYXRlckVuZCAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICglMiRkID4gJTMkZCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdHJpZGVMZXNzWmVybyAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA8ICUzJGQgJiBzdHJpZGUgPCAwKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlJhbmdlVG9vQmlnICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICgoJTIkZC0lMyRkKS8lNCRkIHRvbyBiaWcpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcyBpcyBkZWZpbmVkLiAlMyRzIHdpbGwgYmUgaWdub3JlZC4iCitBZmZOb3RTdXBwb3J0ZWQgICAgICAgICAgICAgICIlMSRzOiBhZmZpbml0eSBub3Qgc3VwcG9ydGVkLCB1c2luZyBcImRpc2FibGVkXCIuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgb25seSBzdXBwb3J0ZWQgZm9yIEludGVsKFIpIHByb2Nlc3NvcnMuIgorR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkICAgICIlMSRzOiBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfYWZmX3NldF9ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIGNhbGwgbm90IGZvdW5kLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHRoZSBPUyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBhZmZpbml0eS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIHJldHVybmVkICUyJGQuIgorQWZmQ2FudEdldE1hc2tTaXplICAgICAgICAgICAiJTEkczogY2Fubm90IGRldGVybWluZSBwcm9wZXIgYWZmaW5pdHkgbWFzayBzaXplLiIKK1BhcnNlU2l6ZUludFdhcm4gICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6ICUzJHMuIgorUGFyc2VFeHRyYUNoYXJzV2FybiAgICAgICAgICAiJTEkczogZXh0cmEgdHJhaWxpbmcgY2hhcmFjdGVycyBpZ25vcmVkOiBcIiUyJHNcIi4iCitVbmtub3duRm9yY2VSZWR1Y3Rpb24gICAgICAgICIlMSRzOiB1bmtub3duIG1ldGhvZCBcIiUyJHNcIi4iCitUaW1lclVzZUdldHRpbWVvZmRheSAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgaXMgdW5kZWZpbmVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJOZWVkTW9yZVBhcmFtICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBcIiUxJHNcIiBuZWVkcyBhZGRpdGlvbmFsIHBhcmFtZXRlciwgZS5nLiAnY2xvY2tfZ2V0dGltZSwyJy4gVXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVySW52YWxpZFBhcmFtICAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBwYXJhbWV0ZXIgXCIlMSRzXCIgaXMgaW52YWxpZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyR2V0dGltZUZhaWxlZCAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBmYWlsZWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lclVua25vd25GdW5jdGlvbiAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrIGZ1bmN0aW9uIHVua25vd24gKGlnbm9yaW5nIHZhbHVlIFwiJTEkc1wiKS4iCitVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBkZXRlY3RlZC4iCitEaXNwYXRjaE1hbnlUaHJlYWRzICAgICAgICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSBhbmFseXRpY2FsIGd1aWRlZCBzY2hlZHVsaW5nIC0gc3dpdGNoaW5nIHRvIGl0ZXJhdGl2ZSBndWlkZWQgc2NoZWR1bGluZy4iCitJdHRMb29rdXBGYWlsZWQgICAgICAgICAgICAgICJpdHRub3RpZnk6IExvb2t1cCBvZiBcIiUxJHNcIiBmdW5jdGlvbiBpbiBcIiUyJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitJdHRMb2FkTGliRmFpbGVkICAgICAgICAgICAgICJpdHRub3RpZnk6IExvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0QWxsTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBBbGwgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0T2JqTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBPYmplY3Qgc3RhdGUgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0TWFya05vdGlmRGlzYWJsZWQgICAgICAgICAiaXR0bm90aWZ5OiBNYXJrIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dFVubG9hZExpYkZhaWxlZCAgICAgICAgICAgIml0dG5vdGlmeTogVW5sb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0NhbnRGb3JtVGhyVGVhbSAgICAgICAgICAgICAgIkNhbm5vdCBmb3JtIGEgdGVhbSB3aXRoICUxJGQgdGhyZWFkcywgdXNpbmcgJTIkZCBpbnN0ZWFkLiIKK0FjdGl2ZUxldmVsc05lZ2F0aXZlICAgICAgICAgIlJlcXVlc3RlZCBudW1iZXIgb2YgYWN0aXZlIHBhcmFsbGVsIGxldmVscyBcIiUxJGRcIiBpcyBuZWdhdGl2ZTsgaWdub3JlZC4iCitBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgZXhjZWVkcyBzdXBwb3J0ZWQgbGltaXQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmb2xsb3dpbmcgbGltaXQgdmFsdWUgd2lsbCBiZSB1c2VkOiBcIiUxJGRcIi4iCitTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCAgICAgICJrbXBfc2V0X2xpYnJhcnkgbXVzdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgc2VyaWFsIHRocmVhZDsgaWdub3JlZC4iCitGYXRhbFN5c0Vycm9yICAgICAgICAgICAgICAgICJGYXRhbCBzeXN0ZW0gZXJyb3IgZGV0ZWN0ZWQuIgorT3V0T2ZIZWFwTWVtb3J5ICAgICAgICAgICAgICAiT3V0IG9mIGhlYXAgbWVtb3J5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIF9fS01QX1JFR0lTVEVSRURfTElCIGVudiB2YXIgZmFpbGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGxpYnJhcnkgd2l0aCBlbnYgdmFyIGZhaWxlZC4iCitVc2luZ19pbnRfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50X1ZhbHVlICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkdVwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50NjRfVmFsdWUgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitVc2luZ19zdHJfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitNYXhWYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1heGltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01pblZhbHVlVXNpbmcgICAgICAgICAgICAgICAgIiUxJHMgbWluaW11bSB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorTWVtb3J5QWxsb2NGYWlsZWQgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiIKK0ZpbGVOYW1lVG9vTG9uZyAgICAgICAgICAgICAgIkZpbGUgbmFtZSB0b28gbG9uZy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb2NrIHRhYmxlIG92ZXJmbG93LiIKK01hbnlUaHJlYWRzRm9yVFBEaXJlY3RpdmUgICAgIlRvbyBtYW55IHRocmVhZHMgdG8gdXNlIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlLiIKK0FmZmluaXR5SW52YWxpZE1hc2sgICAgICAgICAgIiUxJHM6IGludmFsaWQgbWFzay4iCitXcm9uZ0RlZmluaXRpb24gICAgICAgICAgICAgICJXcm9uZyBkZWZpbml0aW9uLiIKK1RMU1NldFZhbHVlRmFpbGVkICAgICAgICAgICAgIldpbmRvd3MqIE9TOiBUTFMgU2V0IFZhbHVlIGZhaWxlZC4iCitUTFNPdXRPZkluZGV4ZXMgICAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIG91dCBvZiBpbmRleGVzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlBET05FIGRpcmVjdGl2ZSBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBETyBkaXJlY3RpdmUuIgorQ2FudEdldE51bUF2YWlsQ1BVICAgICAgICAgICAiQ2Fubm90IGdldCBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuIgorQXNzdW1lZE51bUNQVSAgICAgICAgICAgICAgICAiQXNzdW1lZCBudW1iZXIgb2YgQ1BVcyBpcyAyLiIKK0Vycm9ySW5pdGlhbGl6ZUFmZmluaXR5ICAgICAgIkVycm9yIGluaXRpYWxpemluZyBhZmZpbml0eSAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZUaHJlYWRzTWF5TWlncmF0ZSAgICAgICAgICJUaHJlYWRzIG1heSBtaWdyYXRlIGFjcm9zcyBhbGwgYXZhaWxhYmxlIE9TIHByb2NzIChncmFudWxhcml0eSBzZXR0aW5nIHRvbyBjb2Fyc2UpLiIKK0FmZklnbm9yZUludmFsaWRQcm9jSUQgICAgICAgIklnbm9yaW5nIGludmFsaWQgT1MgcHJvYyBJRCAlMSRkLiIKK0FmZk5vVmFsaWRQcm9jSUQgICAgICAgICAgICAgIk5vIHZhbGlkIE9TIHByb2MgSURzIHNwZWNpZmllZCAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICAgICIlMSRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGUgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGVMaW5lICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0ZpbGVNc2dFeGl0aW5nICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSBleGl0aW5nLiIKK0ZpbGVMaW5lTXNnRXhpdGluZyAgICAgICAgICAgIiUxJHMsIGxpbmUgJTIkZDogJTMkcyAtIGV4aXRpbmcuIgorQ29uc3RydWN0SWRlbnRJbnZhbGlkICAgICAgICAiQ29uc3RydWN0IGlkZW50aWZpZXIgaW52YWxpZC4iCitUaHJlYWRJZGVudEludmFsaWQgICAgICAgICAgICJUaHJlYWQgaWRlbnRpZmllciBpbnZhbGlkLiIKK1JUTE5vdEluaXRpYWxpemVkICAgICAgICAgICAgInJ1bnRpbWUgbGlicmFyeSBub3QgaW5pdGlhbGl6ZWQuIgorVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgICAgICAiSW5jb25zaXN0ZW50IFRIUkVBRFBSSVZBVEUgY29tbW9uIGJsb2NrIGRlY2xhcmF0aW9ucyBhcmUgbm9uLWNvbmZvcm1pbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGFyZSB1bnN1cHBvcnRlZC4gRWl0aGVyIGFsbCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9ja3MgbXVzdCBiZSBkZWNsYXJlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGljYWxseSwgb3IgdGhlIGxhcmdlc3QgaW5zdGFuY2Ugb2YgZWFjaCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHJlZmVyZW5jZWQgZmlyc3QgZHVyaW5nIHRoZSBydW4uIgorQ2FudFNldFRocmVhZEFmZk1hc2sgICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgYWZmaW5pdHkgbWFzay4iCitDYW50U2V0VGhyZWFkUHJpb3JpdHkgICAgICAgICJDYW5ub3Qgc2V0IHRocmVhZCBwcmlvcml0eS4iCitDYW50Q3JlYXRlVGhyZWFkICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHRocmVhZC4iCitDYW50Q3JlYXRlRXZlbnQgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGV2ZW50LiIKK0NhbnRTZXRFdmVudCAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgZXZlbnQuIgorQ2FudENsb3NlSGFuZGxlICAgICAgICAgICAgICAiQ2Fubm90IGNsb3NlIGhhbmRsZS4iCitVbmtub3duTGlicmFyeVR5cGUgICAgICAgICAgICJVbmtub3duIGxpYnJhcnkgdHlwZTogJTEkZC4iCitSZWFwTW9uaXRvckVycm9yICAgICAgICAgICAgICJNb25pdG9yIGRpZCBub3QgcmVhcCBwcm9wZXJseS4iCitSZWFwV29ya2VyRXJyb3IgICAgICAgICAgICAgICJXb3JrZXIgdGhyZWFkIGZhaWxlZCB0byBqb2luLiIKK0NoYW5nZVRocmVhZEFmZk1hc2tFcnJvciAgICAgIkNhbm5vdCBjaGFuZ2UgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorVGhyZWFkc01pZ3JhdGUgICAgICAgICAgICAgICAiJTEkczogVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgJTIkZCBpbm5lcm1vc3QgbGV2ZWxzIG9mIG1hY2hpbmUiCitEZWNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBkZWNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitJbmNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBpbmNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitCb3VuZFRvT1NQcm9jU2V0ICAgICAgICAgICAgICIlMSRzOiBJbnRlcm5hbCB0aHJlYWQgJTIkZCBib3VuZCB0byBPUyBwcm9jIHNldCAlMyRzIgorQWZmQ2FwYWJsZVVzZUNwdWluZm8gICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmVXNlR2xvYkNwdWlkICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGluZm8iCitBZmZDYXBhYmxlVXNlRmxhdCAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBkZWZhdWx0IFwiZmxhdFwiIHRvcG9sb2d5IgorQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGxvY2FsIGNwdWlkIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbyAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmRmxhdFRvcG9sb2d5ICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIGFzc3VtbWluZyBcImZsYXRcIiB0b3BvbG9neSIKK0luaXRPU1Byb2NTZXRSZXNwZWN0ICAgICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgcmVzcGVjdGVkOiAlMiRzIgorSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QgICAgICAiJTEkczogSW5pdGlhbCBPUyBwcm9jIHNldCBub3QgcmVzcGVjdGVkOiAlMiRzIgorQXZhaWxhYmxlT1NQcm9jICAgICAgICAgICAgICAiJTEkczogJTIkZCBhdmFpbGFibGUgT1MgcHJvY3MiCitVbmlmb3JtICAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBVbmlmb3JtIHRvcG9sb2d5IgorTm9uVW5pZm9ybSAgICAgICAgICAgICAgICAgICAiJTEkczogTm9udW5pZm9ybSB0b3BvbG9neSIKK1RvcG9sb2d5ICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcCAoW10gPT4gbGV2ZWwgbm90IGluIG1hcCk6IgorT1NQcm9jVG9QYWNrYWdlICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyA8bj4gbWFwcyB0byA8bj50aCBwYWNrYWdlIGNvcmUgMCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPU1Byb2NNYXBUb1BhY2sgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byAlMyRzIgorQ2hhbmdlQWZmTWFzayAgICAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgY2hhbmdlZCBhZmZpbml0eSBtYXNrIGZyb20gJTMkcyB0byAlNCRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCwgVFBVICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQsIENQVSAlNCRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSFQgZW5hYmxlZDsgJTIkZCBwYWNrYWdlczsgJTMkZCBUUFU7ICU0JGQgVFBVcyBwZXIgcGFja2FnZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGRpc2FibGVkOyAlMiRkIHBhY2thZ2VzIgorQmFycmllcnNJbkRpZmZlcmVudE9yZGVyICAgICAiVGhyZWFkcyBlbmNvdW50ZXJlZCBiYXJyaWVycyBpbiBkaWZmZXJlbnQgb3JkZXIuICIKK0Z1bmN0aW9uRXJyb3IgICAgICAgICAgICAgICAgIkZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK1RvcG9sb2d5RXh0cmEgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK1dyb25nTWVzc2FnZUNhdGFsb2cgICAgICAgICAgIkluY29tcGF0aWJsZSBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IFZlcnNpb24gXCIlMiRzXCIgZm91bmQsIHZlcnNpb24gXCIlMyRzXCIgZXhwZWN0ZWQuIgorU3RnSWdub3JlZCAgICAgICAgICAgICAgICAgICAiJTEkczogaWdub3JlZCBiZWNhdXNlICUzJHMgaGFzIGJlZW4gZGVmaW5lZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsICUyIC0tIG5hbWUgYW5kIHZhbHVlIG9mIGlnbm9yZWQgdmFyaWFibGUsICUzIC0tIG5hbWUgb2YgdmFyaWFibGUgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBvdmVycmlkZXMgJTMkcyBzcGVjaWZpZWQgYmVmb3JlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIgLS0gbmFtZSBhbmQgdmFsdWUgb2YgdGhlIG92ZXJyaWRpbmcgdmFyaWFibGUsICUzIC0tIG5hbWUgb2Ygb3ZlcnJpZGVuIHZhcmlhYmxlLgorCisjIC0tLSBPcGVuTVAgZXJyb3JzIGRldGVjdGVkIGF0IHJ1bnRpbWUgLS0tCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIE9wZW5NUCBjb25zdHJ1Y3QgKGZvcm1hdHRlZCB3aXRoICJQcmFnbWEiIGZvcm1hdCkuCisjCitDbnNCb3VuZFRvV29ya3NoYXJpbmcgICAgICAgICIlMSRzIG11c3QgYmUgYm91bmQgdG8gYSB3b3JrLXNoYXJpbmcgb3Igd29yay1xdWV1aW5nIGNvbnN0cnVjdCB3aXRoIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc0RldGVjdGVkRW5kICAgICAgICAgICAgICAgIkRldGVjdGVkIGVuZCBvZiAlMSRzIHdpdGhvdXQgZmlyc3QgZXhlY3V0aW5nIGEgY29ycmVzcG9uZGluZyBiZWdpbm5pbmcuIgorQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSAgICAiSXRlcmF0aW9uIHJhbmdlIHRvbyBsYXJnZSBpbiAlMSRzLiIKK0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQgICAgIiUxJHMgbXVzdCBub3QgaGF2ZSBhIGxvb3AgaW5jcmVtZW50IHRoYXQgZXZhbHVhdGVzIHRvIHplcm8uIgorIworIyAgICAlMSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgT3Blbk1QIGNvbnN0cnVjdCwgJTIgLS0gdGhlIG5hbWUgb2YgdGhlIHNlY29uZCBvbmUgKGJvdGggZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0V4cGVjdGVkRW5kICAgICAgICAgICAgICAgIkV4cGVjdGVkIGVuZCBvZiAlMSRzOyAlMiRzLCBob3dldmVyLCBoYXMgbW9zdCByZWNlbnRseSBiZWd1biBleGVjdXRpb24uIgorQ25zSW52YWxpZE5lc3RpbmcgICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMiCitDbnNNdWx0aXBsZU5lc3RpbmcgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgZXhlY3V0aW9uIG9mIG9uZSBwYXJhbGxlbCBpdGVyYXRpb24vc2VjdGlvbiBvZiAlMiRzIgorQ25zTmVzdGluZ1NhbWVOYW1lICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgb2YgdGhlIHNhbWUgbmFtZSIKK0Nuc05vT3JkZXJlZENsYXVzZSAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBcIm9yZGVyZWRcIiBjbGF1c2UiCitDbnNOb3RJblRhc2tDb25zdHJ1Y3QgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBidXQgbm90IHdpdGhpbiBhbnkgb2YgaXRzIFwidGFza1wiIGNvbnN0cnVjdHMiCitDbnNUaHJlYWRzQXRCYXJyaWVyICAgICAgICAgICJPbmUgdGhyZWFkIGF0ICUxJHMgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXQgJTIkcy4iCisKKyMgTmV3IGVycm9ycworQ2FudENvbm5lY3QgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyIKK0NhbnRDb25uZWN0VXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvICUxJHMgLSBVc2luZyAlMiRzIgorTGliTm90U3VwcG9ydCAgICAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK0xpYk5vdFN1cHBvcnRGb3IgICAgICAgICAgICAgIiUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzIGZvciAlMyRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitTdGF0aWNMaWJOb3RTdXBwb3J0ICAgICAgICAgICJTdGF0aWMgJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK0R5bklSTUx3b1VzZUlybWwgICAgICAgICAgICAgIktNUF9EWU5BTUlDX01PREU9aXJtbCBjYW5ub3QgYmUgdXNlZCB3aXRoIEtNUF9VU0VfSVJNTD0wIgorSXR0VW5rbm93bkdyb3VwICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBVbmtub3duIGdyb3VwIFwiJTIkc1wiIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIi4iCitJdHRFbnZWYXJUb29Mb25nICAgICAgICAgICAgICJpdHRub3RpZnk6IEVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIHRvbyBsb25nOiBBY3R1YWwgbGVuZ3RocyBpcyAlMiRsdSwgbWF4IGFsbG93ZWQgbGVuZ3RoIGlzICUzJGx1LiIKK0FmZlVzZUdsb2JDcHVpZEwxMSAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgbG9jYWwgY3B1aWQgbGVhZiAxMSBpbmZvIgorQWZmSW5mb1N0ciAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcy4iCitBZmZJbmZvU3RyU3RyICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gJTMkcy4iCitPU1Byb2NUb1BoeXNpY2FsVGhyZWFkTWFwICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXA6IgorQWZmVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAiJTEkczogdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitBZmZQYXJzZUZpbGVuYW1lICAgICAgICAgICAgICIlMSRzOiBwYXJzaW5nICUyJHMuIgorTXNnRXhpdGluZyAgICAgICAgICAgICAgICAgICAiJTEkcyAtIGV4aXRpbmcuIgorSW5jb21wYXRpYmxlTGlicmFyeSAgICAgICAgICAiSW5jb21wYXRpYmxlICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcyBmb3VuZC4iCitJdHRGdW5jdGlvbkVycm9yICAgICAgICAgICAgICJpdHRub3RpZnk6IEZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK0l0dFVua25vd25FcnJvciAgICAgICAgICAgICAgIml0dG5vZmlmeTogRXJyb3IgIyUxJGQuIgorRW52TWlkZGxlV2FybiAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBwYXJhbGxlbCByZWdpb24gb3IgY2VydGFpbiBBUEkgY2FsbHM7IGlnbm9yZWQuIgorQ25zTG9ja05vdERlc3Ryb3llZCAgICAgICAgICAiTG9jayBpbml0aWFsaXplZCBhdCAlMSRzKCUzJGQpIHdhcyBub3QgZGVzdHJveWVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIsICUzLCAlNCAtLSBmaWxlLCBmdW5jLCBsaW5lLCBjb2wKK0NhbnRMb2FkQmFsVXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBkZXRlcm1pbmUgbWFjaGluZSBsb2FkIGJhbGFuY2UgLSBVc2luZyAlMSRzIgorQWZmTm90Q2FwYWJsZVVzZVB0aHJlYWQgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK0FmZlVzZVB0aHJlYWQgICAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK1JtbExvYWRMaWJGYWlsZWQgICAgICAgICAgICAgIkxvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQ6IgorUm1sTG9va3VwRmFpbGVkICAgICAgICAgICAgICAiTG9va3VwIG9mIFwiJTEkc1wiIGZ1bmN0aW9uIGZhaWxlZDoiCitSbWxCdWZmZXJUb29TbWFsbCAgICAgICAgICAgICJCdWZmZXIgdG9vIHNtYWxsLiIKK1JtbFVua25vd25FcnJvciAgICAgICAgICAgICAgIkVycm9yICMlMSRkLiIKK050aFN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIKK050aFNwYWNlc05vdEFsbG93ZWQgICAgICAgICAgIiUxJHM6IFNwYWNlcyBiZXR3ZWVuIGRpZ2l0cyBhcmUgbm90IGFsbG93ZWQgXCIlMiRzXCIuIgorQWZmU3RyUGFyc2VGaWxlbmFtZSAgICAgICAgICAiJTEkczogJTIkcyAtIHBhcnNpbmcgJTMkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBzcGVjaWZpZWQgdmlhIGttcF9zZXRfZGVmYXVsdHMoKSBvbiB0aGlzIG1hY2hpbmUgYmVjYXVzZSBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwcm9jZXNzb3IgZ3JvdXAuIgorQWZmVHlwZUNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSB0eXBlIFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmR3JhbkNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcIiUxJHNcIiB3aXRoIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMsIHVzaW5nIFwiJTIkc1wiLiIKK0FmZldpbmRvd3NQcm9jR3JvdXBNYXAgICAgICAgIiUxJHM6IE1hcHBpbmcgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwIDxpPiBwcm9jIDxqPiB0byBPUyBwcm9jIDY0KjxpPis8aj4uIgorQWZmT1NQcm9jVG9Hcm91cCAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwICUzJGQgcHJvYyAlNCRkIgorQWZmQmFsYW5jZWROb3RBdmFpbCAgICAgICAgICAiJTEkczogQWZmaW5pdHkgYmFsYW5jZWQgaXMgbm90IGF2YWlsYWJsZS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT1jb3JlIHdpbGwgYmUgdXNlZC4iCitFbnZMb2NrV2FybiAgICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IE9NUCBsb2NrIGNhbGwgb3IgY3JpdGljYWwgc2VjdGlvbjsgaWdub3JlZC4iCitGdXRleE5vdFN1cHBvcnRlZCAgICAgICAgICAgICJmdXRleCBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkOyAlMSRzPSUyJHMgaWdub3JlZC4iCitBZmZHcmFuVXNpbmcgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT0lMiRzIHdpbGwgYmUgdXNlZC4iCitBZmZUaHJQbGFjZUludmFsaWQgICAgICAgICAgICIlMSRzOiBpbnZhbGlkIHZhbHVlIFwiJTIkc1wiLCB2YWxpZCBmb3JtYXQgaXMgXCJuQyxtVFssa09dXCIuIgorQWZmVGhyUGxhY2VVbnN1cHBvcnRlZCAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiIKK0FmZlRoclBsYWNlTWFueUNvcmVzICAgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IHRvbyBtYW55IGNvcmVzIHJlcXVlc3RlZC4iCitTeW50YXhFcnJvclVzaW5nICAgICAgICAgICAgICIlMSRzOiBzeW50YXggZXJyb3IsIHVzaW5nICUyJHMuIgorQWRhcHRpdmVOb3RTdXBwb3J0ZWQgICAgICAgICAiJTEkczogQWRhcHRpdmUgbG9ja3MgYXJlIG5vdCBzdXBwb3J0ZWQ7IHVzaW5nIHF1ZXVpbmcuIiAKK0VudlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIgCitFbnZTcGFjZXNOb3RBbGxvd2VkICAgICAgICAgICIlMSRzOiBTcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkIFwiJTIkc1wiLiIgCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBISU5UUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBIaW50cy4gSGludCBtYXkgYmUgcHJpbnRlZCBhZnRlciBhIG1lc3NhZ2UuIFVzdWFsbHkgaXQgaXMgbG9uZ2VyIGV4cGxhbmF0aW9uIHRleHQgb3Igc3VnZ2VzdGlvbi4KKyMgVG8gbWFpbnRhaW4gaGludCBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgaGludHMgdG8gdGhlIGVuZC4KKworU3VibWl0QnVnUmVwb3J0ICAgICAgICAgICAgICAiUGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgd2l0aCB0aGlzIG1lc3NhZ2UsIGNvbXBpbGUgYW5kIHJ1biAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kcyB1c2VkLCBhbmQgbWFjaGluZSBjb25maWd1cmF0aW9uIGluZm8gaW5jbHVkaW5nIG5hdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBhbmQgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9ucy4gRmFzdGVyIHJlc3BvbnNlIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2J0YWluZWQgYnkgaW5jbHVkaW5nIGFsbCBwcm9ncmFtIHNvdXJjZXMuIEZvciBpbmZvcm1hdGlvbiBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXR0aW5nIHRoaXMgaXNzdWUsIHBsZWFzZSBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5pbnRlbC5jb20vc29mdHdhcmUvcHJvZHVjdHMvc3VwcG9ydC8uIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgTkxTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzIFwiJTEkc1wiLiIKK0NoYW5nZVN0YWNrTGltaXQgICAgICAgICAgICAgIlBsZWFzZSB0cnkgY2hhbmdpbmcgdGhlIHNoZWxsIHN0YWNrIGxpbWl0IG9yIGFkanVzdGluZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT01QX1NUQUNLU0laRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCitVbnNldF9BTExfVEhSRUFEUyAgICAgICAgICAgICJDb25zaWRlciB1bnNldHRpbmcgS01QX0FMTF9USFJFQURTIGFuZCBPTVBfVEhSRUFEX0xJTUlUIChpZiBlaXRoZXIgaXMgc2V0KS4iCitTZXRfQUxMX1RIUkVBRFBSSVZBVEUgICAgICAgICJDb25zaWRlciBzZXR0aW5nIEtNUF9BTExfVEhSRUFEUFJJVkFURSB0byBhIHZhbHVlIGxhcmdlciB0aGFuICUxJGQuIgorUG9zc2libGVTeXN0ZW1MaW1pdE9uVGhyZWFkcyAiVGhpcyBjb3VsZCBhbHNvIGJlIGR1ZSB0byBhIHN5c3RlbS1yZWxhdGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iCitEdXBsaWNhdGVMaWJyYXJ5ICAgICAgICAgICAgICJUaGlzIG1lYW5zIHRoYXQgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBPcGVuTVAgcnVudGltZSBoYXZlIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua2VkIGludG8gdGhlIHByb2dyYW0uIFRoYXQgaXMgZGFuZ2Vyb3VzLCBzaW5jZSBpdCBjYW4gZGVncmFkZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJmb3JtYW5jZSBvciBjYXVzZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGJlc3QgdGhpbmcgdG8gZG8gaXMgdG8gZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZSBPcGVuTVAgcnVudGltZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvY2VzcywgZS5nLiBieSBhdm9pZGluZyBzdGF0aWMgbGlua2luZyBvZiB0aGUgT3Blbk1QICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bnRpbWUgaW4gYW55IGxpYnJhcnkuIEFzIGFuIHVuc2FmZSwgdW5zdXBwb3J0ZWQsIHVuZG9jdW1lbnRlZCB3b3JrYXJvdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBLTVBfRFVQTElDQVRFX0xJQl9PSz1UUlVFIHRvIGFsbG93ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwcm9ncmFtIHRvIGNvbnRpbnVlIHRvIGV4ZWN1dGUsIGJ1dCB0aGF0IG1heSBjYXVzZSBjcmFzaGVzIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbGVudGx5IHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGh0dHA6Ly93d3cuaW50ZWwuY29tL3NvZnR3YXJlL3Byb2R1Y3RzL3N1cHBvcnQvLiIKK05hbWVDb21lc0Zyb21fQ1BVSU5GT19GSUxFICAgIlRoaXMgbmFtZSBpcyBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgS01QX0NQVUlORk9fRklMRS4iCitOb3RFbm91Z2hNZW1vcnkgICAgICAgICAgICAgICJTZWVtcyBhcHBsaWNhdGlvbiByZXF1aXJlZCB0b28gbXVjaCBtZW1vcnkuIgorVmFsaWRCb29sVmFsdWVzICAgICAgICAgICAgICAiVXNlIFwiMFwiLCBcIkZBTFNFXCIuIFwiLkYuXCIsIFwib2ZmXCIsIFwibm9cIiBhcyBmYWxzZSB2YWx1ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMVwiLCBcIlRSVUVcIiwgXCIuVC5cIiwgXCJvblwiLCBcInllc1wiIGFzIHRydWUgdmFsdWVzLiIKK0J1ZmZlck92ZXJmbG93ICAgICAgICAgICAgICAgIlBlcmhhcHMgdG9vIG1hbnkgdGhyZWFkcy4iCitSdW5uaW5nQXRNYXhQcmlvcml0eSAgICAgICAgICJEZWNyZWFzZSBwcmlvcml0eSBvZiBhcHBsaWNhdGlvbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyB3aWxsIGFsbG93IHRoZSBtb25pdG9yIHRocmVhZCBydW4gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gb3RoZXIgdGhyZWFkcy4iCitDaGFuZ2VNb25pdG9yU3RhY2tTaXplICAgICAgICJUcnkgY2hhbmdpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFIG9yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitDaGFuZ2VXb3JrZXJTdGFja1NpemUgICAgICAgICJUcnkgY2hhbmdpbmcgT01QX1NUQUNLU0laRSBhbmQvb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0luY3JlYXNlV29ya2VyU3RhY2tTaXplICAgICAgIlRyeSBpbmNyZWFzaW5nIE9NUF9TVEFDS1NJWkUgb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0RlY3JlYXNlV29ya2VyU3RhY2tTaXplICAgICAgIlRyeSBkZWNyZWFzaW5nIE9NUF9TVEFDS1NJWkUuIgorRGVjcmVhc2VfTlVNX1RIUkVBRFMgICAgICAgICAiVHJ5IGRlY3JlYXNpbmcgdGhlIHZhbHVlIG9mIE9NUF9OVU1fVEhSRUFEUy4iCitJbmNyZWFzZU1vbml0b3JTdGFja1NpemUgICAgICJUcnkgaW5jcmVhc2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUuIgorRGVjcmVhc2VNb25pdG9yU3RhY2tTaXplICAgICAiVHJ5IGRlY3JlYXNpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlTnVtYmVyT2ZUaHJlYWRzSW5Vc2UgIlRyeSBkZWNyZWFzaW5nIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB1c2Ugc2ltdWx0YW5lb3VzbHkuIgorRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQgICAgICAiV2lsbCB1c2UgZGVmYXVsdCBzY2hlZHVsZSB0eXBlICglMSRzKS4iCitHZXROZXdlckxpYnJhcnkgICAgICAgICAgICAgICJJdCBjb3VsZCBiZSBhIHJlc3VsdCBvZiB1c2luZyBhbiBvbGRlciBPTVAgbGlicmFyeSB3aXRoIGEgbmV3ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZXIgb3IgbWVtb3J5IGNvcnJ1cHRpb24uIFlvdSBtYXkgY2hlY2sgdGhlIHByb3BlciBPTVAgbGlicmFyeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiIKK0NoZWNrRW52VmFyICAgICAgICAgICAgICAgICAgIkNoZWNrICUxJHMgZW52aXJvbm1lbnQgdmFyaWFibGUsIGl0cyB2YWx1ZSBpcyBcIiUyJHNcIi4iCitHZXROZXdlcklPTVBMaWJyYXJ5ICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gdXNlIGFuICUxJHMgbGlicmFyeSB0aGF0IHN1cHBvcnRzICUyJHMgaW50ZXJmYWNlIHdpdGggdmVyc2lvbiAlMyRzLiIKK0dldE5ld2VySVJNTExpYnJhcnkgICAgICAgICAgIllvdSBtYXkgd2FudCB0byB1c2UgYW4gJTEkcyBsaWJyYXJ5IHdpdGggdmVyc2lvbiAlMiRzLiIKK0JhZEV4ZUZvcm1hdCAgICAgICAgICAgICAgICAgIlN5c3RlbSBlcnJvciAjMTkzIGlzIFwiQmFkIGZvcm1hdCBvZiBFWEUgb3IgRExMIGZpbGVcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXN1YWxseSBpdCBtZWFucyB0aGUgZmlsZSBpcyBmb3VuZCwgYnV0IGl0IGlzIGNvcnJ1cHRlZCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIGZpbGUgZm9yIGFub3RoZXIgYXJjaGl0ZWN0dXJlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVjayB3aGV0aGVyIFwiJTEkc1wiIGlzIGEgZmlsZSBmb3IgJTIkcyBhcmNoaXRlY3R1cmUuIgorU3lzdGVtTGltaXRPblRocmVhZHMgICAgICAgICAiU3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZW5kIG9mIGZpbGUgIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWIyNGVjCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcC5oLnZhcgpAQCAtMCwwICsxLDgzIEBACisvKgorICogaW5jbHVkZS8yNS9pb21wLmgudmFyCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19JT01QX0gKKyMgICBkZWZpbmUgX19JT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICAkS01QX1ZFUlNJT05fTUFKT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgJEtNUF9WRVJTSU9OX01JTk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgICRLTVBfVkVSU0lPTl9CVUlMRAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiJEtNUF9CVUlMRF9EQVRFIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAga21wY19zZXRfZGVmYXVsdHMKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAga21wY19mcmVlCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fSU9NUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L2lvbXBfbGliLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0ZjAxMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L2lvbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjYgQEAKKyEgaW5jbHVkZS8yNS9pb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQyMDYxICQKKyEgJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIG9tcF9pbnRlZ2VyX2tpbmQgYW5kIG9tcF9sb2dpY2FsX2tpbmQgYXBwZWFyIHRvIGJlIHByZWRlZmluZWQgYnkgZ2NjIGFuZAorISoqKiBnZm9ydHJhbiAoZGVmaW5pdGlvbnMgZG8gbm90IGFwcGVhciBpbiB0aGUgb21wLmggLyBvbXBfbGliLmggL29tcF9saWIuZikuCishKioqIG9tcF9yZWFsX2tpbmQgaXMgbm90IHByZWRlZmluZWQsIGhvd2V2ZXIuCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgPSA0CisKKyEqKioKKyEqKioga21wXyogdHlwZSBleHRlbnNpb25zCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICA9ICRLTVBfSU5UX1BUUl9LSU5ECisKKyEqKioKKyEqKioga21wXyogZW50cnkgcG9pbnRzCishKioqCisKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemVfcworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2RlZmF1bHRzCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGludGVnZXIga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGludGVnZXIga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9saWJyYXJ5CisgICAgICAgIGludGVnZXIga21wX2dldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9tYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfcmVhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2ZyZWUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF93YXJuaW5nc19vbgorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29mZgorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXAuaC52YXIgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzZjQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcC5oLnZhcgpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIGluY2x1ZGUvMjUvb21wLmgudmFyCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19PTVBfSAorIyAgIGRlZmluZSBfX09NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgJEtNUF9WRVJTSU9OX01BSk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICRLTVBfVkVSU0lPTl9NSU5PUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAkS01QX1ZFUlNJT05fQlVJTEQKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIiRLTVBfQlVJTERfREFURSIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgICAgICBkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICBvbXBjX3NldF9udW1fdGhyZWFkcworIyAgICAgICBkZWZpbmUgb21wX3NldF9keW5hbWljICAgICAgICBvbXBjX3NldF9keW5hbWljCisjICAgICAgIGRlZmluZSBvbXBfc2V0X25lc3RlZCAgICAgICAgIG9tcGNfc2V0X25lc3RlZAorCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICBrbXBjX3NldF9kZWZhdWx0cworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisKKyAgICAvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9sb2NrICAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X2xvY2sgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbG9jayAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKworICAgIC8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbmVzdF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX25lc3RfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RfbG9jayAgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X25lc3RfbG9jayAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X25lc3RfbG9jayAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mLnZhciBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw0NzIgQEAKKyEgaW5jbHVkZS8yNS9vbXBfbGliLmYudmFyCishICRSZXZpc2lvbjogNDIxODEgJAorISAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgID0gaW50X3B0cl9raW5kKCkKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICckS01QX0JVSUxEX0RBVEUnCisgICAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gMjAwNTA1CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIAorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhciBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJmNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsMjU2IEBACishIGluY2x1ZGUvMjUvb21wX2xpYi5mOTAudmFyCishICRSZXZpc2lvbjogNDIwNjEgJAorISAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gY19pbnQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gY19mbG9hdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2RvdWJsZV9raW5kICAgICAgICA9IGNfZG91YmxlCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IDIwMDUwNQorICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5oLnZhciBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1MjdlMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw0NjAgQEAKKyEgaW5jbHVkZS8yNS9vbXBfbGliLmgudmFyCishICRSZXZpc2lvbjogNDIxODEgJAorISAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworCisgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICckS01QX0JVSUxEX0RBVEUnCisgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IDIwMDUwNQorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXAuaC52YXIgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9pb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmEzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9pb21wLmgudmFyCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBpbmNsdWRlLzMwL2lvbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX0lPTVBfSAorIyAgIGRlZmluZSBfX0lPTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fSU9NUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXBfbGliLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvaW9tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyYThlMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsODMgQEAKKyEgaW5jbHVkZS8zMC9pb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQyMDYxICQKKyEgJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIG9tcF9pbnRlZ2VyX2tpbmQgYW5kIG9tcF9sb2dpY2FsX2tpbmQgYXBwZWFyIHRvIGJlIHByZWRlZmluZWQgYnkgZ2NjIGFuZAorISoqKiBnZm9ydHJhbiAoZGVmaW5pdGlvbnMgZG8gbm90IGFwcGVhciBpbiB0aGUgb21wLmggLyBvbXBfbGliLmggL29tcF9saWIuZikuCishKioqIG9tcF9yZWFsX2tpbmQgaXMgbm90IHByZWRlZmluZWQsIGhvd2V2ZXIuCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgPSA0CisKKyEqKioKKyEqKioga21wXyogdHlwZSBleHRlbnNpb25zCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9ICRLTVBfSU5UX1BUUl9LSU5ECisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gJEtNUF9JTlRfUFRSX0tJTkQKKworISoqKgorISoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEqKioKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfZGVmYXVsdHMKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgICAgIGV4dGVybmFsIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9tYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfcmVhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2ZyZWUKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzM0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgb21wY19zZXRfZHluYW1pYworIyAgICAgICBkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIyAgICAgICBkZWZpbmUgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICBvbXBjX2dldF90ZWFtX3NpemUKKworCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhciBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw2MzUgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCishICRSZXZpc2lvbjogNDIxODEgJAorISAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2ZGRmZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDM1NSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgorISAkUmV2aXNpb246IDQyMDYxICQKKyEgJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBjX3NpemVfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGNfaW50cHRyX3QKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkgICA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDYzMSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0MjE4MSAkCishICREYXRlOiAyMDEzLTAzLTI2IDE1OjA0OjQ1IC0wNTAwIChUdWUsIDI2IE1hciAyMDEzKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9ICRPTVBfVkVSU0lPTgorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWViMzhjCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcC5oLnZhcgpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIGluY2x1ZGUvNDAvaW9tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MTY3NCAkCisgKiAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fSU9NUF9ICisjICAgZGVmaW5lIF9fSU9NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgJEtNUF9WRVJTSU9OX01BSk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICRLTVBfVkVSU0lPTl9NSU5PUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAkS01QX1ZFUlNJT05fQlVJTEQKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIiRLTVBfQlVJTERfREFURSIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0ga21wX2NhbmNlbF9raW5kX3QgeworICAgICAgICBrbXBfY2FuY2VsX3BhcmFsbGVsICA9IDEsCisgICAgICAgIGttcF9jYW5jZWxfbG9vcCA9IDIsCisgICAgICAgIGttcF9jYW5jZWxfc2VjdGlvbnMgID0gMywKKyAgICAgICAga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisgICAgfSBrbXBfY2FuY2VsX2tpbmRfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoa21wX2NhbmNlbF9raW5kX3QpOworICAgIAorIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fSU9NUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXBfbGliLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjNjNmOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsODMgQEAKKyEgaW5jbHVkZS80MC9pb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQxNjc0ICQKKyEgJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIG9tcF9pbnRlZ2VyX2tpbmQgYW5kIG9tcF9sb2dpY2FsX2tpbmQgYXBwZWFyIHRvIGJlIHByZWRlZmluZWQgYnkgZ2NjIGFuZAorISoqKiBnZm9ydHJhbiAoZGVmaW5pdGlvbnMgZG8gbm90IGFwcGVhciBpbiB0aGUgb21wLmggLyBvbXBfbGliLmggL29tcF9saWIuZikuCishKioqIG9tcF9yZWFsX2tpbmQgaXMgbm90IHByZWRlZmluZWQsIGhvd2V2ZXIuCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgPSA0CisKKyEqKioKKyEqKioga21wXyogdHlwZSBleHRlbnNpb25zCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9ICRLTVBfSU5UX1BUUl9LSU5ECisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gJEtNUF9JTlRfUFRSX0tJTkQKKworISoqKgorISoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEqKioKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfZGVmYXVsdHMKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgICAgIGV4dGVybmFsIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9tYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfcmVhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2ZyZWUKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGQ0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBpbmNsdWRlLzQwL29tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MTY3NCAkCisgKiAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisgICAgLyogT3Blbk1QIDQuMCAqLworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9kZWZhdWx0X2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fZGV2aWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90ZWFtcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fbnVtICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfY2FuY2VsbGF0aW9uICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogSW50ZWwgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIC8qIE9wZW5NUCA0LjAgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9wcm9jX2JpbmRfdCB7CisgICAgICAgIG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgICAgICBvbXBfcHJvY19iaW5kX3RydWUgPSAxLAorICAgICAgICBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzLAorICAgICAgICBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKyAgICB9IG9tcF9wcm9jX2JpbmRfdDsKKworICAgIGV4dGVybiBvbXBfcHJvY19iaW5kX3QgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcHJvY19iaW5kICh2b2lkKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhciBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5YjJmMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw3NTAgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmYudmFyCishICRSZXZpc2lvbjogNDE2NzQgJAorISAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICckS01QX0JVSUxEX0RBVEUnCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9ICRPTVBfVkVSU0lPTgorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCkgY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fZGV2aWNlc18nOjpvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyIGIvcmMxL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSw0NDAgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKKyEgJFJldmlzaW9uOiA0MTY3NCAkCishICREYXRlOiAyMDEyLTA2LTA1IDA4OjMzOjM1IC0wNTAwIChUdWUsIDA1IEp1biAyMDEyKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNTQ2IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQxNjc0ICQKKyEgJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIURJUiQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9ICRPTVBfVkVSU0lPTgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZmx0X2RldmljZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9zaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGVhbXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3Byb2NzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9wYXJhbGxlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX2RldmljZXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGVhbXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfbWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3JlYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2ZyZWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vbiApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29mZiApCishRElSJCBFTkRJRgorIURJUiQgRU5ESUYKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcC5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzYwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wLmgKQEAgLTAsMCArMSwzNDMxIEBACisvKiEgXGZpbGUgKi8KKy8qCisgKiBrbXAuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyODE2ICQKKyAqICREYXRlOiAyMDEzLTExLTExIDE1OjMzOjM3IC0wNjAwIChNb24sIDExIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0gKKyNkZWZpbmUgS01QX0gKKworLyogI2RlZmluZSBCVUlMRF9QQVJBTExFTF9PUkRFUkVEIDEgKi8KKworLyogVGhpcyBmaXggcmVwbGFjZXMgZ2V0dGltZW9mZGF5IHdpdGggY2xvY2tfZ2V0dGltZSBmb3IgYmV0dGVyIHNjYWxhYmlsaXR5IG9uCisgICB0aGUgQWx0aXguICBSZXF1aXJlcyB1c2VyIGNvZGUgdG8gYmUgbGlua2VkIHdpdGggLWxydC4KKyovCisvLyNkZWZpbmUgRklYX1NHSV9DTE9DSworCisvKiBEZWZpbmVzIGZvciBPcGVuTVAgMy4wIHRhc2tpbmcgYW5kIGF1dG8gc2NoZWR1bGluZyAqLworCisjaWYgT01QXzMwX0VOQUJMRUQKKworIyBpZm5kZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisjICBkZWZpbmUgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEIDEKKyMgZW5kaWYKKworI2RlZmluZSBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAgMAorI2RlZmluZSBUQVNLX0NVUlJFTlRfUVVFVUVEICAgICAgMQorCisjZGVmaW5lIFRBU0tfREVRVUVfQklUUyAgICAgICAgICA4ICAvLyBVc2VkIHNvbGVseSB0byBkZWZpbmUgVEFTS19ERVFVRV9TSVpFIGFuZCBUQVNLX0RFUVVFX01BU0suCisjZGVmaW5lIFRBU0tfREVRVUVfU0laRSAgICAgICAgICAoIDEgPDwgVEFTS19ERVFVRV9CSVRTICkKKyNkZWZpbmUgVEFTS19ERVFVRV9NQVNLICAgICAgICAgICggVEFTS19ERVFVRV9TSVpFIC0gMSApCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyNkZWZpbmUgVEFTS19TVEFDS19FTVBUWSAgICAgICAgIDAgIC8vIGVudHJpZXMgd2hlbiB0aGUgc3RhY2sgaXMgZW1wdHkKKworI2RlZmluZSBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgICAgNSAgLy8gVXNlZCB0byBkZWZpbmUgVEFTS19TVEFDS19TSVpFIGFuZCBUQVNLX1NUQUNLX01BU0sKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19TSVpFICAgICggMSA8PCBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgKSAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiBlYWNoIHRhc2sgc3RhY2sgYXJyYXkKKyNkZWZpbmUgVEFTS19TVEFDS19JTkRFWF9NQVNLICAgICggVEFTS19TVEFDS19CTE9DS19TSVpFIC0gMSApICAvLyBNYXNrIGZvciBkZXRlcm1pbmluZyBpbmRleCBpbnRvIHN0YWNrIGJsb2NrCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKyNkZWZpbmUgVEFTS19OT1RfUFVTSEVEICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEIDAKKyNkZWZpbmUgVEFTS19USUVEICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19VTlRJRUQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFTS19FWFBMSUNJVCAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19JTVBMSUNJVCAgICAgICAgICAgIDAKKworI2VuZGlmICAvLyBPTVBfMzBfRU5BQkxFRAorCisjZGVmaW5lIEtNUF9DQU5DRUxfVEhSRUFEUworI2RlZmluZSBLTVBfVEhSRUFEX0FUVFIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisvKiAgaW5jbHVkZSA8Y3R5cGUuaD4gZG9uJ3QgdXNlOyBwcm9ibGVtcyB3aXRoIC9NRCBvbiBXaW5kb3dzKiBPUyBOVCBkdWUgdG8gYmFkIE1pY3Jvc29mdCBsaWJyYXJ5ICAqLworLyogIHNvbWUgbWFjcm9zIHByb3ZpZGVkIGJlbG93IHRvIHJlcGxhY2Ugc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgICovCisjaWZuZGVmIF9fQUJTT0ZUX1dJTgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2RlZmluZSBLTVBfSEFORExFX1NJR05BTFMgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOKQorCisjaWZkZWYgS01QX1NFVFZFUlNJT04KKy8qICBmcm9tIGZhY3RvcnkvSW5jbHVkZSwgdG8gZ2V0IFZFUlNJT05fU1RSSU5HIGVtYmVkZGVkIGZvciAnd2hhdCcgICovCisjaW5jbHVkZSAia2FpY29uZmlnLmgiCisjaW5jbHVkZSAiZXllLmgiCisjaW5jbHVkZSAib3duLmgiCisjaW5jbHVkZSAic2V0dmVyc2lvbi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIKKyNpZiBLTVBfT1NfVU5JWAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgIWRlZmluZWQgTlNJRyAmJiBkZWZpbmVkIF9OU0lHCisjICBkZWZpbmUgTlNJRyBfTlNJRworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVgKKyMgcHJhZ21hIHdlYWsgY2xvY2tfZ2V0dGltZQorI2VuZGlmCisKKy8qU2VsZWN0IGRhdGEgcGxhY2VtZW50IGluIE5VTUEgbWVtb3J5ICovCisjZGVmaW5lIE5PX0ZJUlNUX1RPVUNIIDAKKyNkZWZpbmUgRklSU1RfVE9VQ0ggMSAgICAgICAvKiBFeHBsb2l0IFNHSSdzIGZpcnN0IHRvdWNoIHBhZ2UgcGxhY2VtZW50IGFsZ28gKi8KKworLyogSWYgbm90IHNwZWNpZmllZCBvbiBjb21waWxlIGNvbW1hbmQgbGluZSwgYXNzdW1lIG5vIGZpcnN0IHRvdWNoICovCisjaWZuZGVmIEJVSUxEX01FTU9SWQorI2RlZmluZSBCVUlMRF9NRU1PUlkgTk9fRklSU1RfVE9VQ0gKKyNlbmRpZgorCisvLyAwIC0gbm8gZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiwgYWxpZ25tZW50OiA4LWJ5dGUgb24geDg2LCAxNi1ieXRlIG9uIHg2NC4KKy8vIDMgLSBmYXN0IGFsbG9jYXRpb24gdXNpbmcgc3luYywgbm9uLXN5bmMgZnJlZSBsaXN0cyBvZiBhbnkgc2l6ZSwgbm9uLXNlbGYgZnJlZSBsaXN0cyBvZiBsaW1pdGVkIHNpemUuCisjaWZuZGVmIFVTRV9GQVNUX01FTU9SWQorI2RlZmluZSBVU0VfRkFTVF9NRU1PUlkgMworI2VuZGlmCisKKy8vIEFzc3VtZSB1c2luZyBCR0VUIGNvbXBhcmVfZXhjaGFuZ2UgaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBsb2NrIGJ5IGRlZmF1bHQuCisjaWZuZGVmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2RlZmluZSBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgMQorI2VuZGlmCisKKy8vIFRlc3QgdG8gc2VlIGlmIHF1ZXVpbmcgbG9jayBpcyBiZXR0ZXIgdGhhbiBib290c3RyYXAgbG9jayBmb3IgYmdldAorLy8gI2lmbmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZGVmaW5lIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKy8vICNlbmRpZgorCisjaWZuZGVmIE5TRUNfUEVSX1NFQworIyBkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMCisjZW5kaWYKKworI2lmbmRlZiBVU0VDX1BFUl9TRUMKKyMgZGVmaW5lIFVTRUNfUEVSX1NFQyAxMDAwMDAwTAorI2VuZGlmCisKKy8vIEZvciBlcnJvciBtZXNzYWdlcworI2RlZmluZSBLTVBfSU9NUF9OQU1FICAgICAgICJJbnRlbChSKSBPTVAiCisKKy8qIQorQGluZ3JvdXAgQkFTSUNfVFlQRVMKK0B7CisqLworCisvLyBGSVhNRSBET1hZR0VOLi4uIG5lZWQgdG8gZ3JvdXAgdGhlc2UgZmxhZ3Mgc29tZWhvdyAoTWFraW5nIHRoZW0gYW4gYW5vbnltb3VzIGVudW0gd291bGQgZG8gaXQuLi4pCisvKiEKK1ZhbHVlcyBmb3IgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGlkZW50X3QgdG8gZGVzY3JpYmUgdGhlIGZpZWxkcy4KKyovCisvKiEgVXNlIHRyYW1wb2xpbmUgZm9yIGludGVybmFsIG1pY3JvdGFza3MgKi8KKyNkZWZpbmUgS01QX0lERU5UX0lNQiAgICAgICAgICAgICAweDAxCisvKiEgVXNlIGMtc3R5bGUgaWRlbnQgc3RydWN0dXJlICovCisjZGVmaW5lIEtNUF9JREVOVF9LTVBDICAgICAgICAgICAgMHgwMgorLyogMHgwNCBpcyBubyBsb25nZXIgdXNlZCAqLworLyohIEVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBhdXRvLXBhcmFsbGVsaXphdGlvbiAqLworI2RlZmluZSBLTVBfSURFTlRfQVVUT1BBUiAgICAgICAgIDB4MDgKKy8qISBDb21waWxlciBnZW5lcmF0ZXMgYXRvbWljIHJlZHVjdGlvbiBvcHRpb24gZm9yIGttcGNfcmVkdWNlKiAqLworI2RlZmluZSBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSAgIDB4MTAKKy8qISBUbyBtYXJrIGEgJ2JhcnJpZXInIGRpcmVjdGl2ZSBpbiB1c2VyIGNvZGUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfRVhQTCAgICAweDIwCisvKiEgVG8gTWFyayBpbXBsaWNpdCBiYXJyaWVycy4gKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSyAgICAgIDB4MDFDMAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX0ZPUiAgICAgICAweDAwNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyAgMHgwMEMwCisKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TSU5HTEUgICAgMHgwMTQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDB4MDFDMAorCisvKiEKKyAqIFRoZSBpZGVudCBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBzb3VyY2UgbG9jYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZW50IHsKKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMTsgICAvKio8ICBtaWdodCBiZSB1c2VkIGluIEZvcnRyYW47IHNlZSBhYm92ZSAgKi8KKyAgICBrbXBfaW50MzIgZmxhZ3M7ICAgICAgICAvKio8ICBhbHNvIGYuZmxhZ3M7IEtNUF9JREVOVF94eHggZmxhZ3M7IEtNUF9JREVOVF9LTVBDIGlkZW50aWZpZXMgdGhpcyB1bmlvbiBtZW1iZXIgICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzI7ICAgLyoqPCAgbm90IHJlYWxseSB1c2VkIGluIEZvcnRyYW4gYW55IG1vcmU7IHNlZSBhYm92ZSAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYnV0IGN1cnJlbnRseSB1c2VkIGZvciBzdG9yaW5nIHJlZ2lvbi1zcGVjaWZpYyBJVFQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzM7ICAgLyoqPCBzb3VyY2VbNF0gaW4gRm9ydHJhbiwgZG8gbm90IHVzZSBmb3IgQysrICAqLworICAgIGNoYXIgY29uc3QgKnBzb3VyY2U7ICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIHNlbWktY29sb24gc2VwYXJhdGVkIGZpZWxkcyB3aGljaCBkZXNjcmliZSB0aGUgc291cmNlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGFuZCBhIHBhaXIgb2YgbGluZSBudW1iZXJzIHRoYXQgZGVsaW1pdCB0aGUgY29uc3RydWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBpZGVudF90OworLyohCitAfQorKi8KKworLy8gU29tZSBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tkYXRhICBrbXBfdGFza2RhdGFfdDsKK3R5cGVkZWYgdW5pb24gIGttcF90YXNrX3RlYW0ga21wX3Rhc2tfdGVhbV90OwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV9wOwordHlwZWRlZiB1bmlvbiAga21wX2luZm8gICAgICBrbXBfaW5mb19wOwordHlwZWRlZiB1bmlvbiAga21wX3Jvb3QgICAgICBrbXBfcm9vdF9wOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUGFjayB0d28gMzItYml0IHNpZ25lZCBpbnRlZ2VycyBpbnRvIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyICovCisvKiBUb0RvOiBGaXggd29yZCBvcmRlcmluZyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgS01QX1BBQ0tfNjQoSElHSF8zMixMT1dfMzIpIFwKKyAgICAoIChrbXBfaW50NjQpICgoKChrbXBfdWludDY0KShISUdIXzMyKSk8PDMyKSB8IChrbXBfdWludDY0KShMT1dfMzIpKSApCisKKworLyoKKyAqIEdlbmVyaWMgc3RyaW5nIG1hbmlwdWxhdGlvbiBtYWNyb3MuCisgKiBBc3N1bWUgdGhhdCBfeCBpcyBvZiB0eXBlIGNoYXIgKgorICovCisjZGVmaW5lIFNLSVBfV1MoX3gpICAgICB7IHdoaWxlICgqKF94KSA9PSAnICcgfHwgKihfeCkgPT0gJ1x0JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfRElHSVRTKF94KSB7IHdoaWxlICgqKF94KSA+PSAnMCcgJiYgKihfeCkgPD0gJzknKSAoX3gpKys7IH0KKyNkZWZpbmUgU0tJUF9UTyhfeCxfYykgIHsgd2hpbGUgKCooX3gpICE9ICdcMCcgJiYgKihfeCkgIT0gKF9jKSkgKF94KSsrOyB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX01BWCggeCwgeSApICggKHgpID4gKHkpID8gKHgpIDogKHkpICkKKyNkZWZpbmUgS01QX01JTiggeCwgeSApICggKHgpIDwgKHkpID8gKHgpIDogKHkpICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBFbnVtZXJhdGlvbiB0eXBlcyAqLworCitlbnVtIGttcF9zdGF0ZV90aW1lciB7CisgICAgdHNfc3RvcCwKKyAgICB0c19zdGFydCwKKyAgICB0c19wYXVzZSwKKworICAgIHRzX2xhc3Rfc3RhdGUKK307CisKK2VudW0gZHluYW1pY19tb2RlIHsKKyAgICBkeW5hbWljX2RlZmF1bHQsCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGR5bmFtaWNfbG9hZF9iYWxhbmNlLAorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBkeW5hbWljX3JhbmRvbSwKKyAgICBkeW5hbWljX3RocmVhZF9saW1pdCwKKyAgICBkeW5hbWljX21heAorfTsKKworLyogZXh0ZXJuYWwgc2NoZWR1bGUgY29uc3RhbnRzLCBkdXBsaWNhdGUgZW51bSBvbXBfc2NoZWQgaW4gb21wLmggaW4gb3JkZXIgdG8gbm90IGluY2x1ZGUgaXQgaGVyZSAqLworI2lmbmRlZiBLTVBfU0NIRURfVFlQRV9ERUZJTkVECisjZGVmaW5lIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKK3R5cGVkZWYgZW51bSBrbXBfc2NoZWQgeworICAgIGttcF9zY2hlZF9sb3dlciAgICAgICAgICAgICA9IDAsICAgICAvLyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGFyZSBmb3Igcm91dGluZSBwYXJhbWV0ZXIgY2hlY2sKKyAgICAvLyBOb3RlOiBuZWVkIHRvIGFkanVzdCBfX2ttcF9zY2hfbWFwIGdsb2JhbCBhcnJheSBpbiBjYXNlIHRoaXMgZW51bSBpcyBjaGFuZ2VkCisgICAga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMSwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAoMzMpCisgICAga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMiwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgICAga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNCwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2F1dG8gICAgICAgICAgICAgICAgICAgICAoMzgpCisgICAga21wX3NjaGVkX3VwcGVyX3N0ZCAgICAgICAgID0gNSwgICAgIC8vIHVwcGVyIGJvdW5kIGZvciBzdGFuZGFyZCBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfbG93ZXJfZXh0ICAgICAgICAgPSAxMDAsICAgLy8gbG93ZXIgYm91bmQgb2YgSW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworICAgIGttcF9zY2hlZF90cmFwZXpvaWRhbCAgICAgICA9IDEwMSwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgKDM5KQorLy8gIGttcF9zY2hlZF9zdGF0aWNfc3RlYWwgICAgICA9IDEwMiwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfc3RlYWwgICAgICAgICAgICAgKDQ0KQorICAgIGttcF9zY2hlZF91cHBlciAgICAgICAgICAgICA9IDEwMiwKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgLy8gZGVmYXVsdCBzY2hlZHVsaW5nCit9IGttcF9zY2hlZF90OworI2VuZGlmCisKKy8qIQorIEBpbmdyb3VwIFdPUktfU0hBUklORworICogRGVzY3JpYmVzIHRoZSBsb29wIHNjaGVkdWxlIHRvIGJlIHVzZWQgZm9yIGEgcGFyYWxsZWwgZm9yIGxvb3AuCisgKi8KK2VudW0gc2NoZWRfdHlwZSB7CisgICAga21wX3NjaF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBsb3dlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDMzLAorICAgIGttcF9zY2hfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgPSAzNSwKKyAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgPSAzNiwgICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gMzcsCisgICAga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgLyoqPCBhdXRvICovCisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gMzksCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19ncmVlZHkgICAgICAgICAgICAgPSA0MCwKKyAgICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgPSA0MSwKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgPSA0MiwKKyAgICBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgPSA0MywKKworICAgIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICA9IDQ0LCAgIC8qKjwgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3VwcGVyICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAvKio8IHVwcGVyIGJvdW5kIGZvciB1bm9yZGVyZWQgdmFsdWVzICovCisKKyAgICBrbXBfb3JkX2xvd2VyICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAvKio8IGxvd2VyIGJvdW5kIGZvciBvcmRlcmVkIHZhbHVlcywgbXVzdCBiZSBwb3dlciBvZiAyICovCisgICAga21wX29yZF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgID0gNjUsCisgICAga21wX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgICAgID0gNjYsICAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgICAgID0gNjcsCisgICAga21wX29yZF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgID0gNjgsCisgICAga21wX29yZF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gNjksCisgICAga21wX29yZF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgLyoqPCBvcmRlcmVkIGF1dG8gKi8KKyAgICBrbXBfb3JkX3RyYXBlem9pZGFsICAgICAgICAgICAgICAgPSA3MSwKKyAgICBrbXBfb3JkX3VwcGVyICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAvKio8IHVwcGVyIGJvdW5kIGZvciBvcmRlcmVkIHZhbHVlcyAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBTY2hlZHVsZXMgZm9yIERpc3RyaWJ1dGUgY29uc3RydWN0ICovCisgICAga21wX2Rpc3RyaWJ1dGVfc3RhdGljX2NodW5rZWQgICAgID0gOTEsICAgLyoqPCBkaXN0cmlidXRlIHN0YXRpYyBjaHVua2VkICovCisgICAga21wX2Rpc3RyaWJ1dGVfc3RhdGljICAgICAgICAgICAgID0gOTIsICAgLyoqPCBkaXN0cmlidXRlIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogRm9yIHRoZSAibm9tZXJnZSIgdmVyc2lvbnMsIGttcF9kaXNwYXRjaF9uZXh0KigpIHdpbGwgYWx3YXlzIHJldHVybgorICAgICAqIGEgc2luZ2xlIGl0ZXJhdGlvbi9jaHVuaywgZXZlbiBpZiB0aGUgbG9vcCBpcyBzZXJpYWxpemVkLiAgRm9yIHRoZQorICAgICAqIHNjaGVkdWxlIHR5cGVzIGxpc3RlZCBhYm92ZSwgdGhlIGVudGlyZSBpdGVyYXRpb24gdmVjdG9yIGlzIHJldHVybmVkCisgICAgICogaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIFRoaXMgZG9lc24ndCB3b3JrIGZvciBnY2MvZ2NvbXAgc2VjdGlvbnMuCisgICAgICovCisgICAga21wX25tX2xvd2VyICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgLyoqPCBsb3dlciBib3VuZCBmb3Igbm9tZXJnZSB2YWx1ZXMgKi8KKworICAgIGttcF9ubV9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgICA9IChrbXBfc2NoX3N0YXRpY19jaHVua2VkIC0ga21wX3NjaF9sb3dlciArIGttcF9ubV9sb3dlciksCisgICAga21wX25tX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgLyoqPCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9keW5hbWljX2NodW5rZWQgICAgICAgICAgICA9IDE2MywKKyAgICBrbXBfbm1fZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICAgPSAxNjQsICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgID0gMTY1LAorICAgIGttcF9ubV9hdXRvICAgICAgICAgICAgICAgICAgICAgICA9IDE2NiwgIC8qKjwgYXV0byAqLworICAgIGttcF9ubV90cmFwZXpvaWRhbCAgICAgICAgICAgICAgICA9IDE2NywKKworICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9zdGF0aWNfZ3JlZWR5ICAgICAgICAgICAgICA9IDE2OCwKKyAgICBrbXBfbm1fc3RhdGljX2JhbGFuY2VkICAgICAgICAgICAgPSAxNjksCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX25tX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgID0gMTcwLAorICAgIGttcF9ubV9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICA9IDE3MSwKKyAgICBrbXBfbm1fc3RhdGljX3N0ZWFsICAgICAgICAgICAgICAgPSAxNzIsICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBPTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKworICAgIGttcF9ubV9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICA9IDE5MywKKyAgICBrbXBfbm1fb3JkX3N0YXRpYyAgICAgICAgICAgICAgICAgPSAxOTQsICAvKio8IG9yZGVyZWQgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fb3JkX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgPSAxOTUsCisgICAga21wX25tX29yZF9ndWlkZWRfY2h1bmtlZCAgICAgICAgID0gMTk2LAorICAgIGttcF9ubV9vcmRfcnVudGltZSAgICAgICAgICAgICAgICA9IDE5NywKKyAgICBrbXBfbm1fb3JkX2F1dG8gICAgICAgICAgICAgICAgICAgPSAxOTgsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fb3JkX3RyYXBlem9pZGFsICAgICAgICAgICAgPSAxOTksCisgICAga21wX25tX3VwcGVyICAgICAgICAgICAgICAgICAgICAgID0gMjAwLCAgLyoqPCB1cHBlciBib3VuZCBmb3Igbm9tZXJnZSB2YWx1ZXMgKi8KKworICAgIGttcF9zY2hfZGVmYXVsdCA9IGttcF9zY2hfc3RhdGljICAvKio8IGRlZmF1bHQgc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KK307CisKKy8qIFR5cGUgdG8ga2VlcCBydW50aW1lIHNjaGVkdWxlIHNldCB2aWEgT01QX1NDSEVEVUxFIG9yIG9tcF9zZXRfc2NoZWR1bGUoKSAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Jfc2NoZWQgeworICAgIGVudW0gc2NoZWRfdHlwZSByX3NjaGVkX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIGNodW5rOworfSBrbXBfcl9zY2hlZF90OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbXTsgLy8gbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMKKworZW51bSBsaWJyYXJ5X3R5cGUgeworICAgIGxpYnJhcnlfbm9uZSwKKyAgICBsaWJyYXJ5X3NlcmlhbCwKKyAgICBsaWJyYXJ5X3R1cm5hcm91bmQsCisgICAgbGlicmFyeV90aHJvdWdocHV0Cit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgeworICAgIGNsb2NrX2Z1bmN0aW9uX2dldHRpbWVvZmRheSwKKyAgICBjbG9ja19mdW5jdGlvbl9jbG9ja19nZXR0aW1lCit9OworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIgMQorCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPIDEKKyNlbmRpZgorCitlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kIHsKKyAgICByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkID0gMCwKKyAgICBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgICAgICAgID0gKCAxIDw8IDggKSwKKyAgICBhdG9taWNfcmVkdWNlX2Jsb2NrICAgICAgICAgID0gKCAyIDw8IDggKSwKKyAgICB0cmVlX3JlZHVjZV9ibG9jayAgICAgICAgICAgID0gKCAzIDw8IDggKSwKKyAgICBlbXB0eV9yZWR1Y2VfYmxvY2sgICAgICAgICAgID0gKCA0IDw8IDggKQorfTsKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlCisvLyB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGUgY29uc2lzdHMgb2YgdHdvIGVudW0gdHlwZXMgdmFyaWFibGVzIHRoYXQgYXJlIHBhY2tlZCB0b2dldGhlciBpbnRvIDAtdGggYnl0ZSBhbmQgMS1zdCBieXRlOgorLy8gMDogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMDAwRkYgKSBpcyBhICdlbnVtIGJhcnJpZXJfdHlwZScgdmFsdWUgb2YgYmFycmllciB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjogYnNfcGxhaW5fYmFycmllciBvciBic19yZWR1Y3Rpb25fYmFycmllcgorLy8gMTogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMEZGMDAgKSBpcyBhIHJlZHVjdGlvbiBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgaW4gZmFzdCByZWR1Y3Rpb247CisvLyByZWR1Y3Rpb24gbWV0aG9kIGlzIG9mICdlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kJyB0eXBlIGFuZCBpdCdzIGRlZmluZWQgdGhlIHdheSBzbyB0aGF0IHRoZSBiaXRzIG9mIDAtdGggYnl0ZSBhcmUgZW1wdHksCisvLyBzbyBubyBuZWVkIHRvIGV4ZWN1dGUgYSBzaGlmdCBpbnN0cnVjdGlvbiB3aGlsZSBwYWNraW5nL3VucGFja2luZworCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUihyZWR1Y3Rpb25fbWV0aG9kLGJhcnJpZXJfdHlwZSkgXAorICAgICAgICAgICAgKCAoIHJlZHVjdGlvbl9tZXRob2QgKSB8ICggYmFycmllcl90eXBlICkgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gX3JlZHVjdGlvbl9tZXRob2QgKSggKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDBGRjAwICkgKSApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gYmFycmllcl90eXBlICkoICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDAwMEZGICkgKSApCisjZWxzZQorICAgICNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsYmFycmllcl90eXBlKSBcCisgICAgICAgICAgICAoIHJlZHVjdGlvbl9tZXRob2QgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBic19wbGFpbl9iYXJyaWVyICkKKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCx3aGljaF9yZWR1Y3Rpb25fYmxvY2spIFwKKyAgICAgICAgICAgICggKCBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApID09ICggd2hpY2hfcmVkdWN0aW9uX2Jsb2NrICkgKQorCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVIgXAorICAgICAgICAgICAgKCBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIoIHRyZWVfcmVkdWNlX2Jsb2NrLCBic19yZWR1Y3Rpb25fYmFycmllciApICkKKworICAgICNkZWZpbmUgVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9QTEFJTl9CQVJSSUVSIFwKKyAgICAgICAgICAgICggUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKCB0cmVlX3JlZHVjZV9ibG9jaywgYnNfcGxhaW5fYmFycmllciApICkKKyNlbmRpZgorCit0eXBlZGVmIGludCBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UOworCisvKiAtLSBlbmQgb2YgZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBVU0VfQ0JMS0RBVEEKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyMgaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogT25seSBMaW51eCogT1MgYW5kIFdpbmRvd3MqIE9TIHN1cHBvcnQgdGhyZWFkIGFmZmluaXR5LgorICovCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEIDEKKyNlbGlmIEtNUF9PU19EQVJXSU4gfHwgS01QX09TX0ZSRUVCU0QKKy8vIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWQKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgMAorI2Vsc2UKKyMgZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworZXh0ZXJuIHNpemVfdCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPiAwKQorIyBkZWZpbmUgS01QX0NQVV9TRVRTSVpFICAgICAgICAoX19rbXBfYWZmaW5fbWFza19zaXplICogQ0hBUl9CSVQpCisKKyMgaWYgS01QX09TX0xJTlVYCisvLworLy8gT24gTGludXgqIE9TLCB0aGUgbWFzayBpc2FjdHVhbGx5IGEgdmVjdG9yIG9mIGxlbmd0aCBfX2ttcF9hZmZpbl9tYXNrX3NpemUKKy8vIChpbiBieXRlcykuICBJdCBzaG91bGQgYmUgYWxsb2NhdGVkIG9uIGEgd29yZCBib3VuZGFyeS4KKy8vCisvLyBXQVJOSU5HISEhICBXZSBoYXZlIG1hZGUgdGhlIGJhc2UgdHlwZSBvZiB0aGUgYWZmaW5pdHkgbWFzayB1bnNpZ25lZCBjaGFyLAorLy8gaW4gb3JkZXIgdG8gZWxpbWluYXRlIGEgbG90IG9mIGNoZWNrcyB0aGF0IHRoZSB0cnVlIHN5c3RlbSBtYXNrIHNpemUgaXMKKy8vIHJlYWxseSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgKG9uIExpbnV4KiBPUykuCisvLworLy8gVEhFU0UgTUFDUk9TIFdPTidUIFdPUksgUFJPUEVSTFkgT04gQklHIEVORElBTiBNQUNISU5FUyEhIQorLy8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGttcF9hZmZpbl9tYXNrX3Q7CisKKyMgIGRlZmluZSBfS01QX0NQVV9TRVQoaSxtYXNrKSAgIChtYXNrW2kvQ0hBUl9CSVRdIHw9ICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKQorIyAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgICAgX0tNUF9DUFVfU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKyMgIGRlZmluZSBfS01QX0NQVV9JU1NFVChpLG1hc2spICghIShtYXNrW2kvQ0hBUl9CSVRdICYgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIENIQVJfQklUKSkpKQorIyAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAgX0tNUF9DUFVfSVNTRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorIyAgZGVmaW5lIF9LTVBfQ1BVX0NMUihpLG1hc2spICAgKG1hc2tbaS9DSEFSX0JJVF0gJj0gfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKQorIyAgZGVmaW5lIEtNUF9DUFVfQ0xSKGksbWFzaykgICAgX0tNUF9DUFVfQ0xSKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gfigoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHw9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZiBLTVBfT1NfV0lORE9XUworLy8KKy8vIE9uIFdpbmRvd3MqIE9TLCB0aGUgbWFzayBzaXplIGlzIDQgYnl0ZXMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIG9uCisvLyBJbnRlbChSKSA2NCBpdCBpcyA4IGJ5dGVzIHRpbWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGdyb3Vwcy4KKy8vCisKKyMgIGlmIEtNUF9BUkNIX1g4Nl82NAorCit0eXBlZGVmIHN0cnVjdCBHUk9VUF9BRkZJTklUWSB7CisgICAgS0FGRklOSVRZIG1hc2s7CisgICAgV09SRCBncm91cDsKKyAgICBXT1JEIHJlc2VydmVkWzNdOworfSBHUk9VUF9BRkZJTklUWTsKKwordHlwZWRlZiBEV09SRF9QVFIga21wX2FmZmluX21hc2tfdDsKKworZXh0ZXJuIGludCBfX2ttcF9udW1fcHJvY19ncm91cHM7CisKKyMgICBkZWZpbmUgX0tNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICAobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldIHw9ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgX0tNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgICghIShtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIChDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spIFwKKyAgICAgICAgX0tNUF9DUFVfSVNTRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0NMUihpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSAmPSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB+KCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIChDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSkpKSkKKworIyAgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spIFwKKyAgICAgICAgX0tNUF9DUFVfQ0xSKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgPSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gfigoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB8PSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKK3R5cGVkZWYgRFdPUkQgKCprbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCkoV09SRCk7CitleHRlcm4ga21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQ7CisKK3R5cGVkZWYgV09SRCAoKmttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50X3QpKHZvaWQpOworZXh0ZXJuIGttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50X3QgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudDsKKwordHlwZWRlZiBCT09MICgqa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkoSEFORExFLCBHUk9VUF9BRkZJTklUWSAqKTsKK2V4dGVybiBrbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHk7CisKK3R5cGVkZWYgQk9PTCAoKmttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpKEhBTkRMRSwgY29uc3QgR1JPVVBfQUZGSU5JVFkgKiwgR1JPVVBfQUZGSU5JVFkgKik7CitleHRlcm4ga21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5OworCitleHRlcm4gaW50IF9fa21wX2dldF9wcm9jX2dyb3VwKGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2spOworCisjICBlbHNlCisKK3R5cGVkZWYgRFdPUkQga21wX2FmZmluX21hc2tfdDsgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB3aW5iYXNlLmggKi8KKworIyAgIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgICAgKCoobWFzaykgfD0gKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgICAgKCEhKCoobWFzaykgJiAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgICAgKCoobWFzaykgJj0gfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spICAgICAgICgqKG1hc2spID0gMCkKKyMgICBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgICgqKGRlc3QpID0gKihzcmMpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWFzaykgKCoobWFzaykgPSB+KihtYXNrKSkKKyMgICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpICgqKGRlc3QpIHw9ICooc3JjKSkKKworIyAgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworLy8KKy8vIF9fa21wX2FsbG9jYXRlKCkgd2lsbCByZXR1cm4gbWVtb3J5IGFsbG9jYXRlZCBvbiBhIDQtYnl0ZXMgYm91bmRhcnkuCisvLyBhZnRlciB6ZXJvaW5nIGl0IC0gaXQgdGFrZXMgY2FyZSBvZiB0aG9zZSBhc3N1bXB0aW9ucyBzdGF0ZWQgYWJvdmUuCisvLworIyBkZWZpbmUgS01QX0NQVV9BTExPQyhwdHIpIFwKKyAgICAgICAgKHB0ciA9ICgoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKF9fa21wX2FmZmluX21hc2tfc2l6ZSkpKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFKHB0cikgX19rbXBfZnJlZShwdHIpCisKKy8vCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGluZGV4IGFuIGFycmF5IG9mIG1hc2tzLgorLy8gVGhlIGFycmF5IHNob3VsZCBiZSBkZWNsYXJlZCBhcyAia21wX2FmZmluaXR5X3QgKiIgYW5kIGFsbG9jYXRlZCB3aXRoCisvLyBzaXplICJfX2ttcF9hZmZpbml0eV9tYXNrX3NpemUgKiBsZW4iLiAgVGhlIG1hY3JvIHRha2VzIGNhcmUgb2YgdGhlIGZhY3QKKy8vIHRoYXQgb24gV2luZG93cyogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgcmVhbGx5IHRoZSBzaXplIG9mIHRoZSBtYXNrLCBidXQKKy8vIG9uIExpbnV4KiBPUywgc2l6ZW9mKGttcF9hZmZpbl90KSBpcyAxLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfSU5ERVgoYXJyYXksaSkgXAorICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoKChjaGFyICopKGFycmF5KSkgKyAoaSkgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpKQorCisvLworLy8gRGVjbGFyZSBsb2NhbCBjaGFyIGJ1ZmZlcnMgd2l0aCB0aGlzIHNpemUgZm9yIHByaW50aW5nIGRlYnVnIGFuZCBpbmZvCisvLyBtZXNzYWdlcywgdXNpbmcgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzaygpLgorLy8KKyNkZWZpbmUgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOICAgICAgICAxMDI0CisKK2VudW0gYWZmaW5pdHlfdHlwZSB7CisgICAgYWZmaW5pdHlfbm9uZSA9IDAsCisgICAgYWZmaW5pdHlfcGh5c2ljYWwsCisgICAgYWZmaW5pdHlfbG9naWNhbCwKKyAgICBhZmZpbml0eV9jb21wYWN0LAorICAgIGFmZmluaXR5X3NjYXR0ZXIsCisgICAgYWZmaW5pdHlfZXhwbGljaXQsCisjaWYgS01QX01JQworICAgIGFmZmluaXR5X2JhbGFuY2VkLAorI2VuZGlmCisgICAgYWZmaW5pdHlfZGlzYWJsZWQsICAvLyBub3QgdXNlZCBvdXRzaXplIHRoZSBlbnYgdmFyIHBhcnNlcgorICAgIGFmZmluaXR5X2RlZmF1bHQKK307CisKK2VudW0gYWZmaW5pdHlfZ3JhbiB7CisgICAgYWZmaW5pdHlfZ3Jhbl9maW5lID0gMCwKKyAgICBhZmZpbml0eV9ncmFuX3RocmVhZCwKKyAgICBhZmZpbml0eV9ncmFuX2NvcmUsCisgICAgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlLAorICAgIGFmZmluaXR5X2dyYW5fbm9kZSwKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAvLworICAgIC8vIFRoZSAiZ3JvdXAiIGdyYW51bGFyaXR5IGlzbid0IG5lY2Vzc3NhcmlseSBjb2Fyc2VyIHRoYW4gYWxsIG9mIHRoZQorICAgIC8vIG90aGVyIGxldmVscywgYnV0IHdlIHB1dCBpdCBsYXN0IGluIHRoZSBlbnVtLgorICAgIC8vCisgICAgYWZmaW5pdHlfZ3Jhbl9ncm91cCwKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBhZmZpbml0eV9ncmFuX2RlZmF1bHQKK307CisKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCB7CisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwgPSAwLCAvLyB0cnkgYWxsIChzdXBwb3J0ZWQpIG1ldGhvZHMsIGluIG9yZGVyCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkLAorICAgIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQsCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbywgLy8gS01QX0NQVUlORk9fRklMRSBpcyB1c2FibGUgb24gV2luZG93cyogT1MsIHRvbworI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAsCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0LAorICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdAorfTsKKworI2RlZmluZSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCAgICgtMSkKKworZXh0ZXJuIGVudW0gYWZmaW5pdHlfdHlwZSBfX2ttcF9hZmZpbml0eV90eXBlOyAvKiBBZmZpbml0eSB0eXBlICovCitleHRlcm4gZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW47IC8qIEFmZmluaXR5IGdyYW51bGFyaXR5ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzOyAvKiBjb3JyZXNwb25kaW5nIGludCB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9kdXBzOyAvKiBBZmZpbml0eSBkdXBsaWNhdGUgbWFza3MgKi8KK2V4dGVybiBlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZDsKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgLyogQWZmaW5pdHkgJ2NvbXBhY3QnIHZhbHVlICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X29mZnNldDsgLyogQWZmaW5pdHkgb2Zmc2V0IHZhbHVlICAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV92ZXJib3NlOyAvKiBXYXMgdmVyYm9zZSBzcGVjaWZpZWQgZm9yIEtNUF9BRkZJTklUWT8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfd2FybmluZ3M7IC8qIEtNUF9BRkZJTklUWSB3YXJuaW5ncyBlbmFibGVkID8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrOyAvKiBSZXNwZWN0IHByb2Nlc3MnIGluaXRpYWwgYWZmaW5pdHkgbWFzaz8gKi8KK2V4dGVybiBjaGFyICogX19rbXBfYWZmaW5pdHlfcHJvY2xpc3Q7IC8qIHByb2MgSUQgbGlzdCAqLworZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluaXR5X21hc2tzOworZXh0ZXJuIHVuc2lnbmVkIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKK2V4dGVybiBpbnQgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIGludCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvcik7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpbnQgd2hpY2gpOworCisjIGlmIEtNUF9PU19MSU5VWAorZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluaXR5X2dldF9mdWxsTWFzaygpOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KK2V4dGVybiBjaGFyIGNvbnN0ICogX19rbXBfY3B1aW5mb19maWxlOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8KKy8vIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBpbiBvbXAuaCAhISEKKy8vCit0eXBlZGVmIGVudW0ga21wX3Byb2NfYmluZF90IHsKKyAgICBwcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgIHByb2NfYmluZF90cnVlLAorICAgIHByb2NfYmluZF9tYXN0ZXIsCisgICAgcHJvY19iaW5kX2Nsb3NlLAorICAgIHByb2NfYmluZF9zcHJlYWQsCisgICAgcHJvY19iaW5kX2Rpc2FibGVkLAorICAgIHByb2NfYmluZF9pbnRlbCwgICAgLy8gdXNlIEtNUF9BRkZJTklUWSBpbnRlcmZhY2UKKyAgICBwcm9jX2JpbmRfZGVmYXVsdAorfSBrbXBfcHJvY19iaW5kX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgeworICAgIGttcF9wcm9jX2JpbmRfdCAqYmluZF90eXBlczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgdXNlZDsKK30ga21wX25lc3RlZF9wcm9jX2JpbmRfdDsKKworZXh0ZXJuIGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZDsKKworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjICBkZWZpbmUgS01QX1BMQUNFX0FMTCAgICAgICAoLTEpCisjICBkZWZpbmUgS01QX1BMQUNFX1VOREVGSU5FRCAoLTIpCisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIGVudW0ga21wX2NhbmNlbF9raW5kX3QgeworICAgIGNhbmNlbF9ub3JlcSA9IDAsCisgICAgY2FuY2VsX3BhcmFsbGVsID0gMSwKKyAgICBjYW5jZWxfbG9vcCA9IDIsCisgICAgY2FuY2VsX3NlY3Rpb25zID0gMywKKyAgICBjYW5jZWxfdGFza2dyb3VwID0gNAorfSBrbXBfY2FuY2VsX2tpbmRfdDsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgS01QX01JQworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9udW1fY29yZXM7CitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisKKy8vCisvLyBXZSBuZWVkIHRvIGF2b2lkIHVzaW5nIC0xIGFzIGEgR1RJRCBhcyArMSBpcyBhZGRlZCB0byB0aGUgZ3RpZAorLy8gd2hlbiBzdG9yaW5nIGl0IGluIGEgbG9jaywgYW5kIHRoZSB2YWx1ZSAwIGlzIHJlc2VydmVkLgorLy8KKyNkZWZpbmUgS01QX0dUSURfRE5FICAgICAgICAgICAgKC0yKSAgICAvKiBEb2VzIG5vdCBleGlzdCAqLworI2RlZmluZSBLTVBfR1RJRF9TSFVURE9XTiAgICAgICAoLTMpICAgIC8qIExpYnJhcnkgaXMgc2h1dHRpbmcgZG93biAqLworI2RlZmluZSBLTVBfR1RJRF9NT05JVE9SICAgICAgICAoLTQpICAgIC8qIE1vbml0b3IgdGhyZWFkIElEICovCisjZGVmaW5lIEtNUF9HVElEX1VOS05PV04gICAgICAgICgtNSkgICAgLyogSXMgbm90IGtub3duICovCisjZGVmaW5lIEtNUF9HVElEX01JTiAgICAgICAgICAgICgtNikgICAgLyogTWluaW1hbCBndGlkIGZvciBsb3cgYm91bmQgY2hlY2sgaW4gREVCVUcgKi8KKworI2RlZmluZSBfX2ttcF9nZXRfZ3RpZCgpICAgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorI2RlZmluZSBfX2ttcF9lbnRyeV9ndGlkKCkgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCkKKworI2RlZmluZSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpICAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKihfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+dGgudGhfdGVhbV9zZXJpYWxpemVkKSA/IDAgOiAqLyAvKiBUT0RPIHJlbW92ZSB0aGlzIGNoZWNrLCBpdCBpcyByZWR1bmRhbnQgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbIChndGlkKSBdLT50aC50aF9pbmZvLmRzLmRzX3RpZCApCisKKyNkZWZpbmUgX19rbXBfZ2V0X3RpZCgpICAgICAgICAgICAgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorI2RlZmluZSBfX2ttcF9ndGlkX2Zyb21fdGlkKHRpZCx0ZWFtKSAoIEtNUF9ERUJVR19BU1NFUlQoICh0aWQpID49IDAgJiYgKHRlYW0pICE9IE5VTEwgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbICh0aWQpIF0gLT4gdGgudGhfaW5mbyAuZHMuZHNfZ3RpZCApCisKKyNkZWZpbmUgX19rbXBfZ2V0X3RlYW0oKSAgICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRzWyAoX19rbXBfZ2V0X2d0aWQoKSkgXS0+IHRoLnRoX3RlYW0gKQorI2RlZmluZSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKSAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+IHRoLnRoX3RlYW0gKQorCisjZGVmaW5lIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCkgICggS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IDAgKSwgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0gKQorI2RlZmluZSBfX2ttcF9nZXRfdGhyZWFkKCkgICAgICAgICAgICAoIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIF9fa21wX2dldF9ndGlkKCkgKSApCisKKyAgICAvLyBSZXR1cm5zIGN1cnJlbnQgdGhyZWFkIChwb2ludGVyIHRvIGttcF9pbmZvX3QpLiBJbiBjb250cmFzdCB0byBfX2ttcF9nZXRfdGhyZWFkKCksIGl0IHdvcmtzCisgICAgLy8gd2l0aCByZWdpc3RlcmVkIGFuZCBub3QteWV0LXJlZ2lzdGVyZWQgdGhyZWFkcy4KKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHIpICAgKCBLTVBfREVCVUdfQVNTRVJUKCAodGhyKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyKS0+dGgudGhfaW5mby5kcy5kc19ndGlkICkKKworLy8gQVQ6IFdoaWNoIHdheSBpcyBjb3JyZWN0PworLy8gQVQ6IDEuIG5wcm9jID0gX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKy8vIEFUOiAyLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbV9ucHJvYzsKKyNkZWZpbmUgX19rbXBfZ2V0X3RlYW1fbnVtX3RocmVhZHMoZ3RpZCkgKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jICkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9VSU5UNjRfTUFYICAgICAgICAgKH4oKGttcF91aW50NjQpMTw8KChzaXplb2Yoa21wX3VpbnQ2NCkqKDE8PDMpKS0xKSkpCisKKyNkZWZpbmUgS01QX01JTl9OVEggICAgICAgICAgIDEKKworI2lmbmRlZiBLTVBfTUFYX05USAorIyAgaWZkZWYgUFRIUkVBRF9USFJFQURTX01BWAorIyAgICBkZWZpbmUgS01QX01BWF9OVEggICAgICAgICAgUFRIUkVBRF9USFJFQURTX01BWAorIyAgZWxzZQorIyAgICBkZWZpbmUgS01QX01BWF9OVEggICAgICAgICAgKDMyICogMTAyNCkKKyMgIGVuZGlmCisjZW5kaWYgLyogS01QX01BWF9OVEggKi8KKworI2lmZGVmIFBUSFJFQURfU1RBQ0tfTUlOCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICBQVEhSRUFEX1NUQUNLX01JTgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSU5fU1RLU0laRSAgICAgICAgICgoc2l6ZV90KSgzMiAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BWF9TVEtTSVpFICAgICAgICAgICh+KChzaXplX3QpMTw8KChzaXplb2Yoc2l6ZV90KSooMTw8MykpLTEpKSkKKworI2lmIEtNUF9BUkNIX1g4NgorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSg0ICogMTAyNCAqIDEwMjQpKQorIyBkZWZpbmUgS01QX0JBQ0tVUF9TVEtTSVpFICAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxzZQorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDEwMjQgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRSAgICAgKChzaXplX3QpKDY0ICogMTAyNCkpCisKKyNkZWZpbmUgS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUiAgICAoKHNpemVfdCkgKDEwMjQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01JTl9NQUxMT0NfUE9PTF9JTkNSICAgICAgICAoKHNpemVfdCkgKDQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSICAgICAgICAofigoc2l6ZV90KTE8PCgoc2l6ZW9mKHNpemVfdCkqKDE8PDMpKS0xKSkpCisKKyNkZWZpbmUgS01QX01JTl9TVEtPRkZTRVQgICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfU1RLT0ZGU0VUICAgICAgIEtNUF9NQVhfU1RLU0laRQorI2RlZmluZSBLTVBfREVGQVVMVF9TVEtPRkZTRVQgICBLTVBfTUlOX1NUS09GRlNFVAorCisjZGVmaW5lIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICAgICAgKDEpICAgICAgIC8qIG1pbiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9NQVhfTU9OSVRPUl9XQUtFVVBTICAgICAgKDEwMDApICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIG1vbml0b3IgY2FuIHdha2UgdXAgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgICAgICgxMDAwKSAgICAvKiBudW1iZXIgb2YgYmxvY2t0aW1lIHVuaXRzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01JTl9CTE9DS1RJTUUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9CTE9DS1RJTUUgICAgICAgICAgICAoSU5UX01BWCkgLyogTXVzdCBiZSB0aGlzIGZvciAiaW5maW5pdGUiIHNldHRpbmcgdGhlIHdvcmsgKi8KKyNkZWZpbmUgS01QX0RFRkFVTFRfQkxPQ0tUSU1FICAgICAgICAoMjAwKSAgICAgLyogIF9fa21wX2Jsb2NrdGltZSBpcyBpbiBtaWxsaXNlY29uZHMgICovCisvKiBDYWxjdWxhdGUgbmV3IG51bWJlciBvZiBtb25pdG9yIHdha2V1cHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbiBwcmV2aW91cyBtb25pdG9yX3dha2V1cHMgKi8KKy8qIE9ubHkgYWxsb3cgaW5jcmVhc2luZyBudW1iZXIgb2Ygd2FrZXVwcyAqLworI2RlZmluZSBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIG1vbml0b3Jfd2FrZXVwcykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKGJsb2NrdGltZSkgPT0gS01QX01BWF9CTE9DS1RJTUUpID8gKG1vbml0b3Jfd2FrZXVwcykgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmxvY2t0aW1lKSA9PSBLTVBfTUlOX0JMT0NLVElNRSkgPyBLTVBfTUFYX01PTklUT1JfV0FLRVVQUyA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtb25pdG9yX3dha2V1cHMpID4gKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChibG9ja3RpbWUpKSkgPyAobW9uaXRvcl93YWtldXBzKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIpIC8gKGJsb2NrdGltZSkgKQorCisvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGludGVydmFscyBmb3IgYSBzcGVjaWZpYyBibG9jayB0aW1lIGJhc2VkIG9uIG1vbml0b3Jfd2FrZXVwcyAqLworI2RlZmluZSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgbW9uaXRvcl93YWtldXBzKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIChibG9ja3RpbWUpICsgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChtb25pdG9yX3dha2V1cHMpKSAtIDEgKSAvICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkgKQorCisjZGVmaW5lIEtNUF9NSU5fU1RBVFNDT0xTICAgICAgIDQwCisjZGVmaW5lIEtNUF9NQVhfU1RBVFNDT0xTICAgICAgIDQwOTYKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RBVFNDT0xTICAgODAKKworI2RlZmluZSBLTVBfTUlOX0lOVEVSVkFMICAgICAgICAwCisjZGVmaW5lIEtNUF9NQVhfSU5URVJWQUwgICAgICAgIChJTlRfTUFYLTEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0lOVEVSVkFMICAgIDAKKworI2RlZmluZSBLTVBfTUlOX0NIVU5LICAgICAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfQ0hVTksgICAgICAgICAgIChJTlRfTUFYLTEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0NIVU5LICAgICAgIDEKKworI2RlZmluZSBLTVBfTUlOX0lOSVRfV0FJVCAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfSU5JVF9XQUlUICAgICAgIChJTlRfTUFYLzIpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0lOSVRfV0FJVCAgIDIwNDhVCisKKyNkZWZpbmUgS01QX01JTl9ORVhUX1dBSVQgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX05FWFRfV0FJVCAgICAgICAoSU5UX01BWC8yKQorI2RlZmluZSBLTVBfREVGQVVMVF9ORVhUX1dBSVQgICAxMDI0VQorCisvLyBtYXggcG9zc2libGUgZHluYW1pYyBsb29wcyBpbiBjb25jdXJyZW50IGV4ZWN1dGlvbiBwZXIgdGVhbQorI2RlZmluZSBLTVBfTUFYX0RJU1BfQlVGICAgICAgICA3CisjZGVmaW5lIEtNUF9NQVhfT1JERVJFRCAgICAgICAgIDgKKworI2RlZmluZSBLTVBfTUFYX0ZJRUxEUyAgICAgICAgICAzMgorCisjZGVmaW5lIEtNUF9NQVhfQlJBTkNIX0JJVFMgICAgIDMxCisKKyNkZWZpbmUgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUIElOVF9NQVgKKworLyogTWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyBiZWZvcmUgc3dpdGNoIHRvIFRMUyBndGlkIChleHBlcmltZW50YWxseSBkZXRlcm1pbmVkKSAqLworLyogam9zaCBUT0RPOiB3aGF0IGFib3V0IE9TIFgqIHR1bmluZz8gKi8KKyNpZiAgIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gICAgIDUKKyNlbHNlCisjIGRlZmluZSBLTVBfVExTX0dUSURfTUlOICAgICBJTlRfTUFYCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUFTVEVSX1RJRCh0aWQpICAgICAgKCAodGlkKSA9PSAwICkKKyNkZWZpbmUgS01QX1dPUktFUl9USUQodGlkKSAgICAgICggKHRpZCkgIT0gMCApCisKKyNkZWZpbmUgS01QX01BU1RFUl9HVElEKGd0aWQpICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCgoZ3RpZCkpID09IDAgKQorI2RlZmluZSBLTVBfV09SS0VSX0dUSUQoZ3RpZCkgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKChndGlkKSkgIT0gMCApCisjZGVmaW5lIEtNUF9VQkVSX0dUSUQoZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IEtNUF9HVElEX01JTiApLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKSwgICAgICAgICAgXAorICAgICAgICAoZ3RpZCkgPj0gMCAmJiBfX2ttcF9yb290WyhndGlkKV0gJiYgX19rbXBfdGhyZWFkc1soZ3RpZCldICYmIFwKKyAgICAgICAgKF9fa21wX3RocmVhZHNbKGd0aWQpXSA9PSBfX2ttcF9yb290WyhndGlkKV0tPnIucl91YmVyX3RocmVhZClcCisgICAgKQorI2RlZmluZSBLTVBfSU5JVElBTF9HVElEKGd0aWQpICAgKCAoZ3RpZCkgPT0gMCApCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBGQUxTRSAgIDAKKyNkZWZpbmUgVFJVRSAgICAoISBGQUxTRSkKKyNlbmRpZgorCisvKiBOT1RFOiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgbXVzdCBiZSBldmVuICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgICAgNjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICAgMzJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0xJTlVYCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNECisvKiBUT0RPOiB0dW5lIGZvciBPUyAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2Vsc2UKKyMgIGVycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitzdHJ1Y3Qga21wX2NwdWlkIHsKKyAgICBrbXBfdWludDMyICBlYXg7CisgICAga21wX3VpbnQzMiAgZWJ4OworICAgIGttcF91aW50MzIgIGVjeDsKKyAgICBrbXBfdWludDMyICBlZHg7Cit9OworZXh0ZXJuIHZvaWQgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7CisjIGlmIEtNUF9NSUMKKyAgc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkgeyBfbW1fZGVsYXlfMzIoIDEwMCApOyB9OworIyBlbHNlCisgIGV4dGVybiB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworIyBlbmRpZgorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpICAgICAgICBfX2ttcF94ODZfcGF1c2UoKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNkZWZpbmUgS01QX0lOSVRfWUlFTEQoY291bnQpICAgICAgICAgICB7IChjb3VudCkgPSBfX2ttcF95aWVsZF9pbml0OyB9CisKKyNkZWZpbmUgS01QX1lJRUxEKGNvbmQpICAgICAgICAgICAgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgX19rbXBfc3RhdGljX3lpZWxkKCAoY29uZCkgKTsgfQorCisvLyBOb3RlIHRoZSBkZWNyZW1lbnQgb2YgMiBpbiB0aGUgZm9sbG93aW5nIE1hY3Jvcy4gIFdpdGggS01QX0xJQlJBUlk9dHVybmFyb3VuZCwKKy8vIHRoZXJlIHNob3VsZCBiZSBubyB5aWVsZGluZyBzaW5jZSB0aGUgc3RhcnRpbmcgdmFsdWUgZnJvbSBLTVBfSU5JVF9ZSUVMRCgpIGlzIG9kZC4KKworI2RlZmluZSBLTVBfWUlFTERfV0hFTihjb25kLGNvdW50KSAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyAoY291bnQpIC09IDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvdW50KSkgeyBLTVBfWUlFTEQoY29uZCk7IChjb3VudCkgPSBfX2ttcF95aWVsZF9uZXh0OyB9IH0KKyNkZWZpbmUgS01QX1lJRUxEX1NQSU4oY291bnQpICAgICAgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgKGNvdW50KSAtPTI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvdW50KSkgeyBLTVBfWUlFTEQoMSk7IChjb3VudCkgPSBfX2ttcF95aWVsZF9uZXh0OyB9IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTdXBwb3J0IGRhdGF0eXBlcyBmb3IgdGhlIG9ycGhhbmVkIGNvbnN0cnVjdCBuZXN0aW5nIGNoZWNrcy4gICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGNvbnNfdHlwZSB7CisgICAgY3Rfbm9uZSwKKyAgICBjdF9wYXJhbGxlbCwKKyAgICBjdF9wZG8sCisgICAgY3RfcGRvX29yZGVyZWQsCisgICAgY3RfcHNlY3Rpb25zLAorICAgIGN0X3BzaW5nbGUsCisKKyAgICAvKiB0aGUgZm9sbG93aW5nIG11c3QgYmUgbGVmdCBpbiBvcmRlciBhbmQgbm90IHNwbGl0IHVwICovCisgICAgY3RfdGFza3EsCisgICAgY3RfdGFzaywgICAgICAgICAgICAgICAgICAgIC8qIHJlYWxseSB0YXNrIGluc2lkZSBub24tb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCBhIHdvcmtzaGFyaW5nIHR5cGUgKi8KKyAgICBjdF90YXNrX29yZGVyZWQsICAgICAgICAgICAgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG9yZGVyZWQgdGFza3EsIGNvbnNpZGVyZWQgYSB3b3Jrc2hhcmluZyB0eXBlICovCisgICAgLyogdGhlIHByZWNlZGluZyBtdXN0IGJlIGxlZnQgaW4gb3JkZXIgYW5kIG5vdCBzcGxpdCB1cCAqLworCisgICAgY3RfY3JpdGljYWwsCisgICAgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwKKyAgICBjdF9vcmRlcmVkX2luX3BkbywKKyAgICBjdF9vcmRlcmVkX2luX3Rhc2txLAorICAgIGN0X21hc3RlciwKKyAgICBjdF9yZWR1Y2UsCisgICAgY3RfYmFycmllcgorfTsKKworLyogdGVzdCB0byBzZWUgaWYgd2UgYXJlIGluIGEgdGFza3EgY29uc3RydWN0ICovCisjIGRlZmluZSBJU19DT05TX1RZUEVfVEFTS1EoIGN0ICkgICAgICAgKCAoKGludCkoY3QpKSA+PSAoKGludCljdF90YXNrcSkgJiYgKChpbnQpKGN0KSkgPD0gKChpbnQpY3RfdGFza19vcmRlcmVkKSApCisjIGRlZmluZSBJU19DT05TX1RZUEVfT1JERVJFRCggY3QgKSAgICAgKChjdCkgPT0gY3RfcGRvX29yZGVyZWQgfHwgKGN0KSA9PSBjdF90YXNrX29yZGVyZWQpCisKK3N0cnVjdCBjb25zX2RhdGEgeworICAgIGlkZW50X3QgY29uc3QgICAgICppZGVudDsKKyAgICBlbnVtIGNvbnNfdHlwZSAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgcHJldjsKKyAgICBrbXBfdXNlcl9sb2NrX3AgICAgbmFtZTsgICAgLyogYWRkcmVzcyBleGNsdXNpdmVseSBmb3IgY3JpdGljYWwgc2VjdGlvbiBuYW1lIGNvbXBhcmlzb24gKi8KK307CisKK3N0cnVjdCBjb25zX2hlYWRlciB7CisgICAgaW50ICAgICAgICAgICAgICAgICBwX3RvcCwgd190b3AsIHNfdG9wOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSwgc3RhY2tfdG9wOworICAgIHN0cnVjdCBjb25zX2RhdGEgICAqc3RhY2tfZGF0YTsKK307CisKK3N0cnVjdCBrbXBfcmVnaW9uX2luZm8geworICAgIGNoYXIgICAgICAgICAgICAgICAgKnRleHQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBvZmZzZXRbS01QX01BWF9GSUVMRFNdOworICAgIGludCAgICAgICAgICAgICAgICAgbGVuZ3RoW0tNUF9NQVhfRklFTERTXTsKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB0eXBlZGVmIEhBTkRMRSAgICAgICAgICAgICAga21wX3RocmVhZF90OworICAgIHR5cGVkZWYgRFdPUkQgICAgICAgICAgICAgICBrbXBfa2V5X3Q7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9PU19VTklYCisgICAgdHlwZWRlZiBwdGhyZWFkX3QgICAgICAgICAgIGttcF90aHJlYWRfdDsKKyAgICB0eXBlZGVmIHB0aHJlYWRfa2V5X3QgICAgICAga21wX2tleV90OworI2VuZGlmCisKK2V4dGVybiBrbXBfa2V5X3QgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXk7CisKK3R5cGVkZWYgc3RydWN0IGttcF9zeXNfaW5mbyB7CisgICAgbG9uZyBtYXhyc3M7ICAgICAgICAgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGxvbmcgbWluZmx0OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBsb25nIG1hamZsdDsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB0aGF0IHJlcXVpcmVkIEkvTyAgICAgICovCisgICAgbG9uZyBuc3dhcDsgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGxvbmcgaW5ibG9jazsgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBsb25nIG91YmxvY2s7ICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gb3V0cHV0ICovCisgICAgbG9uZyBudmNzdzsgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGxvbmcgbml2Y3N3OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KK30ga21wX3N5c19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9jcHVpbmZvIHsKKyAgICBpbnQgICAgICAgIGluaXRpYWxpemVkOyAgLy8gSWYgMCwgb3RoZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgICAgaW50ICAgICAgICBzaWduYXR1cmU7ICAgIC8vIENQVUlEKDEpLkVBWAorICAgIGludCAgICAgICAgZmFtaWx5OyAgICAgICAvLyBDUFVJRCgxKS5FQVhbMjc6MjBdICsgQ1BVSUQoMSkuRUFYWzExOjhdICggRXh0ZW5kZWQgRmFtaWx5ICsgRmFtaWx5ICkKKyAgICBpbnQgICAgICAgIG1vZGVsOyAgICAgICAgLy8gKCBDUFVJRCgxKS5FQVhbMTk6MTZdIDw8IDQgKSArIENQVUlEKDEpLkVBWFs3OjRdICggKCBFeHRlbmRlZCBNb2RlbCA8PCA0ICkgKyBNb2RlbCkKKyAgICBpbnQgICAgICAgIHN0ZXBwaW5nOyAgICAgLy8gQ1BVSUQoMSkuRUFYWzM6MF0gKCBTdGVwcGluZyApCisgICAgaW50ICAgICAgICBzc2UyOyAgICAgICAgIC8vIDAgaWYgU1NFMiBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQsIDEgb3RoZXJ3aXNlLgorICAgIGludCAgICAgICAgcnRtOyAgICAgICAgICAvLyAwIGlmIFJUTSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQsIDEgb3RoZXJ3aXNlLgorICAgIGludCAgICAgICAgY3B1X3N0YWNrb2Zmc2V0OworICAgIGludCAgICAgICAgYXBpY19pZDsKKyAgICBpbnQgICAgICAgIHBoeXNpY2FsX2lkOworICAgIGludCAgICAgICAgbG9naWNhbF9pZDsKKyAgICBrbXBfdWludDY0IGZyZXF1ZW5jeTsgICAgLy8gTm9taW5hbCBDUFUgZnJlcXVlbmN5IGluIEh6LgorfSBrbXBfY3B1aW5mb190OworCisKKyNpZmRlZiBCVUlMRF9UVgorCitzdHJ1Y3QgdHZfdGhyZWFkcHJpdmF0ZSB7CisgICAgLyogUmVjb3JkIHR5cGUgIzEgKi8KKyAgICB2b2lkICAgICAgICAqZ2xvYmFsX2FkZHI7CisgICAgdm9pZCAgICAgICAgKnRocmVhZF9hZGRyOworfTsKKworc3RydWN0IHR2X2RhdGEgeworICAgIHN0cnVjdCB0dl9kYXRhICAgICAgKm5leHQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqdHlwZTsKKyAgICB1bmlvbiB0dl91bmlvbiB7CisgICAgICAgIHN0cnVjdCB0dl90aHJlYWRwcml2YXRlIHRwOworICAgIH0gdTsKK307CisKK2V4dGVybiBrbXBfa2V5X3QgX19rbXBfdHZfa2V5OworCisjZW5kaWYgLyogQlVJTERfVFYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyBXZSBjYW5ub3QgaW5jbHVkZSAia21wX2l0dC5oIiBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeS4gRGVjbGFyZSB0aGUgb25seSByZXF1aXJlZCB0eXBlIGhlcmUuCisvLyBMYXRlciB3ZSB3aWxsIGNoZWNrIHRoZSB0eXBlIG1lZXRzIHJlcXVpcmVtZW50cy4KK3R5cGVkZWYgaW50IGttcF9pdHRfbWFya190OworI2RlZmluZSBLTVBfSVRUX0RFQlVHIDAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3EgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBISUdIX1dBVEVSX01BUksobnNsb3RzKSAgICAgICAgICgoKG5zbG90cykgKiAzKSAvIDQpCisjZGVmaW5lIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggICAgICAgIDEgICAgICAvKiBudW0gdGh1bmtzIHRoYXQgZWFjaCB0aHJlYWQgY2FuIHNpbXVsdGFuZW91c2x5IGV4ZWN1dGUgZnJvbSBhIHRhc2sgcXVldWUgKi8KKworLyogIGZsYWdzIGZvciB0YXNrcV9nbG9iYWxfZmxhZ3MsIGttcF90YXNrX3F1ZXVlX3QgdHFfZmxhZ3MsIGttcGNfdGh1bmtfdCB0aF9mbGFncyAgKi8KKworI2RlZmluZSBUUUZfSVNfT1JERVJFRCAgICAgICAgICAweDAwMDEgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB0YXNrcSBvcmRlcmVkICAqLworI2RlZmluZSBUUUZfSVNfTEFTVFBSSVZBVEUgICAgICAweDAwMDIgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB0YXNrcSB3aXRoIGxhc3Rwcml2YXRlIGxpc3QgICovCisjZGVmaW5lIFRRRl9JU19OT1dBSVQgICAgICAgICAgIDB4MDAwNCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIGVuZCB0YXNrcSBub3dhaXQgICovCisjZGVmaW5lIFRRRl9IRVVSSVNUSUNTICAgICAgICAgIDB4MDAwOCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHVzZSBoZXVyaXN0aWNzIHRvIGRlY2lkZSB0YXNrIHF1ZXVlIHNpemUgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQxIDB4MDAxMCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMiAweDAwMjAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDMgMHgwMDQwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQ0IDB4MDA4MCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfRkxBR1MgICAgIDB4MDBmZiAgLyogIGFsbCB0aGUgX19rbXBjX3Rhc2txIGludGVyZmFjZSBmbGFncyAgKi8KKworI2RlZmluZSBUUUZfSVNfTEFTVF9UQVNLICAgICAgICAweDAxMDAgIC8qICBpbnRlcm5hbC9yZWFkIGJ5IGluc3RydW1lbnRhdGlvbjsgb25seSB1c2VkIHdpdGggVFFGX0lTX0xBU1RQUklWQVRFICAqLworI2RlZmluZSBUUUZfVEFTS1FfVEFTSyAgICAgICAgICAweDAyMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgdGhpcyB0aHVuay0+dGhfdGFzayBpcyB0aGUgdGFza3FfdGFzayAgKi8KKyNkZWZpbmUgVFFGX1JFTEVBU0VfV09SS0VSUyAgICAgMHgwNDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IG11c3QgcmVsZWFzZSB3b3JrZXIgdGhyZWFkcyBvbmNlIEFOWSBxdWV1ZWQgdGFzayBleGlzdHMgKGdsb2JhbCkgKi8KKyNkZWZpbmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgICAgMHgwODAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IG5vdGlmeSB3b3JrZXJzIHRoYXQgbWFzdGVyIGhhcyBmaW5pc2hlZCBlbnF1ZXVpbmcgdGFza3MgKi8KKyNkZWZpbmUgVFFGX1BBUkFMTEVMX0NPTlRFWFQgICAgMHgxMDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk6IHRoaXMgcXVldWUgZW5jb3VudGVyZWQgaW4gYSBwYXJhbGxlbCBjb250ZXh0OiBub3Qgc2VyaWFsaXplZCAqLworI2RlZmluZSBUUUZfREVBTExPQ0FURUQgICAgICAgICAweDIwMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgdGhpcyBxdWV1ZSBpcyBvbiB0aGUgZnJlZWxpc3QgYW5kIG5vdCBpbiB1c2UgKi8KKworI2RlZmluZSBUUUZfSU5URVJOQUxfRkxBR1MgICAgICAweDNmMDAgIC8qICBhbGwgdGhlIGludGVybmFsIHVzZSBvbmx5IGZsYWdzICAqLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX2ludDMyX3QgeworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICBhaV9kYXRhOworfSBrbXBjX2FsaWduZWRfaW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgeworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAqcXNfdGh1bms7Cit9IGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcGNfdGFza19xdWV1ZV90IHsKKyAgICAgICAgLyogdGFzayBxdWV1ZSBsaW5rYWdlIGZpZWxkcyBmb3Igbi1hcnkgdHJlZSBvZiBxdWV1ZXMgKGxvY2tlZCB3aXRoIGdsb2JhbCB0YXNrcV90cmVlX2xjaykgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9saW5rX2xjazsgICAgICAgICAgLyogIGxvY2sgZm9yIGNoaWxkIGxpbmssIGNoaWxkIG5leHQvcHJldiBsaW5rcyBhbmQgY2hpbGQgcmVmIGNvdW50cyAqLworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9wYXJlbnQ7ICAgICAgICAgICAgLyogIHBvaW50ZXIgdG8gcGFyZW50IHRhc2txLCBub3QgbG9ja2VkICovCisgICAgICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfbmV4dF9mcmVlOyAgICAgICAgIC8qICBmb3IgdGFza3EgaW50ZXJuYWwgZnJlZWxpc3RzLCBsb2NrZWQgd2l0aCBnbG9iYWwgdGFza3FfZnJlZWxpc3RfbGNrICovCisgICAgfSB0cTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX2ZpcnN0X2NoaWxkOyAgLyogIHBvaW50ZXIgdG8gbGlua2VkLWxpc3Qgb2YgY2hpbGRyZW4sIGxvY2tlZCBieSB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICAgICAqdHFfbmV4dF9jaGlsZDsgICAgICAgIC8qICBuZXh0IGNoaWxkIGluIGxpbmtlZC1saXN0LCBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgICAgICp0cV9wcmV2X2NoaWxkOyAgICAgICAgLyogIHByZXZpb3VzIGNoaWxkIGluIGxpbmtlZC1saXN0LCBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9yZWZfY291bnQ7ICAgICAgICAgLyogIHJlZmVyZW5jZSBjb3VudCBvZiB0aHJlYWRzIHdpdGggYWNjZXNzIHRvIHRoaXMgdGFzayBxdWV1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKG90aGVyIHRoYW4gdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGttcGNfZW5kX3Rhc2txIGNhbGwpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKworICAgICAgICAvKiBzaGFyZWQgZGF0YSBmb3IgdGFzayBxdWV1ZSAqLworICAgIHN0cnVjdCBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCAgICAqdHFfc2hhcmVkczsgICAvKiAgcGVyLXRocmVhZCBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgb25seSBvbmUgYXJyYXkgZWxlbWVudCBleGlzdHMgZm9yIGFsbCBidXQgb3V0ZXJtb3N0IHRhc2txICovCisKKyAgICAgICAgLyogYm9va2tlZXBpbmcgZm9yIG9yZGVyZWQgdGFzayBxdWV1ZSAqLworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICAgIHRxX3Rhc2tudW1fcXVldWluZzsgICAvKiAgb3JkZXJlZCB0YXNrIG51bWJlciBhc3NpZ25lZCB3aGlsZSBxdWV1aW5nIHRhc2tzICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICAgdHFfdGFza251bV9zZXJ2aW5nOyAgIC8qICBvcmRlcmVkIG51bWJlciBvZiBuZXh0IHRhc2sgdG8gYmUgc2VydmVkIChleGVjdXRlZCkgKi8KKworICAgICAgICAvKiB0aHVuayBzdG9yYWdlIG1hbmFnZW1lbnQgZm9yIHRhc2sgcXVldWUgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9mcmVlX3RodW5rc19sY2s7ICAgLyogIGxvY2sgZm9yIHRodW5rIGZyZWVsaXN0IG1hbmlwdWxhdGlvbiAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAgICAgICAgKnRxX2ZyZWVfdGh1bmtzOyAgICAgICAvKiAgdGh1bmsgZnJlZWxpc3QsIGNoYWluZWQgdmlhIHRoLnRoX25leHRfZnJlZSAgKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgICAgICAgICp0cV90aHVua19zcGFjZTsgICAgICAgLyogIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGh1bmtzIGZvciB0aGlzIHRhc2sgcXVldWUgICovCisKKyAgICAgICAgLyogZGF0YSBmaWVsZHMgZm9yIHF1ZXVlIGl0c2VsZiAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX3F1ZXVlX2xjazsgICAgICAgICAvKiAgbG9jayBmb3IgW2RlXWVucXVldWUgb3BlcmF0aW9uczogdHFfcXVldWUsIHRxX2hlYWQsIHRxX3RhaWwsIHRxX25mdWxsICovCisgICAga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCAgICAqdHFfcXVldWU7ICAgICAgICAgICAgIC8qICBhcnJheSBvZiBxdWV1ZSBzbG90cyB0byBob2xkIHRodW5rcyBmb3IgdGFza3MgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY190aHVua190ICp0cV90YXNrcV9zbG90OyAgICAgICAgLyogIHNwZWNpYWwgc2xvdCBmb3IgdGFza3EgdGFzayB0aHVuaywgb2NjdXBpZWQgaWYgbm90IE5VTEwgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfbnNsb3RzOyAgICAgICAgICAgIC8qICAjIG9mIHRxX3RodW5rX3NwYWNlIHRodW5rcyBhbGxvYydkIChub3QgaW5jbC4gdHFfdGFza3Ffc2xvdCBzcGFjZSkgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfaGVhZDsgICAgICAgICAgICAgIC8qICBlbnF1ZXVlIHB1dHMgbmV4dCBpdGVtIGluIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfdGFpbDsgICAgICAgICAgICAgIC8qICBkZXF1ZXVlIHRha2VzIG5leHQgaXRlbSBvdXQgb2YgaGVyZSAoaW5kZXggaW50byB0cV9xdWV1ZSBhcnJheSkgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9uZnVsbDsgICAgICAgICAgICAgLyogICMgb2Ygb2NjdXBpZWQgZW50cmllcyBpbiB0YXNrIHF1ZXVlIHJpZ2h0IG5vdyAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9oaXdhdDsgICAgICAgICAgICAgLyogIGhpZ2gtd2F0ZXIgbWFyayBmb3IgdHFfbmZ1bGwgYW5kIHF1ZXVlIHNjaGVkdWxpbmcgICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfZmxhZ3M7ICAgICAgICAgICAgIC8qICBUUUZfeHh4ICAqLworCisgICAgICAgIC8qIGJvb2trZWVwaW5nIGZvciBvdXRzdGFuZGluZyB0aHVua3MgKi8KKyAgICBzdHJ1Y3Qga21wY19hbGlnbmVkX2ludDMyX3QgICp0cV90aF90aHVua3M7ICAgICAgICAgLyogIHBlci10aHJlYWQgYXJyYXkgZm9yICMgb2YgcmVndWxhciB0aHVua3MgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfbnByb2M7ICAgICAgICAgICAgIC8qICBudW1iZXIgb2YgdGh1bmtzIGluIHRoZSB0aF90aHVua3MgYXJyYXkgKi8KKworICAgICAgICAvKiBzdGF0aXN0aWNzIGxpYnJhcnkgYm9va2tlZXBpbmcgKi8KKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAqdHFfbG9jOyAgICAgICAgICAgICAgLyogIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGFza3EgZGlyZWN0aXZlICovCit9IGttcGNfdGFza19xdWV1ZV90OworCit0eXBlZGVmIHZvaWQgKCprbXBjX3Rhc2tfdCkgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBzdHJ1Y3Qga21wY190aHVua190ICp0aHVuayk7CisKKy8qICBzaXplb2Zfc2hhcmVkcyBwYXNzZWQgYXMgYXJnIHRvIF9fa21wY190YXNrcSBjYWxsICAqLwordHlwZWRlZiBzdHJ1Y3Qga21wY19zaGFyZWRfdmFyc190IHsgICAgICAgICAgICAgLyogIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAqLworICAgIGttcGNfdGFza19xdWV1ZV90ICAgICAgICAgKnN2X3F1ZXVlOworICAgIC8qICAocG9pbnRlcnMgdG8pIHNoYXJlZCB2YXJzICAqLworfSBrbXBjX3NoYXJlZF92YXJzX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCB7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCAgICAgKmFpX2RhdGE7Cit9IGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190OworCisvKiAgc2l6ZW9mX3RodW5rIHBhc3NlZCBhcyBhcmcgdG8ga21wY190YXNrcSBjYWxsICAqLwordHlwZWRlZiBzdHJ1Y3Qga21wY190aHVua190IHsgICAgICAgICAgICAgICAgICAgLyogIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAqLworICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGZpZWxkIHVzZWQgZm9yIGludGVybmFsIGZyZWVsaXN0cyB0b28gICovCisgICAgICAgIGttcGNfc2hhcmVkX3ZhcnNfdCAgKnRoX3NoYXJlZHM7CisgICAgICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRoX25leHRfZnJlZTsgICAgICAvKiAgZnJlZWxpc3Qgb2YgaW5kaXZpZHVhbCB0aHVua3Mgd2l0aGluIHF1ZXVlLCBoZWFkIGF0IHRxX2ZyZWVfdGh1bmtzICAqLworICAgIH0gdGg7CisgICAga21wY190YXNrX3QgdGhfdGFzazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdGFza3FfdGFzayBpZiBmbGFncyAmIFRRRl9UQVNLUV9UQVNLICAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRoX2VuY2xfdGh1bms7ICAgICAgICAgLyogIHBvaW50ZXIgdG8gZHluYW1pY2FsbHkgZW5jbG9zaW5nIHRodW5rIG9uIHRoaXMgdGhyZWFkJ3MgY2FsbCBzdGFjayAqLworICAgIGttcF9pbnQzMiB0aF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFRRRl94eHggKHRxX2ZsYWdzIGludGVyZmFjZSBwbHVzIHBvc3NpYmxlIGludGVybmFsIGZsYWdzKSAgKi8KKyAgICBrbXBfaW50MzIgdGhfc3RhdHVzOworICAgIGttcF91aW50MzIgdGhfdGFza251bTsgICAgICAgICAgICAgICAgICAgICAgLyogIHRhc2sgbnVtYmVyIGFzc2lnbmVkIGluIG9yZGVyIG9mIHF1ZXVpbmcsIHVzZWQgZm9yIG9yZGVyZWQgc2VjdGlvbnMgKi8KKyAgICAvKiAgcHJpdmF0ZSB2YXJzICAqLworfSBrbXBjX3RodW5rX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfdGFza3EgeworICAgIGludCAgICAgICAgICAgICAgICAgdHFfY3Vycl90aHVua19jYXBhY2l0eTsKKworICAgIGttcGNfdGFza19xdWV1ZV90ICAqdHFfcm9vdDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIHRxX2dsb2JhbF9mbGFnczsKKworICAgIGttcF9sb2NrX3QgICAgICAgICAgdHFfZnJlZWxpc3RfbGNrOworICAgIGttcGNfdGFza19xdWV1ZV90ICAqdHFfZnJlZWxpc3Q7CisKKyAgICBrbXBjX3RodW5rX3QgICAgICAqKnRxX2N1cnJfdGh1bms7Cit9IGttcF90YXNrcV90OworCisvKiBFTkQgVGFza3EgZGF0YSBzdHJ1Y3R1cmVzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBrbXBfaW50MzIga21wX2NyaXRpY2FsX25hbWVbOF07CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK1RoZSB0eXBlIGZvciBhIG1pY3JvdGFzayB3aGljaCBnZXRzIHBhc3NlZCB0byBAcmVmIF9fa21wY19mb3JrX2NhbGwoKS4KK1RoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uIGFyZQorQHBhcmFtIGdsb2JhbF90aWQgdGhlIGdsb2JhbCB0aHJlYWQgaWRlbnRpdHkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLgorQHBhcmFtIGJvdW5kX3RpZCAgdGhlIGxvY2FsIGlkZW50aXRpeSBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24KK0BwYXJhbSAuLi4gcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24uCisqLwordHlwZWRlZiB2b2lkICgqa21wY19taWNybykgICAgICAgICAgICAgICgga21wX2ludDMyICogZ2xvYmFsX3RpZCwga21wX2ludDMyICogYm91bmRfdGlkLCAuLi4gKTsKK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm9fYm91bmQpICAgICAgICAoIGttcF9pbnQzMiAqIGJvdW5kX3RpZCwga21wX2ludDMyICogYm91bmRfbnRoLCAuLi4gKTsKKworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAeworKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhyZWFkcHJpdmF0ZSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisKKy8qICBmb3Igbm9uLWFycmF5IG9iamVjdHM6ICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcigpICAqLworCisvKiEKKyBQb2ludGVyIHRvIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2N0b3IpICAgICh2b2lkICopOworCisvKiEKKyBQb2ludGVyIHRvIHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yKSAgICAgKHZvaWQgKiAvKiwgc2l6ZV90ICovKTsgLyogMm5kIGFyZzogbWFnaWMgbnVtYmVyIGZvciBLQ0MgdW51c2VkIGJ5IEludGVsIGNvbXBpbGVyICovCisvKiEKKyBQb2ludGVyIHRvIGFuIGFsdGVybmF0ZSBjb25zdHJ1Y3Rvci4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlci4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jY3RvcikgICAodm9pZCAqLCB2b2lkICopOworCisvKiAgZm9yIGFycmF5IG9iamVjdHM6IF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYygpICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBhcmc6ICJ0aGlzIiBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgYXJnOiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKy8qIQorIEFycmF5IGNvbnN0cnVjdG9yLgorIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBTZWNvbmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yX3ZlYykgICh2b2lkICosIHNpemVfdCk7CisvKiEKKyBQb2ludGVyIHRvIHRoZSBhcnJheSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yX3ZlYykgICAodm9pZCAqLCBzaXplX3QpOworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFRoaXJkIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3JfdmVjKSAodm9pZCAqLCB2b2lkICosIHNpemVfdCk7IC8qIGZ1bmN0aW9uIHVudXNlZCBieSBjb21waWxlciAqLworCisvKiEKK0B9CisqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBrZWVwcyB0cmFja2VkIG9mIHRocmVhZHByaXZhdGUgY2FjaGUgYWxsb2NhdGlvbnMgZm9yIGNsZWFudXAgbGF0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9jYWNoZWRfYWRkciB7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqKmFkZHI7ICAgICAgICAgICAvKiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZSAqLworICAgIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgICAgICpuZXh0OyAgICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGNhY2hlZCBhZGRyZXNzICovCit9IGttcF9jYWNoZWRfYWRkcl90OworCitzdHJ1Y3QgcHJpdmF0ZV9kYXRhIHsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpuZXh0OyAgICAgICAgICAvKiBUaGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBsaXN0ICAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBUaGUgZGF0YSBidWZmZXIgZm9yIHRoaXMgZGVzY3JpcHRvciAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICBtb3JlOyAgICAgICAgICAvKiBUaGUgcmVwZWF0IGNvdW50IGZvciB0aGlzIGRlc2NyaXB0b3IgKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAvKiBUaGUgZGF0YSBzaXplIGZvciB0aGlzIGRlc2NyaXB0b3IgICAgKi8KK307CisKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiB7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAgICAqbmV4dDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICAgICpsaW5rOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmdibF9hZGRyOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBhcl9hZGRyOyAgICAgICAgLyogcGFyX2FkZHIgPT0gZ2JsX2FkZHIgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjbW5fc2l6ZTsKK307CisKK3N0cnVjdCBzaGFyZWRfY29tbW9uCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICAgICAqbmV4dDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICAgICAgICpwb2RfaW5pdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpvYmpfaW5pdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpnYmxfYWRkcjsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfY3RvciAgICAgICAgICAgICAgY3RvcjsKKyAgICAgICAga21wY19jdG9yX3ZlYyAgICAgICAgICBjdG9ydjsKKyAgICB9IGN0OworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19jY3RvciAgICAgICAgICAgICBjY3RvcjsKKyAgICAgICAga21wY19jY3Rvcl92ZWMgICAgICAgICBjY3RvcnY7CisgICAgfSBjY3Q7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2R0b3IgICAgICAgICAgICAgIGR0b3I7CisgICAgICAgIGttcGNfZHRvcl92ZWMgICAgICAgICAgZHRvcnY7CisgICAgfSBkdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICB2ZWNfbGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGlzX3ZlYzsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjbW5fc2l6ZTsKK307CisKKyNkZWZpbmUgS01QX0hBU0hfVEFCTEVfTE9HMiAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2cyIG9mIHRoZSBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgS01QX0hBU0hfVEFCTEVfU0laRSAgICAgKDEgPDwgS01QX0hBU0hfVEFCTEVfTE9HMikgICAgICAvKiBzaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCisjZGVmaW5lIEtNUF9IQVNIX1NISUZUICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyb3cgYXdheSB0aGlzIG1hbnkgbG93IGJpdHMgZnJvbSB0aGUgYWRkcmVzcyAqLworI2RlZmluZSBLTVBfSEFTSCh4KSAgICAgICAgICAgICAoKCgoa21wX3VpbnRwdHJfdCkgeCkgPj4gS01QX0hBU0hfU0hJRlQpICYgKEtNUF9IQVNIX1RBQkxFX1NJWkUtMSkpCisKK3N0cnVjdCBjb21tb25fdGFibGUgeworICAgIHN0cnVjdCAgcHJpdmF0ZV9jb21tb24gICAgICAqZGF0YVsgS01QX0hBU0hfVEFCTEVfU0laRSBdOworfTsKKworc3RydWN0IHNoYXJlZF90YWJsZSB7CisgICAgc3RydWN0ICBzaGFyZWRfY29tbW9uICAgICAgICpkYXRhWyBLTVBfSEFTSF9UQUJMRV9TSVpFIF07Cit9OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyIHsKKyAgICBrbXBfaW50MzIgY291bnQ7CisgICAga21wX2ludDMyIHViOworICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgIGttcF9pbnQzMiBsYjsKKyAgICBrbXBfaW50MzIgc3Q7CisgICAga21wX2ludDMyIHRjOworICAgIGttcF9pbnQzMiBzdGF0aWNfc3RlYWxfY291bnRlcjsgLyogZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViICovCisKKyAgICAvLyBLTVBfQUxJR04oIDE2ICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsgLy8gQUM6IGNoYW5nZWQgMTYgdG8gMzIgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGVtcGxhdGUKKyAgICAgICAga21wX2ludDMyIHBhcm0xOyAgICAgLy8gICAgIHN0cnVjdHVyZXMgaW4ga21wX2Rpc3BhdGNoLmNwcC4gVGhpcyBzaG91bGQKKyAgICAgICAga21wX2ludDMyIHBhcm0yOyAgICAgLy8gICAgIG1ha2Ugbm8gcmVhbCBjaGFuZ2UgYXQgbGVhc3Qgd2hpbGUgcGFkZGluZyBpcyBvZmYuCisgICAgICAgIGttcF9pbnQzMiBwYXJtMzsKKyAgICAgICAga21wX2ludDMyIHBhcm00OworICAgIH07CisKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQzMiBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YgJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4KKyAgICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAgIC8vIENvbmRpdGlvbmFsIGlmL2VuZGlmIGNhbiBiZSByZW1vdmVkIGF0IGFsbC4KKyAgICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICAgIGttcF9pbnQ2NCBjb3VudDsgICAvKiBjdXJyZW50IGNodW5rIG51bWJlciBmb3Igc3RhdGljIGFuZCBzdGF0aWMtc3RlYWwgc2NoZWR1bGluZyovCisgICAga21wX2ludDY0IHViOyAgICAgIC8qIHVwcGVyLWJvdW5kICovCisgICAgLyogQWRkaW5nIEtNUF9BTElHTl9DQUNIRSBoZXJlIGRvZXNuJ3QgaGVscCAvIGNhbiBodXJ0IHBlcmZvcm1hbmNlICovCisgICAga21wX2ludDY0IGxiOyAgICAgIC8qIGxvd2VyLWJvdW5kICovCisgICAga21wX2ludDY0IHN0OyAgICAgIC8qIHN0cmlkZSAqLworICAgIGttcF9pbnQ2NCB0YzsgICAgICAvKiB0cmlwIGNvdW50IChudW1iZXIgb2YgaXRlcmF0aW9ucykgKi8KKyAgICBrbXBfaW50NjQgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8qIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YiAqLworCisgICAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKworICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgIHN0cnVjdCBLTVBfQUxJR04oIDMyICkgeworICAgICAgICBrbXBfaW50NjQgcGFybTE7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMjsKKyAgICAgICAga21wX2ludDY0IHBhcm0zOworICAgICAgICBrbXBfaW50NjQgcGFybTQ7CisgICAgfTsKKworICAgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLyBUaGlzIHZhciBjYW4gYmUgcGxhY2VkIGluIHRoZSBob2xlIGJldHdlZW4gJ3RjJyBhbmQgJ3Bhcm0xJywgaW5zdGVhZCBvZiAnc3RhdGljX3N0ZWFsX2NvdW50ZXInLgorICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZXMuCisgICAgLy8gQ29uZGl0aW9uYWwgaWYvZW5kaWYgY2FuIGJlIHJlbW92ZWQgYXQgYWxsLgorICAgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZWxzZSAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgICAga21wX2ludDMyIGxiOworICAgIGttcF9pbnQzMiB1YjsKKyAgICBrbXBfaW50MzIgc3Q7CisgICAga21wX2ludDMyIHRjOworCisgICAga21wX2ludDMyIHBhcm0xOworICAgIGttcF9pbnQzMiBwYXJtMjsKKyAgICBrbXBfaW50MzIgcGFybTM7CisgICAga21wX2ludDMyIHBhcm00OworCisgICAga21wX2ludDMyIGNvdW50OworCisgICAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50MzIgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGttcF9pbnQzMiBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm82NCB7CisgICAga21wX2ludDY0IGxiOyAgICAgIC8qIGxvd2VyLWJvdW5kICovCisgICAga21wX2ludDY0IHViOyAgICAgIC8qIHVwcGVyLWJvdW5kICovCisgICAga21wX2ludDY0IHN0OyAgICAgIC8qIHN0cmlkZSAqLworICAgIGttcF9pbnQ2NCB0YzsgICAgICAvKiB0cmlwIGNvdW50IChudW1iZXIgb2YgaXRlcmF0aW9ucykgKi8KKworICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisgICAga21wX2ludDY0IHBhcm0xOworICAgIGttcF9pbnQ2NCBwYXJtMjsKKyAgICBrbXBfaW50NjQgcGFybTM7CisgICAga21wX2ludDY0IHBhcm00OworCisgICAga21wX2ludDY0IGNvdW50OyAgIC8qIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgc2NoZWR1bGluZyAqLworCisgICAga21wX3VpbnQ2NCBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50NjQgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZW5kaWYgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8geworICAgIHVuaW9uIHByaXZhdGVfaW5mbyB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3QgIHAzMjsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgcDY0OworICAgIH0gdTsKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGU7ICAvKiBzY2hlZHVsaW5nIGFsZ29yaXRobSAqLworICAgIGttcF9pbnQzMiAgICAgICBvcmRlcmVkOyAgIC8qIG9yZGVyZWQgY2xhdXNlIHNwZWNpZmllZCAqLworICAgIGttcF9pbnQzMiAgICAgICBvcmRlcmVkX2J1bXBlZDsKKyAgICBrbXBfaW50MzIgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0zXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfaW50MzIgICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX2ludDMyICAgICAgIHR5cGVfc2l6ZTsgLyogdGhlIHNpemUgb2YgdHlwZXMgaW4gcHJpdmF0ZV9pbmZvICovCisgICAgZW51bSBjb25zX3R5cGUgIHB1c2hlZF93czsKK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvMzIgeworICAgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICAgIGl0ZXJhdGlvbiBpbmRleCBvdGhlcndpc2UgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgaXRlcmF0aW9uOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBudW1fZG9uZTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgb3JkZXJlZF9pdGVyYXRpb247CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtMV07IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfSBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvNjQgeworICAgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICAgIGl0ZXJhdGlvbiBpbmRleCBvdGhlcndpc2UgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgaXRlcmF0aW9uOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBudW1fZG9uZTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgb3JkZXJlZF9pdGVyYXRpb247CisgICAga21wX2ludDY0ICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtMV07IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfSBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvIHsKKyAgICB1bmlvbiBzaGFyZWRfaW5mbyB7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvMzJfdCAgczMyOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3QgIHM2NDsKKyAgICB9IHU7CisvKiAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICBkaXNwYXRjaF9hYm9ydDsgIGRlcHJpY2F0ZWQgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICBidWZmZXJfaW5kZXg7Cit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9kaXNwIHsKKyAgICAvKiBWZWN0b3IgZm9yIE9SREVSRUQgU0VDVElPTiAqLworICAgIHZvaWQgKCp0aF9kZW9fZmNuKSggaW50ICogZ3RpZCwgaW50ICogY2lkLCBpZGVudF90ICopOworICAgIC8qIFZlY3RvciBmb3IgRU5EIE9SREVSRUQgU0VDVElPTiAqLworICAgIHZvaWQgKCp0aF9keG9fZmNuKSggaW50ICogZ3RpZCwgaW50ICogY2lkLCBpZGVudF90ICopOworCisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAgKnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQ7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQ7CisKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqdGhfZGlzcF9idWZmZXI7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgIHRoX2Rpc3BfaW5kZXg7CisgICAgdm9pZCogZHVtbXlfcGFkZGluZ1syXTsgLy8gbWFrZSBpdCA2NCBieXRlcyBvbiBJbnRlbChSKSA2NAorfSBrbXBfZGlzcF90OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBCYXJyaWVyIHN0dWZmICovCisKKy8qIGNvbnN0YW50cyBmb3IgYmFycmllciBzdGF0ZSB1cGRhdGUgKi8KKyNkZWZpbmUgS01QX0lOSVRfQkFSUklFUl9TVEFURSAgMCAgICAgICAvKiBzaG91bGQgcHJvYmFibHkgc3RhcnQgZnJvbSB6ZXJvICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX0JJVCAgIDAgICAgICAgLyogYml0IHVzZWQgZm9yIHN1c3BlbmQvc2xlZXAgcGFydCBvZiBzdGF0ZSAqLworI2RlZmluZSBLTVBfQkFSUklFUl9VTlVTRURfQklUICAxICAgICAgIC8qIGJpdCB0aGF0IG11c3QgbmV2ZXIgYmUgc2V0IGZvciB2YWxpZCBzdGF0ZSAqLworI2RlZmluZSBLTVBfQkFSUklFUl9CVU1QX0JJVCAgICAyICAgICAgIC8qIGxzYiB1c2VkIGZvciBidW1wIG9mIGdvL2Fycml2ZWQgc3RhdGUgKi8KKworI2RlZmluZSBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSAgICAgICAgICgoa21wX3VpbnQpICgxIDw8IEtNUF9CQVJSSUVSX1NMRUVQX0JJVCkpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSAgICAgICAgKChrbXBfdWludCkgKDEgPDwgS01QX0JBUlJJRVJfVU5VU0VEX0JJVCkpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgICAgICAgICAgKChrbXBfdWludCkgKDEgPDwgS01QX0JBUlJJRVJfQlVNUF9CSVQpKQorCisjaWYgKEtNUF9CQVJSSUVSX1NMRUVQX0JJVCA+PSBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKyMgZXJyb3IgIkJhcnJpZXIgc2xlZXAgYml0IG11c3QgYmUgc21hbGxlciB0aGFuIGJhcnJpZXIgYnVtcCBiaXQiCisjZW5kaWYKKyNpZiAoS01QX0JBUlJJRVJfVU5VU0VEX0JJVCA+PSBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKyMgZXJyb3IgIkJhcnJpZXIgdW51c2VkIGJpdCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBiYXJyaWVyIGJ1bXAgYml0IgorI2VuZGlmCisKKworZW51bSBiYXJyaWVyX3R5cGUgeworICAgIGJzX3BsYWluX2JhcnJpZXIgPSAwLCAgICAgICAvKiAwLCBBbGwgbm9uLWZvcmsvam9pbiBiYXJyaWVycyAoZXhjZXB0IHJlZHVjdGlvbiBiYXJyaWVycyBpZiBlbmFibGVkKSAqLworICAgIGJzX2Zvcmtqb2luX2JhcnJpZXIsICAgICAgICAvKiAxLCBBbGwgZm9yay9qb2luIChwYXJhbGxlbCByZWdpb24pIGJhcnJpZXJzICovCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIGJzX3JlZHVjdGlvbl9iYXJyaWVyLCAgIC8qIDIsIEFsbCBiYXJyaWVycyB0aGF0IGFyZSB1c2VkIGluIHJlZHVjdGlvbiAqLworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIGJzX2xhc3RfYmFycmllciAgICAgICAgICAgICAvKiBKdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kICovCit9OworCisvLyB0byB3b3JrIHdpdGggcmVkdWN0aW9uIGJhcnJpZXJzIGp1c3QgbGlrZSB3aXRoIHBsYWluIGJhcnJpZXJzCisjaWYgIUtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBic19yZWR1Y3Rpb25fYmFycmllciBic19wbGFpbl9iYXJyaWVyCisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKwordHlwZWRlZiBlbnVtIGttcF9iYXJfcGF0IHsgICAgICAvKiBCYXJyaWVyIGNvbW11bmljYXRpb24gcGF0dGVybnMgKi8KKyAgICBicF9saW5lYXJfYmFyID0gMCwgICAgICAgICAgLyogU2luZ2xlIGxldmVsIChkZWdlbmVyYXRlKSB0cmVlICovCisgICAgYnBfdHJlZV9iYXIgPSAxLCAgICAgICAgICAgIC8qIEJhbGFuY2VkIHRyZWUgd2l0aCBicmFuY2hpbmcgZmFjdG9yIDJebiAqLworICAgIGJwX2h5cGVyX2JhciA9IDIsICAgICAgICAgICAvKiBIeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSB3aXRoIG1pbiBicmFuY2hpbmcgZmFjdG9yIDJebiAqLworICAgIGJwX2xhc3RfYmFyID0gMyAgICAgICAgICAgICAvKiBQbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK30ga21wX2Jhcl9wYXRfZTsKKworLyogVGhyZWFkIGJhcnJpZXIgbmVlZHMgdm9sYXRpbGUgYmFycmllciBmaWVsZHMgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYnN0YXRlIHsKKyAgICB2b2xhdGlsZSBrbXBfdWludCAgIGJfYXJyaXZlZDsgICAgICAgICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyAgICAjaWYgKEtNUF9QRVJGX1YxOSA9PSBLTVBfT04pCisgICAgICAgIEtNUF9BTElHTl9DQUNIRQorICAgICNlbmRpZgorICAgIHZvbGF0aWxlIGttcF91aW50ICAgYl9nbzsgICAgICAgICAgICAgICAgICAgLyogU1RBVEUgPT4gdGFzayBzaG91bGQgcHJvY2VlZC4gICAgICAqLworfSBrbXBfYnN0YXRlX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl91bmlvbiB7CisgICAgZG91YmxlICAgICAgIGJfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgYl9wYWRbIEtNUF9QQUQoa21wX2JzdGF0ZV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9ic3RhdGVfdCBiYjsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2JhcnJpZXJfdW5pb24ga21wX2JhbGlnbl90OworCisvKiBUZWFtIGJhcnJpZXIgbmVlZHMgb25seSBub24tdm9sYXRpbGUgYXJyaXZlZCBjb3VudGVyICovCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2JhcnJpZXJfdGVhbV91bmlvbiB7CisgICAgZG91YmxlICAgICAgIGJfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgYl9wYWRbIENBQ0hFX0xJTkUgXTsKKyAgICBzdHJ1Y3QgeworICAgICAgICBrbXBfdWludCAgICAgYl9hcnJpdmVkOyAgICAgICAvKiBTVEFURSA9PiB0YXNrIHJlYWNoZWQgc3luY2ggcG9pbnQuICovCisgICAgfTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2JhcnJpZXJfdGVhbV91bmlvbiBrbXBfYmFsaWduX3RlYW1fdDsKKworLyoKKyAqIFBhZGRpbmcgZm9yIExpbnV4KiBPUyBwdGhyZWFkcyBjb25kaXRpb24gdmFyaWFibGVzIGFuZCBtdXRleGVzIHVzZWQgdG8gc2lnbmFsCisgKiB0aHJlYWRzIHdoZW4gYSBjb25kaXRpb24gY2hhbmdlcy4gIFRoaXMgaXMgdG8gd29ya2Fyb3VuZCBhbiBOUFRMIGJ1ZworICogd2hlcmUgcGFkZGluZyB3YXMgYWRkZWQgdG8gcHRocmVhZF9jb25kX3Qgd2hpY2ggY2F1c2VkIHRoZSBpbml0aWFsaXphdGlvbgorICogcm91dGluZSB0byB3cml0ZSBvdXRzaWRlIG9mIHRoZSBzdHJ1Y3R1cmUgaWYgY29tcGlsZWQgb24gcHJlLU5QVEwgdGhyZWFkcy4KKyAqLworCisjaWYgS01QX09TX1dJTkRPV1MKK3R5cGVkZWYgc3RydWN0IGttcF93aW4zMl9tdXRleAoreworICAgIC8qIFRoZSBMb2NrICovCisgICAgQ1JJVElDQUxfU0VDVElPTiBjczsKK30ga21wX3dpbjMyX211dGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF93aW4zMl9jb25kCit7CisgICAgLyogQ291bnQgb2YgdGhlIG51bWJlciBvZiB3YWl0ZXJzLiAqLworICAgIGludCB3YWl0ZXJzX2NvdW50XzsKKworICAgIC8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gPHdhaXRlcnNfY291bnRfPiAqLworICAgIGttcF93aW4zMl9tdXRleF90IHdhaXRlcnNfY291bnRfbG9ja187CisKKyAgICAvKiBOdW1iZXIgb2YgdGhyZWFkcyB0byByZWxlYXNlIHZpYSBhIDxjb25kX2Jyb2FkY2FzdD4gb3IgYSAqLworICAgIC8qIDxjb25kX3NpZ25hbD4gKi8KKyAgICBpbnQgcmVsZWFzZV9jb3VudF87CisKKyAgICAvKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCAiZ2VuZXJhdGlvbiIgc28gdGhhdCB3ZSBkb24ndCBhbGxvdyAqLworICAgIC8qIG9uZSB0aHJlYWQgdG8gc3RlYWwgYWxsIHRoZSAicmVsZWFzZXMiIGZyb20gdGhlIGJyb2FkY2FzdC4gKi8KKyAgICBpbnQgd2FpdF9nZW5lcmF0aW9uX2NvdW50XzsKKworICAgIC8qIEEgbWFudWFsLXJlc2V0IGV2ZW50IHRoYXQncyB1c2VkIHRvIGJsb2NrIGFuZCByZWxlYXNlIHdhaXRpbmcgKi8KKyAgICAvKiB0aHJlYWRzLiAqLworICAgIEhBTkRMRSBldmVudF87Cit9IGttcF93aW4zMl9jb25kX3Q7CisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfY29uZF91bmlvbiB7CisgICAgZG91YmxlICAgICAgICAgICAgICBjX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgY19wYWRbIENBQ0hFX0xJTkUgXTsKKyAgICBwdGhyZWFkX2NvbmRfdCAgICAgIGNfY29uZDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2NvbmRfdW5pb24ga21wX2NvbmRfYWxpZ25fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9tdXRleF91bmlvbiB7CisgICAgZG91YmxlICAgICAgICAgICAgICBtX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgbV9wYWRbIENBQ0hFX0xJTkUgXTsKKyAgICBwdGhyZWFkX211dGV4X3QgICAgIG1fbXV0ZXg7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9tdXRleF91bmlvbiBrbXBfbXV0ZXhfYWxpZ25fdDsKKworI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXNjX2Jhc2UgeworICAgIHZvaWQgICAgKmRzX3N0YWNrYmFzZTsKKyAgICBzaXplX3QgICAgICAgICAgICBkc19zdGFja3NpemU7CisgICAgaW50ICAgICAgICAgICAgICAgZHNfc3RhY2tncm93OworICAgIGttcF90aHJlYWRfdCAgICAgIGRzX3RocmVhZDsKKyAgICB2b2xhdGlsZSBpbnQgICAgICBkc190aWQ7CisgICAgaW50ICAgICAgICAgICAgICAgZHNfZ3RpZDsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX2FsaXZlOworICAgIERXT1JEICAgICAgICAgICAgIGRzX3RocmVhZF9pZDsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIGRzX3RocmVhZCBrZWVwcyB0aHJlYWQgaGFuZGxlIG9uIFdpbmRvd3MqIE9TLiBJdCBpcyBlbm91Z2ggZm9yIFJUTCBwdXJwb3Nlcy4gSG93ZXZlciwKKyAgICAgICAgICAgIGRlYnVnZ2VyIHN1cHBvcnQgKGxpYm9tcF9kYikgY2Fubm90IHdvcmsgd2l0aCBoYW5kbGVzLCBiZWNhdXNlIHRoZXkgdW5jb21wYXJhYmxlLiBGb3IKKyAgICAgICAgICAgIGV4YW1wbGUsIGRlYnVnZ2VyIHJlcXVlc3RzIGluZm8gYWJvdXQgdGhyZWFkIHdpdGggaGFuZGxlIGguIGggaXMgdmFsaWQgd2l0aGluIGRlYnVnZ2VyCisgICAgICAgICAgICBwcm9jZXNzLCBhbmQgbWVhbmluZ2xlc3Mgd2l0aGluIGRlYnVnZWUgcHJvY2Vzcy4gRXZlbiBpZiBoIGlzIGR1cGVkIGJ5IGNhbGwgdG8KKyAgICAgICAgICAgIER1cGxpY2F0ZUhhbmRsZSgpLCBzbyB0aGUgcmVzdWx0IGgnIGlzIHZhbGlkIHdpdGhpbiBkZWJ1Z2VlIHByb2Nlc3MsIGJ1dCBpdCBpcyBhICpuZXcqCisgICAgICAgICAgICBoYW5kbGUgd2hpY2ggZG9lcyAqbm90KiBlcXVhbCB0byBhbnkgb3RoZXIgaGFuZGxlIGluIGRlYnVnZWUuLi4gVGhlIG9ubHkgd2F5IHRvCisgICAgICAgICAgICBjb21wYXJlIGhhbmRsZXMgaXMgY29udmVydCB0aGVtIHRvIHN5c3RlbS13aWRlIGlkcy4gR2V0VGhyZWFkSWQoKSBmdW5jdGlvbiBpcworICAgICAgICAgICAgYXZhaWxhYmxlIG9ubHkgaW4gTG9uZ2hvcm4gYW5kIFNlcnZlciAyMDAzLiA6LSggSW4gY29udHJhc3QsIEdldEN1cnJlbnRUaHJlYWRJZCgpIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb24gYWxsIFdpbmRvd3MqIE9TIGZsYXZvdXJzIChpbmNsdWRpbmcgV2luZG93cyogOTUpLiBUaHVzLCB3ZSBoYXZlIHRvIGdldCB0aHJlYWQgaWQgYnkKKyAgICAgICAgICAgIGNhbGwgdG8gR2V0Q3VycmVudFRocmVhZElkKCkgZnJvbSB3aXRoaW4gdGhlIHRocmVhZCBhbmQgc2F2ZSBpdCB0byBsZXQgbGlib21wX2RiCisgICAgICAgICAgICBpZGVudGlmeSB0aHJlYWRzLgorICAgICAgICAqLworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGttcF9kZXNjX2Jhc2VfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2Rlc2MgeworICAgIGRvdWJsZSAgICAgICAgICAgZHNfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgIGRzX3BhZFsgS01QX1BBRChrbXBfZGVzY19iYXNlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Rlc2NfYmFzZV90ICBkczsKK30ga21wX2Rlc2NfdDsKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9jYWwgeworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgdGhpc19jb25zdHJ1Y3Q7IC8qIGNvdW50IG9mIHNpbmdsZSdzIGVuY291bnRlcmVkIGJ5IHRocmVhZCAqLworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgbGFzdF9jb25zdHJ1Y3Q7IC8qIGNhY2hlIGZvciB0ZWFtJ3MgY291bnQgdXNlZCBieSBvbGQgYWxnb3JpdGhtICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfbGlzdDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyNlbHNlCisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICBiZ2V0X2xvY2s7ICAgICAgLyogTG9jayBmb3IgYWNjZXNzaW5nIGJnZXQgZnJlZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBib290c3RyYXAgbG9jayBzbyB3ZSBjYW4gdXNlIGl0IGF0IGxpYnJhcnkgc2h1dGRvd24gKi8KKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjZW5kaWYgLyogS01QX1VTRV9CR0VUICovCisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHN0cnVjdCB0dl9kYXRhICAgICAgICAqdHZfZGF0YTsKKyNlbmRpZgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsgLyogc3RvcmVkIGJ5IF9fa21wY19yZWR1Y2UqKCksIHVzZWQgYnkgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworLyogUmVjb3JkIGZvciBob2xkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIGludGVybmFsIGNvbnRyb2xzIHN0YWNrIHJlY29yZHMgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfaW50ZXJuYWxfY29udHJvbCB7CisgICAgaW50ICAgICAgICAgICBzZXJpYWxfbmVzdGluZ19sZXZlbDsgIC8qIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdGhfdGVhbV9zZXJpYWxpemVkIGZpZWxkICovCisgICAgaW50ICAgICAgICAgICBuZXN0ZWQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgIGR5bmFtaWM7ICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICBucHJvYzsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yICMgb2YgdGhyZWFkcyBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24gKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICBibG9ja3RpbWU7ICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSAqLworICAgIGludCAgICAgICAgICAgYnRfaW50ZXJ2YWxzOyAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgaW50ZXJ2YWxzICovCisgICAgaW50ICAgICAgICAgICBidF9zZXQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0ICovCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpbnQgICAgICAgICAgIG1heF9hY3RpdmVfbGV2ZWxzOyAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbWF4X2FjdGl2ZV9sZXZlbHMgKi8KKyAgICBrbXBfcl9zY2hlZF90IHNjaGVkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgcnVudGltZSBzY2hlZHVsZSB7c2NoZWQsY2h1bmt9IHBhaXIgKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZDsgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGFmZmluaXR5ICAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworCit9IGttcF9pbnRlcm5hbF9jb250cm9sX3Q7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorc3RhdGljIGlubGluZSB2b2lkCitjb3B5X2ljdnMoIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKmRzdCwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqc3JjICkgeworICAgICpkc3QgPSAqc3JjOworfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisgICAgI2RlZmluZSBnZXRfX2Jsb2NrdGltZSggeHRlYW0sIHh0aWQgKSAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUpCisgICAgI2RlZmluZSBnZXRfX2J0X3NldCggeHRlYW0sIHh0aWQgKSAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQpCisgICAgI2RlZmluZSBnZXRfX2J0X2ludGVydmFscyggeHRlYW0sIHh0aWQgKSAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMpCisKKyAgICAjZGVmaW5lIGdldF9fbmVzdGVkXzIoeHRlYW0seHRpZCkgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCkKKyAgICAjZGVmaW5lIGdldF9fZHluYW1pY18yKHh0ZWFtLHh0aWQpICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMpCisgICAgI2RlZmluZSBnZXRfX25wcm9jXzIoeHRlYW0seHRpZCkgICAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYykKKyAgICAjZGVmaW5lIGdldF9fc2NoZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkKQorCisgICAgI2RlZmluZSBzZXRfX2Jsb2NrdGltZV90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYmxvY2t0aW1lICkgICAgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzICkgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX2J0X3NldF90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfc2V0ICkgICAgICAgPSAoeHZhbCkgKQorCisKKworICAgICNkZWZpbmUgc2V0X19uZXN0ZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKyAgICAjZGVmaW5lIGdldF9fbmVzdGVkKCB4dGhyZWFkICkgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSBcCisgICAgICAgICAgICA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyAgICAjZGVmaW5lIHNldF9fZHluYW1pYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljICkgPSBcCisgICAgICAgICAgICAgICh4dmFsKSApCisgICAgI2RlZmluZSBnZXRfX2R5bmFtaWMoIHh0aHJlYWQgKSBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF90ZWFtICAgICAgIC0+dC50X3RocmVhZHNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSBcCisgICAgICAgICAgICA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyAgICAjZGVmaW5lIHNldF9fbnByb2MoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICkgPSBcCisgICAgICAgICAgICAgICggKHh0aHJlYWQpLT50aC50aF90ZWFtICAgICAgIC0+dC50X3RocmVhZHNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICkgPSBcCisgICAgICAgICAgICAgICh4dmFsKSApCisKKyAgICAjZGVmaW5lIHNldF9fbnByb2NfcCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19tYXhfYWN0aXZlX2xldmVscyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSA9IFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19zY2hlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQgKSA9IFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKworI2lmIE9NUF80MF9FTkFCTEVECisKKyAgICAjZGVmaW5lIHNldF9fcHJvY19iaW5kKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkgPSBcCisgICAgICAgICAgICAgICh4dmFsKSApCisKKyAgICAjZGVmaW5lIGdldF9fcHJvY19iaW5kKCB4dGhyZWFkICkgXAorICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIGdldF9fYmxvY2t0aW1lKCB4dGVhbSwgeHRpZCApICAgICgoeHRlYW0pLT50LnRfc2V0X2Jsb2NrdGltZVsgICAoeHRpZCldKQorICAgICNkZWZpbmUgZ2V0X19idF9zZXQoIHh0ZWFtLCB4dGlkICkgICAgICAgKCh4dGVhbSktPnQudF9zZXRfYnRfc2V0WyAgICAgICh4dGlkKV0pCisgICAgI2RlZmluZSBnZXRfX2J0X2ludGVydmFscyggeHRlYW0sIHh0aWQgKSAoKHh0ZWFtKS0+dC50X3NldF9idF9pbnRlcnZhbHNbKHh0aWQpXSkKKworICAgICNkZWZpbmUgc2V0X19uZXN0ZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NldF9uZXN0ZWRbMF0gKSA9IFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0tPnQudF9zZXRfbmVzdGVkWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0gKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKyAgICAjZGVmaW5lIGdldF9fbmVzdGVkKCB4dGhyZWFkICkgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9uZXN0ZWRbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXSApIFwKKyAgICAgICAgICAgID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworICAgICNkZWZpbmUgc2V0X19keW5hbWljKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9zZXRfZHluYW1pY1swXSApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9keW5hbWljWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0gKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKyAgICAjZGVmaW5lIGdldF9fZHluYW1pYyggeHRocmVhZCApIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3RlYW0tPnQudF9zZXRfZHluYW1pY1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldICkgXAorICAgICAgICAgICAgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkgKQorCisgICAgI2RlZmluZSBzZXRfX25wcm9jKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9zZXRfbnByb2NbMF0gKSA9IFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0tPnQudF9zZXRfbnByb2NbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXSApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX25wcm9jX3AoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3RlYW0tPnQudF9zZXRfbnByb2NbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXSApID0gKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19ibG9ja3RpbWVfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICAgICAoICggKHh0ZWFtKS0+dC50X3NldF9ibG9ja3RpbWVbKHh0aWQpXSApID0gKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICAgICAoICggKHh0ZWFtKS0+dC50X3NldF9idF9pbnRlcnZhbHNbKHh0aWQpXSApID0gKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19idF9zZXRfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICAgICAoICggKHh0ZWFtKS0+dC50X3NldF9idF9zZXRbKHh0aWQpXSApID0gKHh2YWwpICkKKworICAgICNkZWZpbmUgZ2V0X19uZXN0ZWRfMih4dGVhbSx4dGlkKSAgKCAoeHRlYW0pLT50LnRfc2V0X25lc3RlZFsoeHRpZCldICkKKyAgICAjZGVmaW5lIGdldF9fZHluYW1pY18yKHh0ZWFtLHh0aWQpICggKHh0ZWFtKS0+dC50X3NldF9keW5hbWljWyh4dGlkKV0gKQorICAgICNkZWZpbmUgZ2V0X19ucHJvY18yKHh0ZWFtLHh0aWQpICAgKCAoeHRlYW0pLT50LnRfc2V0X25wcm9jWyh4dGlkKV0gKQorICAgICNkZWZpbmUgZ2V0X19zY2hlZF8yKHh0ZWFtLHh0aWQpICAgKCAoeHRlYW0pLT50LnRfc2V0X3NjaGVkWyh4dGlkKV0gKQorCisKKyNlbmRpZgorCisjaWYgT01QXzMwX0VOQUJMRUQKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3Blbk1QIHRhc2tpbmcgZGF0YSBzdHJ1Y3R1cmVzCisvLworCit0eXBlZGVmIGVudW0ga21wX3Rhc2tpbmdfbW9kZSB7CisgICAgdHNrbV9pbW1lZGlhdGVfZXhlYyA9IDAsCisgICAgdHNrbV9leHRyYV9iYXJyaWVyID0gMSwKKyAgICB0c2ttX3Rhc2tfdGVhbXMgPSAyLAorICAgIHRza21fbWF4ID0gMgorfSBrbXBfdGFza2luZ19tb2RlX3Q7CisKK2V4dGVybiBrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlOyAgICAgICAgIC8qIGRldGVybWluZXMgaG93L3doZW4gdG8gZXhlY3V0ZSB0YXNrcyAqLworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQ7CisKKy8qIE5PVEU6IGttcF90YXNrZGF0YV90IGFuZCBrbXBfdGFza190IHN0cnVjdHVyZXMgYWxsb2NhdGVkIGluIHNpbmdsZSBibG9jayB3aXRoIHRhc2tkYXRhIGZpcnN0ICovCisjZGVmaW5lIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICAgICAoKChrbXBfdGFza2RhdGFfdCAqKSB0YXNrKSAtIDEpCisjZGVmaW5lIEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKSAoa21wX3Rhc2tfdCAqKSAodGFza2RhdGEgKyAxKQorCisvLyBUaGUgdHRfZm91bmRfdGFza3MgZmxhZyBpcyBhIHNpZ25hbCB0byBhbGwgdGhyZWFkcyBpbiB0aGUgdGVhbSB0aGF0IHRhc2tzIHdlcmUgc3Bhd25lZCBhbmQKKy8vIHF1ZXVlZCBzaW5jZSB0aGUgcHJldmlvdXMgYmFycmllciByZWxlYXNlLgorLy8gU3RhdGUgaXMgdXNlZCB0byBhbHRlcm5hdGUgdGFzayB0ZWFtcyBmb3Igc3VjY2Vzc2l2ZSBiYXJyaWVycworI2RlZmluZSBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSxzdGF0ZSkgXAorICAgICgoVENSX1NZTkNfNCgodGFza190ZWFtKS0+dHQudHRfZm91bmRfdGFza3MpID09IFRSVUUpICYmIFwKKyAgICAgKFRDUl80KCh0YXNrX3RlYW0pLT50dC50dF9zdGF0ZSkgICAgICAgPT0gKHN0YXRlKSkpCisvKiEKK0Bpbmdyb3VwIEJBU0lDX1RZUEVTCitAeworKi8KKworLyohCisgKi8KK3R5cGVkZWYga21wX2ludDMyICgqIGttcF9yb3V0aW5lX2VudHJ5X3QpKCBrbXBfaW50MzIsIHZvaWQgKiApOworCisvKiAgc2l6ZW9mX2ttcF90YXNrX3QgcGFzc2VkIGFzIGFyZyB0byBrbXBjX29tcF90YXNrIGNhbGwgICovCisvKiEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAgICAgICAgICAgICAgICAgICAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgICB2b2lkICogICAgICAgICAgICAgIHNoYXJlZHM7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAgICBrbXBfcm91dGluZV9lbnRyeV90IHJvdXRpbmU7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgIHBhcnRfaWQ7ICAgICAgICAgICAgLyoqPCBwYXJ0IGlkIGZvciB0aGUgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgZGVzdHJ1Y3RvcnM7ICAgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGludm9rZSBkZWNvbnN0cnVjdG9ycyBvZiBmaXJzdHByaXZhdGUgQysrIG9iamVjdHMgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcF90YXNrX3Q7CisKKy8qIQorQH0KKyovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tncm91cCB7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNvdW50OyAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgY2FuY2VsX3JlcXVlc3Q7IC8vIHJlcXVlc3QgZm9yIGNhbmNlbGxhdGlvbiBvZiB0aGlzIHRhc2tncm91cAorICAgIHN0cnVjdCBrbXBfdGFza2dyb3VwICpwYXJlbnQ7ICAvLyBwYXJlbnQgdGFza2dyb3VwCit9IGttcF90YXNrZ3JvdXBfdDsKKworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwordHlwZWRlZiB1bmlvbiBrbXBfZGVwbm9kZSAgICAgICBrbXBfZGVwbm9kZV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCAga21wX2RlcG5vZGVfbGlzdF90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkga21wX2RlcGhhc2hfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGVuZF9pbmZvIHsKKyAgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYmFzZV9hZGRyOworICAgICBzaXplX3QgCSAgICAgICAgICAgICAgICBsZW47CisgICAgIHN0cnVjdCB7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIGluOjE7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIG91dDoxOworICAgICB9IGZsYWdzOworfSBrbXBfZGVwZW5kX2luZm9fdDsKKworc3RydWN0IGttcF9kZXBub2RlX2xpc3QgeworICAga21wX2RlcG5vZGVfdCAqICAgICAgICAgICAgICBub2RlOworICAga21wX2RlcG5vZGVfbGlzdF90ICogICAgICAgICBuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGVwbm9kZSB7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICAgICAgICAqIHN1Y2Nlc3NvcnM7CisgICAga21wX3Rhc2tfdCAgICAgICAgICAgICAgICAqIHRhc2s7CisKKyAgICBrbXBfbG9ja190IAkgICAgICAgICAgICAgICAgbG9jazsKKworI2lmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICBpZDsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUga21wX2ludDMyIAkgICAgICAgIG5wcmVkZWNlc3NvcnM7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5yZWZzOworfSBrbXBfYmFzZV9kZXBub2RlX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVwbm9kZSB7CisgICAgZG91YmxlICAgICAgICAgIGRuX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgIGRuX3BhZFsgS01QX1BBRChrbXBfYmFzZV9kZXBub2RlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGVwbm9kZV90IGRuOworfTsKKworc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IHsKKyAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBhZGRyOworICAgIGttcF9kZXBub2RlX3QgICAgIAkgICAgICogbGFzdF9vdXQ7CisgICAga21wX2RlcG5vZGVfbGlzdF90IAkgICAgICogbGFzdF9pbnM7CisgICAga21wX2RlcGhhc2hfZW50cnlfdCAgICAgICogbmV4dF9pbl9idWNrZXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwaGFzaCB7CisgICBrbXBfZGVwaGFzaF9lbnRyeV90ICAgICAqKiBidWNrZXRzOworI2lmZGVmIEtNUF9ERUJVRworICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgbmVsZW1lbnRzOworICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgbmNvbmZsaWN0czsKKyNlbmRpZgorfSBrbXBfZGVwaGFzaF90OworCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisvKiBUaWVkIFRhc2sgc3RhY2sgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9zdGFja19ibG9jayB7CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICAgICAgICBzYl9ibG9ja1sgVEFTS19TVEFDS19CTE9DS19TSVpFIF07CisgICAgc3RydWN0IGttcF9zdGFja19ibG9jayAqICBzYl9uZXh0OworICAgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKiAgc2JfcHJldjsKK30ga21wX3N0YWNrX2Jsb2NrX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrX3N0YWNrIHsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAgICAgICAgIHRzX2ZpcnN0X2Jsb2NrOyAgLy8gZmlyc3QgYmxvY2sgb2Ygc3RhY2sgZW50cmllcworICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgICAgdHNfdG9wOyAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSB0b3Agb2Ygc3RhY2sKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgIHRzX2VudHJpZXM7ICAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHN0YWNrCit9IGttcF90YXNrX3N0YWNrX3Q7CisKKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tpbmdfZmxhZ3MgeyAgICAgICAgICAvKiBUb3RhbCBzdHJ1Y3QgbXVzdCBiZSBleGFjdGx5IDMyIGJpdHMgKi8KKyAgICAvKiBDb21waWxlciBmbGFncyAqLyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgY29tcGlsZXIgZmxhZ3MgbXVzdCBiZSAxNiBiaXRzICovCisgICAgdW5zaWduZWQgdGllZG5lc3MgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZWl0aGVyIHRpZWQgKDEpIG9yIHVudGllZCAoMCkgKi8KKyAgICB1bnNpZ25lZCBmaW5hbCAgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBmaW5hbCgxKSBzbyBleGVjdXRlIGltbWVkaWF0ZWx5ICovCisgICAgdW5zaWduZWQgbWVyZ2VkX2lmMCAgOiAxOyAgICAgICAgICAgICAgIC8qIG5vIF9fa21wY190YXNrX3tiZWdpbi9jb21wbGV0ZX1faWYwIGNhbGxzIGluIGlmMCBjb2RlIHBhdGggKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIGRlc3RydWN0b3JzX3RodW5rIDogMTsgICAgICAgICAvKiBzZXQgaWYgdGhlIGNvbXBpbGVyIGNyZWF0ZXMgYSB0aHVuayB0byBpbnZva2UgZGVzdHJ1Y3RvcnMgZnJvbSB0aGUgcnVudGltZSAqLworICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTI7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZWxzZSAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTM7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8qIExpYnJhcnkgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsaWJyYXJ5IGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRhc2t0eXBlICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciBleHBsaWNpdCgxKSBvciBpbXBsaWNpdCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNrX3NlcmlhbCA6IDE7ICAgICAgICAgICAgICAgLyogdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBkZWZlcnJlZCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNraW5nX3NlciA6IDE7ICAgICAgICAgICAgICAgLyogYWxsIHRhc2tzIGluIHRlYW0gYXJlIGVpdGhlciBleGVjdXRlZCBpbW1lZGlhdGVseSAoMSkgb3IgbWF5IGJlIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRlYW1fc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiBlbnRpcmUgdGVhbSBpcyBzZXJpYWwgKDEpIFsxIHRocmVhZF0gb3IgcGFyYWxsZWwgKDApIFs+PSAyIHRocmVhZHNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGVpdGhlciB0ZWFtX3NlcmlhbCBvciB0YXNraW5nX3NlciBpcyBzZXQsIHRhc2sgdGVhbSBtYXkgYmUgTlVMTCAqLworICAgIC8qIFRhc2sgU3RhdGUgRmxhZ3M6ICovCisgICAgdW5zaWduZWQgc3RhcnRlZCAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PXN0YXJ0ZWQsIDA9PW5vdCBzdGFydGVkICAgICAqLworICAgIHVuc2lnbmVkIGV4ZWN1dGluZyAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1leGVjdXRpbmcsIDA9PW5vdCBleGVjdXRpbmcgKi8KKyAgICB1bnNpZ25lZCBjb21wbGV0ZSAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09Y29tcGxldGUsIDA9PW5vdCBjb21wbGV0ZSAgICovCisgICAgdW5zaWduZWQgZnJlZWQgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWZyZWVkLCAwPT1hbGxvY2F0ZWVkICAgICAgICAqLworICAgIHVuc2lnbmVkIG5hdGl2ZSAgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1nY2MtY29tcGlsZWQgdGFzaywgMD09aW50ZWwgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZDMxICA6IDc7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGxpYnJhcnkgdXNlICovCisKK30ga21wX3Rhc2tpbmdfZmxhZ3NfdDsKKworCitzdHJ1Y3Qga21wX3Rhc2tkYXRhIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrX2lkOyAgICAgICAgICAgICAgIC8qIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlciAgICAgICAgICAgICAgICAqLworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgICAgIHRkX2ZsYWdzOyAgICAgICAgICAgICAgICAgLyogdGFzayBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAvKiB0ZWFtIGZvciB0aGlzIHRhc2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF9hbGxvY190aHJlYWQ7ICAgICAgICAgIC8qIHRocmVhZCB0aGF0IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IG5vdCB1c2VkIGV4Y2VwdCBmb3IgcGVyaGFwcyBJREIgKi8KKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICB0ZF9wYXJlbnQ7ICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2xldmVsOyAgICAgICAgICAgICAgICAgLyogdGFzayBuZXN0aW5nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfaWRlbnQ7ICAgICAgICAgICAgICAgICAvKiB0YXNrIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXNrd2FpdCBkYXRhLgorICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX3Rhc2t3YWl0X2NvdW50ZXI7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfdGhyZWFkOyAgICAgICAvKiBndGlkICsgMSBvZiB0aHJlYWQgZW5jb3VudGVyZWQgdGFza3dhaXQgKi8KKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICB0ZF9pY3ZzOyAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIGNvbnRyb2wgdmFyaWFibGVzIGZvciB0aGUgdGFzayAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrczsgIC8qIENoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykgbm90IHlldCBkZWFsbG9jYXRlZCAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRkX2luY29tcGxldGVfY2hpbGRfdGFza3M7IC8qIENoaWxkIHRhc2tzIG5vdCB5ZXQgY29tcGxldGUgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF90YXNrZ3JvdXBfdCAqICAgICAgIHRkX3Rhc2tncm91cDsgICAgICAgICAvLyBFYWNoIHRhc2sga2VlcHMgcG9pbnRlciB0byBpdHMgY3VycmVudCB0YXNrZ3JvdXAKKyAgICBrbXBfZGVwaGFzaF90ICogICAgICAgICB0ZF9kZXBoYXNoOyAgICAgICAgICAgLy8gRGVwZW5kZW5jaWVzIGZvciBjaGlsZHJlbiB0YXNrcyBhcmUgdHJhY2tlZCBmcm9tIGhlcmUKKyAgICBrbXBfZGVwbm9kZV90ICogICAgICAgICB0ZF9kZXBub2RlOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBncmFwaCBub2RlIGlmIHRoaXMgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisjZW5kaWYKKyNpZiBLTVBfSEFWRV9RVUFECisgICAgX1F1YWQgICAgICAgICAgICAgICAgICAgdGRfZHVtbXk7ICAgICAgICAgICAgIC8vIEFsaWduIHN0cnVjdHVyZSAxNi1ieXRlIHNpemUgc2luY2UgYWxsb2NhdGVkIGp1c3QgYmVmb3JlIGttcF90YXNrX3QKKyNlbHNlCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfZHVtbXlbMl07CisjZW5kaWYKK307IC8vIHN0cnVjdCBrbXBfdGFza2RhdGEKKworLy8gTWFrZSBzdXJlIHBhZGRpbmcgYWJvdmUgd29ya2VkCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCApOworCisvLyBEYXRhIGZvciB0YXNrIHRlYW0gYnV0IHBlciB0aHJlYWQKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF90aHI7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBvbmx5IGluIF9fa21wX2V4ZWN1dGVfdGFza3MsIG1heWJlIG5vdCBhdmFpbCB1bnRpbCB0YXNrIGlzIHF1ZXVlZD8KKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0ZF9kZXF1ZV9sb2NrOyAgICAgICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBkZXF1ZQorICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgIHRkX2RlcXVlOyAgICAgICAgICAgICAgLy8gRGVxdWUgb2YgdGFza3MgZW5jb3VudGVyZWQgYnkgdGRfdGhyLCBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV9oZWFkOyAgICAgICAgIC8vIEhlYWQgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV90YWlsOyAgICAgICAgIC8vIFRhaWwgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9udGFza3M7ICAgICAgIC8vIE51bWJlciBvZiB0YXNrcyBpbiBkZXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBzaG91bGRuJ3QgdGhpcyBiZSB2b2xhdGlsZSBzaW5jZSB1c2VkIGluIHdoaWxlLXNwaW4/CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfZGVxdWVfbGFzdF9zdG9sZW47ICAvLyBUaHJlYWQgbnVtYmVyIG9mIGxhc3Qgc3VjY2Vzc2Z1bCBzdGVhbAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGttcF90YXNrX3N0YWNrX3QgICAgICAgIHRkX3N1c3BfdGllZF90YXNrczsgICAgLy8gU3RhY2sgb2Ygc3VzcGVuZGVkIHRpZWQgdGFza3MgZm9yIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9IGttcF9iYXNlX3RocmVhZF9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aHJlYWRfZGF0YSB7CisgICAga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCAgdGQ7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgdGRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIHRkX3BhZFsgS01QX1BBRChrbXBfYmFzZV90aHJlYWRfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfdGhyZWFkX2RhdGFfdDsKKworCisvLyBEYXRhIGZvciB0YXNrIHRlYW1zIHdoaWNoIGFyZSB1c2VkIHdoZW4gdGFza2luZyBpcyBlbmFibGVkIGZvciB0aGUgdGVhbQordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGFza190ZWFtIHsKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0dF90aHJlYWRzX2xvY2s7ICAgICAgIC8qIExvY2sgdXNlZCB0byBhbGxvY2F0ZSBwZXItdGhyZWFkIHBhcnQgb2YgdGFzayB0ZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGJvb3RzdHJhcCBsb2NrIHNpbmNlIHVzZWQgYXQgbGlicmFyeSBzaHV0ZG93biovCisgICAga21wX3Rhc2tfdGVhbV90ICogICAgICAgdHRfbmV4dDsgICAgICAgICAgICAgICAvKiBGb3IgbGlua2luZyB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdCAqLworICAgIGttcF90aHJlYWRfZGF0YV90ICogICAgIHR0X3RocmVhZHNfZGF0YTsgICAgICAgLyogQXJyYXkgb2YgcGVyLXRocmVhZCBzdHJ1Y3R1cmVzIGZvciB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgc3Vydml2ZXMgdGFzayB0ZWFtIGRlYWxsb2NhdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X2ZvdW5kX3Rhc2tzOyAgICAgICAgLyogSGF2ZSB3ZSBmb3VuZCB0YXNrcyBhbmQgcXVldWVkIHRoZW0gd2hpbGUgZXhlY3V0aW5nIHRoaXMgdGVhbT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdHRfdGhyZWFkc19kYXRhIGlzIHNldCB1cCBhbmQgaW5pdGlhbGl6ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9ucHJvYzsgICAgICAgICAgICAgIC8qICN0aHJlYWRzIGluIHRlYW0gICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfbWF4X3RocmVhZHM7ICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBhbGxvY2F0ZWQgZm9yIHRocmVhZHNfZGF0YSBhcnJheSAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfdW5maW5pc2hlZF90aHJlYWRzOyAvKiAjdGhyZWFkcyBzdGlsbCBhY3RpdmUgICAgICAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfYWN0aXZlOyAgICAgICAgICAgICAvKiBpcyB0aGUgdGVhbSBzdGlsbCBhY3RpdmVseSBleGVjdXRpbmcgdGFza3MgKi8KKworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHR0X3JlZl9jdDsgICAgICAgICAgICAgLyogI3RocmVhZHMgYWNjZXNzaW5nIHN0cnVjdCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChub3QgaW5jbC4gbWFzdGVyKSAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfc3RhdGU7ICAgICAgICAgICAgICAvKiBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90ZTogVkVSWSBzZW5zaXRpdmUgdG8gcGFkZGluZyEgKi8KK30ga21wX2Jhc2VfdGFza190ZWFtX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGFza190ZWFtIHsKKyAgICBrbXBfYmFzZV90YXNrX3RlYW1fdCB0dDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICB0dF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgdHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3Rhc2tfdGVhbV90LCBDQUNIRV9MSU5FKSBdOworfTsKKworI2VuZGlmICAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgKCBVU0VfRkFTVF9NRU1PUlkgPT0gMyApIHx8ICggVVNFX0ZBU1RfTUVNT1JZID09IDUgKQorLy8gRnJlZSBsaXN0cyBrZWVwIHNhbWUtc2l6ZSBmcmVlIG1lbW9yeSBzbG90cyBmb3IgZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcwordHlwZWRlZiBzdHJ1Y3Qga21wX2ZyZWVfbGlzdCB7CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3NlbGY7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3MgZnJlZSBsaXN0CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3N5bmM7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3Mgc3RvbGVuL3JldHVybmVkIGJ5IG90aGVyIHRocmVhZHMKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfb3RoZXI7ICAvLyBOb24tc2VsZiBmcmVlIGxpc3QgKHRvIGJlIHJldHVybmVkIHRvIG93bmVyJ3Mgc3luYyBsaXN0KQorfSBrbXBfZnJlZV9saXN0X3Q7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworLy8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX2luZm8geworLyoKKyAqIFN0YXJ0IHdpdGggdGhlIHJlYWRvbmx5IGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICogdGhpcyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgdGhyZWFkIHN0YXJ0cyB3b3JraW5nIGJ5IHRoZSBtYXN0ZXIuCisgKiAodWJlciBtYXN0ZXJzIG1heSB1cGRhdGUgdGhlbXNlbHZlcyBsYXRlcikKKyAqICh1c2FnZSBkb2VzIG5vdCBjb25zaWRlciBzZXJpYWxpemVkIHJlZ2lvbnMpCisgKi8KKyAgICBrbXBfZGVzY190ICAgICAgICB0aF9pbmZvOworICAgIGttcF90ZWFtX3AgICAgICAgKnRoX3RlYW07ICAgICAgIC8qIHRlYW0gd2UgYmVsb25nIHRvICovCisgICAga21wX3Jvb3RfcCAgICAgICAqdGhfcm9vdDsgICAgICAgLyogcG9pbnRlciB0byByb290IG9mIHRhc2sgaGllcmFyY2h5ICovCisgICAga21wX2luZm9fcCAgICAgICAqdGhfbmV4dF9wb29sOyAgLyogbmV4dCBhdmFpbGFibGUgdGhyZWFkIGluIHRoZSBwb29sICovCisgICAga21wX2Rpc3BfdCAgICAgICAqdGhfZGlzcGF0Y2g7ICAgLyogdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YSAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX2luX3Bvb2w7ICAgIC8qIGluIHRocmVhZCBwb29sICgzMiBiaXRzIGZvciBUQ1IvVENXKSAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgY2FjaGVkIGZyb20gdGhlIHRlYW0gaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICAvKiBUT0RPIHVzZSB0aGVzZSBpbiBtb3JlIHBsYWNlcyBhcyBkZXRlcm1pbmVkIHRvIGJlIG5lZWRlZCB2aWEgcHJvZmlsaW5nICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9ucHJvYzsgICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiBhIHRlYW0gKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF90ZWFtX21hc3RlcjsgICAgIC8qIHRoZSB0ZWFtJ3MgbWFzdGVyIHRocmVhZCAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fc2VyaWFsaXplZDsgLyogdGVhbSBpcyBzZXJpYWxpemVkICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBtaWNyb3Rhc2tfdCAgICAgICB0aF90ZWFtX21pY3JvdGFzazsgIC8qIHNhdmUgZW50cnkgYWRkcmVzcyBmb3IgdGVhbXMgY29uc3RydWN0ICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbXNfbGV2ZWw7ICAgICAvKiBzYXZlIGluaXRpYWwgbGV2ZWwgb2YgdGVhbXMgY29uc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCBpcyAwIG9uIGRldmljZSBidXQgbWF5IGJlIGFueSBvbiBob3N0ICovCisjZW5kaWYKKworICAgIC8qIFRoZSBibG9ja3RpbWUgaW5mbyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIHRocmVhZCBzcnVjdCAqLworICAgIC8qIGF0IHRoZSBzdGFydCBvZiBhIGJhcnJpZXIsIGFuZCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgdGVhbSBhcmUgdXNlZCAqLworICAgIC8qIGF0IHBvaW50cyBpbiB0aGUgY29kZSB3aGVyZSB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm8gbG9uZ2VyIGd1YXJhbnRlZWQgICAqLworICAgIC8qIHRvIGV4aXN0IChmcm9tIHRoZSBQT1Ygb2Ygd29ya2VyIHRocmVhZHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfaW50ZXJ2YWxzOworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfc2V0OworCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAgdGhfZml4ZWRfaWN2czsgICAgICAgICAgICAvKiBJbml0aWFsIElDVnMgZm9yIHRoZSB0aHJlYWQgKi8KKworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGttcF9hZmZpbl9tYXNrX3QgICp0aF9hZmZpbl9tYXNrOyAvKiB0aHJlYWQncyBjdXJyZW50IGFmZmluaXR5IG1hc2sgKi8KKyNlbmRpZgorCisKKy8qCisgKiBUaGUgZGF0YSBzZXQgYnkgdGhlIG1hc3RlciBhdCByZWluaXQsIHRoZW4gUi9XIGJ5IHRoZSB3b3JrZXIKKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBpbnQgICAgIHRoX3NldF9ucHJvYzsgIC8qIGlmID4gMCwgdGhlbiBvbmx5IHVzZSB0aGlzIHJlcXVlc3QgZm9yIHRoZSBuZXh0IGZvcmsgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX3NldF9udGhfdGVhbXM7IC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHBhcmFsbGVsIG5lc3RlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICBrbXBfcHJvY19iaW5kX3QgICAgICAgICB0aF9zZXRfcHJvY19iaW5kOyAvKiBpZiAhPSBwcm9jX2JpbmRfZGVmYXVsdCwgdXNlIHJlcXVlc3QgZm9yIG5leHQgZm9yayAqLworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfY3VycmVudF9wbGFjZTsgLyogcGxhY2UgY3VycmVudGx5IGJvdW5kIHRvICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbmV3X3BsYWNlOyAgICAgLyogcGxhY2UgdG8gYmluZCB0byBpbiBwYXIgcmVnICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfZmlyc3RfcGxhY2U7ICAgLyogZmlyc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbGFzdF9wbGFjZTsgICAgLyogbGFzdCBwbGFjZSBpbiBwYXJ0aXRpb24gKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9iYXJfYXJyaXZlX3RpbWU7ICAgICAgICAgICAvKiBhcnJpdmFsIHRvIGJhcnJpZXIgdGltZXN0YW1wICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfZnJhbWVfdGltZTsgICAgICAgICAgICAgICAgLyogZnJhbWUgdGltZXN0YW1wICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfZnJhbWVfdGltZV9zZXJpYWxpemVkOyAgICAgLyogZnJhbWUgdGltZXN0YW1wIGluIHNlcmlhbGl6ZWQgcGFyYWxsZWwgKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2xvY2FsX3QgICAgICAgICAgICAgdGhfbG9jYWw7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAqdGhfcHJpX2hlYWQ7CisKKy8qCisgKiBOb3cgdGhlIGRhdGEgb25seSB1c2VkIGJ5IHRoZSB3b3JrZXIgKGFmdGVyIGluaXRpYWwgYWxsb2NhdGlvbikKKyAqLworICAgIC8qIFRPRE8gdGhlIGZpcnN0IHNlcmlhbCB0ZWFtIHNob3VsZCBhY3R1YWxseSBiZSBzdG9yZWQgaW4gdGhlIGluZm9fdAorICAgICAqIHN0cnVjdHVyZS4gIHRoaXMgd2lsbCBoZWxwIHJlZHVjZSBpbml0aWFsIGFsbG9jYXRpb24gb3ZlcmhlYWQgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX3RlYW1fcCAqdGhfc2VyaWFsX3RlYW07IC8qc2VyaWFsaXplZCB0ZWFtIGhlbGQgaW4gcmVzZXJ2ZSovCisvKiBUaGUgZm9sbG93aW5nIGFyZSBhbHNvIHJlYWQgYnkgdGhlIG1hc3RlciBkdXJpbmcgcmVpbml0ICovCisgICAgc3RydWN0IGNvbW1vbl90YWJsZSAgICAqdGhfcHJpX2NvbW1vbjsKKworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRoX3NwaW5faGVyZTsgICAvKiB0aHJlYWQtbG9jYWwgbG9jYXRpb24gZm9yIHNwaW5uaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIGF3YWl0aW5nIHF1ZXVpbmcgbG9jayBhY3F1aXJlICovCisKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICp0aF9zbGVlcF9sb2M7CisKKy8qCisgKiBUd28gdmFyaWFibGVzIHVzZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrIC0gc3RydWN0IGNvbnNfaGVhZGVyICp0aF9jb25zIGFuZCBpbnRlIHRoX2ZpcnN0IG1vdmVkIGJlbG93CisgKiBmcm9tIGhlcmUgaW4gb3JkZXIgdG8gYXZvaWQgcGVyZm9ybWFuY2UgcmVncmVzc2lvbgorKi8KKyAgICBpZGVudF90ICAgICAgICAgICp0aF9pZGVudDsKKyAgICB1bnNpZ25lZCAgICAgICAgIHRoX3g7ICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGF0YQorICAgIHVuc2lnbmVkICAgICAgICAgdGhfYTsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLyoKKyAqIFRhc2tpbmctcmVsYXRlZCBkYXRhIGZvciB0aGUgdGhyZWFkCisgKi8KKyAgICBrbXBfdGFza190ZWFtX3QgICAgKiB0aF90YXNrX3RlYW07ICAgICAgICAgICAvLyBUYXNrIHRlYW0gc3RydWN0CisgICAga21wX3Rhc2tkYXRhX3QgICAgICogdGhfY3VycmVudF90YXNrOyAgICAgICAgLy8gSW5uZXJtb3N0IFRhc2sgYmVpbmcgZXhlY3V0ZWQKKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF90YXNrX3N0YXRlOyAgICAgICAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorI2VuZGlmICAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgLyoKKyAgICAgKiBNb3JlIHN0dWZmIGZvciBrZWVwaW5nIHRyYWNrIG9mIGFjdGl2ZS9zbGVlcGluZyB0aHJlYWRzCisgICAgICogKHRoaXMgcGFydCBpcyB3cml0dGVuIGJ5IHRoZSB3b3JrZXIgdGhyZWFkKQorICAgICAqLworICAgIGttcF91aW50OCAgICAgICAgICAgIHRoX2FjdGl2ZV9pbl9wb29sOyAgICAgIC8vIGluY2x1ZGVkIGluIGNvdW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gI2FjdGl2ZSB0aHJlYWRzIGluIHBvb2wKKyAgICBpbnQgICAgICAgICAgICAgICAgICB0aF9hY3RpdmU7ICAgICAgICAgICAgICAvLyAhIHNsZWVwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzIgYml0cyBmb3IgVENSL1RDVworCisKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKiB0aF9jb25zOworICAgIGludCAgICAgICAgICAgICAgICAgIHRoX2ZpcnN0OworCisvKgorICogQWRkIHRoZSBzeW5jcm9uaXppbmcgZGF0YSB3aGljaCBpcyBjYWNoZSBhbGlnbmVkIGFuZCBwYWRkZWQuCisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX2JhbGlnbl90ICAgICAgdGhfYmFyWyBic19sYXN0X2JhcnJpZXIgXTsKKworICAgIEtNUF9BTElHTl9DQUNIRSB2b2xhdGlsZSAgICAga21wX2ludDMyICAgIHRoX25leHRfd2FpdGluZzsgIC8qIGd0aWQrMSBvZiBuZXh0IHRocmVhZCBvbiBsb2NrIHdhaXQgcXVldWUsIDAgaWYgbm9uZSAqLworCisjaWYgKCBVU0VfRkFTVF9NRU1PUlkgPT0gMyApIHx8ICggVVNFX0ZBU1RfTUVNT1JZID09IDUgKQorICAgICNkZWZpbmUgTlVNX0xJU1RTIDQKKyAgICBrbXBfZnJlZV9saXN0X3QgICB0aF9mcmVlX2xpc3RzW05VTV9MSVNUU107ICAgLy8gRnJlZSBsaXN0cyBmb3IgZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcworI2VuZGlmCisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGttcF93aW4zMl9jb25kX3QgIHRoX3N1c3BlbmRfY3Y7CisgICAga21wX3dpbjMyX211dGV4X3QgdGhfc3VzcGVuZF9teDsKKyAgICBpbnQgICAgICAgICAgICAgICB0aF9zdXNwZW5kX2luaXQ7CisjZW5kaWYKKyNpZiBLTVBfT1NfVU5JWAorICAgIGttcF9jb25kX2FsaWduX3QgIHRoX3N1c3BlbmRfY3Y7CisgICAga21wX211dGV4X2FsaWduX3QgdGhfc3VzcGVuZF9teDsKKyAgICBpbnQgICAgICAgICAgICAgICB0aF9zdXNwZW5kX2luaXRfY291bnQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfaXR0X21hcmtfdCAgICAgICAgdGhfaXR0X21hcmtfc2luZ2xlOworICAgIC8vIGFsaWdubWVudCA/Pz8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IGttcF9iYXNlX2luZm9fdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2luZm8geworICAgIGRvdWJsZSAgICAgICAgICB0aF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICB0aF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfaW5mb190LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2luZm9fdCB0aDsKK30ga21wX2luZm9fdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGF0YSB7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiB0X3ZhbHVlOworfSBrbXBfYmFzZV9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9zbGVlcF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9zbGVlcF90ZWFtX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9vcmRlcmVkX3RlYW0geworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX29yZGVyZWRfdGVhbV90OworCit0eXBlZGVmIGludCAgICAgKCpsYXVuY2hfdCkoIGludCBndGlkICk7CisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIEFSR1YgZW50cmllcyB0byBtYWxsb2MgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyAgICAgMTAwCisKKyNpZiBLTVBfTUlDICYmIE9NUF8zMF9FTkFCTEVECisjIGRlZmluZSBLTVBfQkFSUklFUl9JQ1ZfUFVMTCAgIDEKKyNlbHNlCisjIGRlZmluZSBLTVBfQkFSUklFUl9JQ1ZfUFVMTCAgIDAKKyNlbmRpZgorCisjaWYgKEtNUF9QRVJGX1YxMDYgPT0gS01QX09OKQorLy8KKy8vIFNldCB1cCBob3cgbWFueSBhcmd2IHBvaW50ZXJzIHdpbGwgZml0IGluIGNhY2hlIGxpbmVzIGNvbnRhaW5pbmcKKy8vICp0X2lubGluZV9hcmd2LiBIaXN0b3JpY2FsbHksIHdlIGhhdmUgc3VwcG9ydGVkIGF0IGxlYXN0IDk2IGJ5dGVzLgorLy8KKy8vIFVzaW5nIGEgbGFyZ2VyIHZhbHVlIGZvciBtb3JlIHNwYWNlIGJldHdlZW4gdGhlIG1hc3RlciB3cml0ZS93b3JrZXIgcmVhZAorLy8gc2VjdGlvbiBhbmQgcmVhZC93cml0ZSBieSBhbGwgc2VjdGlvbiBzZWVtcyB0byBidXkgbW9yZSBwZXJmb3JtYW5jZQorLy8gb24gRVBDQyBQQVJBTExFTC4KKy8vCisvLyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICAoIDIgKiBDQUNIRV9MSU5FICkKKyMgaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyMgIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfQllURVMgICAgICAgICAgMTkyCisvLyMgIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfQllURVMgICAgICAgICAoIDIgKiBDQUNIRV9MSU5FIC0gKCAoIDUgKiBLTVBfUFRSX1NLSVAgKyAxMCAqIHNpemVvZihpbnQpICsgc2l6ZW9mKGttcF9pbnQ2NCkgKSAlIENBQ0hFX0xJTkUgKSApCisjIGVsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggNCAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2Yoa21wX2ludDgpICsgc2l6ZW9mKGttcF9pbnQxNikgKyBzaXplb2Yoa21wX3VpbnQzMikgKSAlIENBQ0hFX0xJTkUgKSApCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfQllURVMgICAgICAgICAoIDIgKiBDQUNIRV9MSU5FIC0gKCAoIDMgKiBLTVBfUFRSX1NLSVAgKyAyICogc2l6ZW9mKGludCkgKSAlIENBQ0hFX0xJTkUgKSApCisjIGVuZGlmCisjIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyAgICAgICAgKGludCkoIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAvIEtNUF9QVFJfU0tJUCApCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX3RlYW0geworLyoKKyAqIFN5bmNocm9uaXphdGlvbiBEYXRhCisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX29yZGVyZWRfdGVhbV90ICAgICAgIHRfb3JkZXJlZDsKKyAgICBrbXBfYmFsaWduX3RlYW1fdCAgICAgICAgdF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworCisgICAgLyogY291bnQgb2Ygc2luZ2xlIGRpcmVjdGl2ZSBlbmNvdW50ZXJlZCBieSB0ZWFtICovCisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgIHRfY29uc3RydWN0OworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICB0X3NpbmdsZV9sb2NrOyAgLyogdGVhbSBzcGVjaWZpYyBsb2NrICovCisKKy8qCisgKiBNYXN0ZXIgb25seQorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgIHRfbWFzdGVyX3RpZDsgICAvKiB0aWQgb2YgbWFzdGVyIGluIHBhcmVudCB0ZWFtICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWFzdGVyX3RoaXNfY29uczsgLyogInRoaXNfY29uc3RydWN0IiBzaW5nbGUgY291bnRlciBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfbGFzdF9jb25zOyAvKiAibGFzdF9jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbSAqLworICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICp0X2lkZW50OyAgICAgICAgLyogaWYgdm9sYXRpbGUsIGhhdmUgdG8gY2hhbmdlIHRvbyBtdWNoIG90aGVyIGNydWQgdG8gdm9sYXRpbGUgdG9vICovCisgICAga21wX3RlYW1fcCAgICAgICAgICAgICAgKnRfcGFyZW50OyAgICAgICAvKiBwYXJlbnQgdGVhbSAqLworICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X25leHRfcG9vbDsgICAgLyogbmV4dCBmcmVlIHRlYW0gaW4gdGhlIHRlYW0gcG9vbCAqLworICAgIGttcF9kaXNwX3QgICAgICAgICAgICAgICp0X2Rpc3BhdGNoOyAgICAgLyogdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YSAqLworI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX3Rhc2tfdGVhbV90ICAgICAgICAgKnRfdGFza190ZWFtOyAgICAvKiBUYXNrIHRlYW0gc3RydWN0ICovCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCAgICAgICAgICB0X3Byb2NfYmluZDsgICAgLyogYmluZCB0eXBlIGZvciBwYXIgcmVnaW9uICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLyoKKyAqIE1hc3RlciB3cml0ZSwgd29ya2VycyByZWFkCisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKip0X2FyZ3Y7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYXJnYzsKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisgICAgLyogc3dhcCBjYWNoZSBsaW5lcyAgZm9yIHRfbnByb2MgYW5kIHRfbWF4X2FyZ2MgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9ucHJvYzsgICAgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gKi8KKyNlbHNlCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X2FyZ2M7CisjZW5kaWYKKyAgICBtaWNyb3Rhc2tfdCAgICAgICAgICAgICAgdF9wa2ZuOworICAgIGxhdW5jaF90ICAgICAgICAgICAgICAgICB0X2ludm9rZTsgICAgICAgLyogcHJvY2VkdXJlIHRvIGxhdW5jaCB0aGUgbWljcm90YXNrICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAga21wX2ludDggICAgICAgICAgICAgICAgIHRfZnBfY29udHJvbF9zYXZlZDsKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9wYWQyYjsKKyAgICBrbXBfaW50MTYgICAgICAgICAgICAgICAgdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLyogRlAgY29udHJvbCByZWdzICovCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfbXhjc3I7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgKEtNUF9QRVJGX1YxMDYgPT0gS01QX09OKQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X2lubGluZV9hcmd2WyBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyBdOworI2VuZGlmCisKKyNpZiAoS01QX1BFUkZfVjE5ID09IEtNUF9PTikKKyAgICBLTVBfQUxJR05fQ0FDSEUKKyNlbmRpZgorICAgIGttcF9pbmZvX3QgICAgICAgICAgICAgKip0X3RocmVhZHM7CisjaWYgKEtNUF9QRVJGX1YxMDYgPT0gS01QX09OKQorICAgIC8qIHN3YXAgY2FjaGUgbGluZXMgIGZvciB0X25wcm9jIGFuZCB0X21heF9hcmdjICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X2FyZ2M7CisjZWxzZQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X25wcm9jOyAgICAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gdGVhbSAqLworI2VuZGlmCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X25wcm9jOyAgICAvKiBtYXhpbXVtIHRocmVhZHMgdGhpcyB0ZWFtIGNhbiBoYW5kbGUgKHRoaXMgaXMgZHluYW1pY2x5IGV4cGFuZGFibGUpICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfc2VyaWFsaXplZDsgICAvKiBsZXZlbHMgZGVlcCBvZiBzZXJpYWxpemVkIHRlYW1zICovCisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAgKnRfZGlzcF9idWZmZXI7ICAvKiBidWZmZXJzIGZvciBkaXNwYXRjaCBzeXN0ZW0gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9pZDsgICAgICAgICAgIC8vIHRlYW0ncyBpZCwgYXNzaWduZWQgYnkgZGVidWdnZXIuCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9sZXZlbDsgICAgICAgIC8qIG5lc3RlZCBwYXJhbGxlbCBsZXZlbCAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2FjdGl2ZV9sZXZlbDsgLyogbmVzdGVkIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbCAqLworICAgIGttcF9yX3NjaGVkX3QgICAgICAgICAgICB0X3NjaGVkOyAgICAgICAgLyogcnVuLXRpbWUgc2NoZWR1bGUgZm9yIHRoZSB0ZWFtICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfZmlyc3RfcGxhY2U7ICAvKiBmaXJzdCAmIGxhc3QgcGxhY2UgaW4gICAgICAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2xhc3RfcGxhY2U7ICAgLyogcGFyZW50IHRocmVhZCdzIHBhcnRpdGlvbi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgdGhlc2UgdmFsdWVzIHRvICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXN0ZXIgYWZ0ZXIgcGFyIHJlZ2lvbi4gICAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyNpZiBLTVBfTUlDCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfc2l6ZV9jaGFuZ2VkOyAvKiB0ZWFtIHNpemUgd2FzIGNoYW5nZWQ/OiAwIC0gbm8sIDEgLSB5ZXMsIC0xIC0gY2hhbmdlZCB2aWEgb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwgKi8KKyNlbmRpZgorCisvKgorICogUmVhZC93cml0ZSBieSB3b3JrZXJzIGFzIHdlbGwKKyAqLworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLyBVc2luZyBDQUNIRV9MSU5FPTY0IHJlZHVjZXMgbWVtb3J5IGZvb3RwcmludCwKKyAgICAvLyAgICBidXQgY2F1c2VzIGEgYmlnIHBlcmYgcmVncmVzc2lvbiBvZiBlcGNjICdwYXJhbGxlbCcgYW5kICdiYXJyaWVyJyBvbiBmeGUyNTZsaW4wMS4KKyAgICAvLyBUaGlzIGV4dHJhIHBhZGRpbmcgc2VydmVzIHRvIGZpeCB0aGUgcGVyZm9ybWFuY2Ugb2YgZXBjYyAncGFyYWxsZWwnIGFuZCAnYmFycmllcicgd2hlbiBDQUNIRV9MSU5FPTY0LgorICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG1vcmUgYW5kIGdldCByaWQgaWYgdGhpcyBwYWRkaW5nLgorICAgIGNoYXIgZHVtbXlfcGFkZGluZ1sxMDI0XTsKKyNlbmRpZgorICAgIEtNUF9BTElHTl9DQUNIRQorI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX3Rhc2tkYXRhX3QgICAgICAgICAgKnRfaW1wbGljaXRfdGFza190YXNrZGF0YTsgIC8vIFRhc2tkYXRhIGZvciB0aGUgdGhyZWFkJ3MgaW1wbGljaXQgdGFzaworI2Vsc2UKKyAgICAvLyBJbnRlcm5hbCBjb250cm9sIHZhcmlhYmxlcyBmb3IgY3VycmVudCB0aHJlYWQgdGVhbQorICAgIC8vIFRPRE8gIENvbnZlcnQgdGhlc2UgZmllbGRzIHRvIGFuIGFycmF5IG9mICBrbXBfaW50ZXJuYWxfY29udHJvbF90IHdoaWNoIHNpbXBsaWZpZXMgcGFyYW1ldGVyIHBhc3NpbmcKKyAgICAvLyAgICAgICBhbmQgYWxzbyBwcmV2ZW50cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBkdWUgdG8gZmFsc2Ugc2hhcmluZyB3aGVuIGFsbCB0aHJlYWRzIHNldCBhIGNvbnRyb2wgdmFyCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgKnRfc2V0X25wcm9jOyAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciAjIG9mIHRocmVhZHMgZm9yIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAqdF9zZXRfbmVzdGVkOyAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAqdF9zZXRfZHluYW1pYzsgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIgdGhyZWFkKSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICp0X3NldF9ibG9ja3RpbWU7IC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICp0X3NldF9idF9pbnRlcnZhbHM7IC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSBpbnRlcnZhbHMgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAqdF9zZXRfYnRfc2V0OyAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0ICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgICp0X2NvbnRyb2xfc3RhY2tfdG9wOyAgLyogaW50ZXJuYWwgY29udHJvbCBzdGFjayBmb3IgYWRkaXRpb25hbCBuZXN0ZWQgdGVhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU0VSSUFMSVpFRCB0ZWFtcyBuZXN0ZWQgMiBvciBtb3JlIGxldmVscyBkZWVwICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgdF9jYW5jZWxfcmVxdWVzdDsgLyogdHlwZWQgZmxhZyB0byBzdG9yZSByZXF1ZXN0IHN0YXRlIG9mIGNhbmNlbGxhdGlvbiAqLworI2VuZGlmCisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfYWN0aXZlOy8qIHNhdmUgb24gZm9yaywgcmVzdG9yZSBvbiBqb2luICovCisgICAga21wX3Rhc2txX3QgICAgICAgICAgICAgIHRfdGFza3E7ICAgICAgICAvKiB0aGlzIHRlYW0ncyB0YXNrIHF1ZXVlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfY29weXByaXZfZGF0YTsgIC8qIHRlYW0gc3BlY2lmaWMgcG9pbnRlciB0byBjb3B5cHJpdmF0ZSBkYXRhIGFycmF5ICovCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfY29weWluX2NvdW50ZXI7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X3N0YWNrX2lkOyAgICAgICAvKiB0ZWFtIHNwZWNpZmljIHN0YWNrIHN0aXRjaGluZyBpZCAoZm9yIGl0dG5vdGlmeSkgKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IGttcF9iYXNlX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90ZWFtIHsKKyAgICBrbXBfYmFzZV90ZWFtX3QgICAgIHQ7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RlYW1fdCwgQ0FDSEVfTElORSkgXTsKK307CisKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RpbWVfZ2xvYmFsIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF90aW1lX2dsb2JhbF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9nbG9iYWwgeworICAgIC8qIGNhY2hlLWFsaWduZWQgKi8KKyAgICBrbXBfdGltZV9nbG9iYWxfdCAgIGdfdGltZTsKKworICAgIC8qIG5vbiBjYWNoZS1hbGlnbmVkICovCisgICAgdm9sYXRpbGUgaW50ICAgICAgICBnX2Fib3J0OworICAgIHZvbGF0aWxlIGludCAgICAgICAgZ19kb25lOworCisgICAgaW50ICAgICAgICAgICAgICAgICBnX2R5bmFtaWM7CisgICAgZW51bSBkeW5hbWljX21vZGUgICBnX2R5bmFtaWNfbW9kZTsKKworfSBrbXBfYmFzZV9nbG9iYWxfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2dsb2JhbCB7CisgICAga21wX2Jhc2VfZ2xvYmFsX3QgICBnOworICAgIGRvdWJsZSAgICAgICAgICAgICAgZ19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZ19wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZ2xvYmFsX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF9nbG9iYWxfdDsKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9yb290IHsKKyAgICAvLyBUT0RPOiBHRUggLSBjb21iaW5lIHJfYWN0aXZlIHdpdGggcl9pbl9wYXJhbGxlbCB0aGVuIHJfYWN0aXZlID09IChyX2luX3BhcmFsbGVsPj0gMCkKKyAgICAvLyBUT0RPOiBHRUggLSB0aGVuIHJlcGxhY2Ugcl9hY3RpdmUgd2l0aCB0X2FjdGl2ZV9sZXZlbHMgaWYgd2UgY2FuIHRvIHJlZHVjZSB0aGUgc3luY2gKKyAgICAvLyAgICAgICAgICAgICBvdmVyaGVhZCBvciBrZWVwaW5nIHJfYWN0aXZlCisKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYWN0aXZlOyAgICAgICAvKiBUUlVFIGlmIHNvbWUgcmVnaW9uIGluIGEgbmVzdCBoYXMgPiAxIHRocmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfaW5fcGFyYWxsZWwKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfbmVzdGVkOyAgICAgICAvLyBUT0RPOiBHRUggLSBUaGlzIGlzIHVudXNlZCwganVzdCByZW1vdmUgaXQgZW50aXJlbHkuCisgICAgaW50ICAgICAgICAgICAgICAgICByX2luX3BhcmFsbGVsOyAgLyoga2VlcHMgYSBjb3VudCBvZiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9ucyBwZXIgcm9vdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfYWN0aXZlX2xldmVscworICAgIGttcF90ZWFtX3QgICAgICAgICAqcl9yb290X3RlYW07CisgICAga21wX3RlYW1fdCAgICAgICAgICpyX2hvdF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICAgICAqcl91YmVyX3RocmVhZDsKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHJfYmVnaW5fbG9jazsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYmVnaW47CisgICAgaW50ICAgICAgICAgICAgICAgICByX2Jsb2NrdGltZTsgLyogYmxvY2t0aW1lIGZvciB0aGlzIHJvb3QgYW5kIGRlc2NlbmRhbnRzICovCit9IGttcF9iYXNlX3Jvb3RfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Jvb3QgeworICAgIGttcF9iYXNlX3Jvb3RfdCAgICAgcjsKKyAgICBkb3VibGUgICAgICAgICAgICAgIHJfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHJfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3Jvb3RfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX3Jvb3RfdDsKKworc3RydWN0IGZvcnRyYW5faW54X2luZm8geworICAgIGttcF9pbnQzMiAgIGRhdGE7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIGludCAgICAgIF9fa21wX3NldHRpbmdzOworZXh0ZXJuIGludCAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rOworI2lmIFVTRV9JVFRfQlVJTEQKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXM7CitleHRlcm4gaW50ICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGU7CisjZW5kaWYKK2V4dGVybiBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2Q7CitleHRlcm4gaW50ICAgICAgX19rbXBfZGV0ZXJtX3JlZDsKKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCAgICAgIGttcF9hX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9iX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9jX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9kX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9lX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9mX2RlYnVnOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19JTklUICAgICAgICA1MTIKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19NSU4gICAgICAgICAxCisKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19JTklUICAgICAgICAxMjgKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19NSU4gICAgICAgICAyCisKK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1ZjsgICAgICAgICAgICAvKiBUUlVFIG1lYW5zIHVzZSBidWZmZXIsIEZBTFNFIG1lYW5zIHByaW50IHRvIHN0ZGVyciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzOyAgICAgIC8qIEhvdyBtYW55IGxpbmVzIG9mIGRlYnVnIHN0b3JlZCBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsgICAgICAvKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljOyAgICAgLyogVFJVRSBtZWFucyB1c2UgYXRvbWljIHVwZGF0ZSBvZiBidWZmZXIgZW50cnkgcG9pbnRlciAqLworCitleHRlcm4gY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXI7ICAgICAgICAgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfY291bnQ7ICAgICAgICAgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlciBzbyBmYXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UgcmVjb21tZW5kZWQgaW4gd2FybmluZ3MgKi8KKy8qIGVuZCByb3RhdGluZyBkZWJ1ZyBidWZmZXIgKi8KKworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZTsgICAgICAgICAgIC8qICsxID0+IG9ubHkgZ28gcGFyIGZvciBjb25zdHJ1Y3RzIGluIHJhbmdlICovCisKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAgICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl07CisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOICAgICAgMTAyNAorZXh0ZXJuIGNoYXIgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl07CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX2xiOworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZV91YjsKKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkOworCitleHRlcm4ga21wX2NwdWluZm9fdCAgICBfX2ttcF9jcHVpbmZvOworCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfc2VyaWFsOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X2d0aWQ7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfY29tbW9uOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X21pZGRsZTsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9wYXJhbGxlbDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9tb25pdG9yOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3VzZXJfbG9ja3M7CitleHRlcm4gaW50IF9fa21wX2luaXRfY291bnRlcjsKK2V4dGVybiBpbnQgX19rbXBfcm9vdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF92ZXJzaW9uOworCisvKiBsaXN0IG9mIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlcyBmb3IgY29tbW9ucyAqLworZXh0ZXJuIGttcF9jYWNoZWRfYWRkcl90ICpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3Q7CisKKy8qIEJhcnJpZXIgYWxnb3JpdGhtIHR5cGVzIGFuZCBvcHRpb25zICovCitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdDsKK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuICAgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWUgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfdHlwZV9uYW1lICAgICAgICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgICAgICAgIFsgYnBfbGFzdF9iYXIgXTsKKworLyogR2xvYmFsIExvY2tzICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jazsgICAgIC8qIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAgLyogY29udHJvbCBmb3JrL2pvaW4gYWNjZXNzIGFuZCBsb2FkIGNhbGN1bGF0aW9uIGlmIHJtbCBpcyB1c2VkKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9leGl0X2xvY2s7ICAgICAgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7ICAgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitleHRlcm4ga21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgLyogY29udHJvbCBPUy9nbG9iYWwgYWNjZXNzICAqLworZXh0ZXJuIGttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgLyogY29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitleHRlcm4ga21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAgICAgLyogY29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKworLyogdXNlZCBmb3IgeWllbGRpbmcgc3Bpbi13YWl0cyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQ7ICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQ7ICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitleHRlcm4gZW51bSBsaWJyYXJ5X3R5cGUgX19rbXBfbGlicmFyeTsKKworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfc2NoZWQ7ICAgIC8qIGRlZmF1bHQgcnVudGltZSBzY2hlZHVsaW5nICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zdGF0aWM7ICAgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX2d1aWRlZDsgICAvKiBkZWZhdWx0IGd1aWRlZCBzY2hlZHVsaW5nIG1ldGhvZCAqLworI2lmIE9NUF8zMF9FTkFCTEVECitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9hdXRvOyAgICAgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKK2V4dGVybiBpbnQgICAgICAgICAgICAgIF9fa21wX2NodW5rOyAgICAvKiBkZWZhdWx0IHJ1bnRpbWUgY2h1bmsgc2l6ZSAqLworCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9zdGtzaXplOyAgICAgICAgLyogc3RhY2sgc2l6ZSBwZXIgdGhyZWFkICAgICAgICAgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZTsvKiBzdGFjayBzaXplIGZvciBtb25pdG9yIHRocmVhZCAqLworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrb2Zmc2V0OyAgICAgIC8qIHN0YWNrIG9mZnNldCBwZXIgdGhyZWFkICAgICAgICovCisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX21hbGxvY19wb29sX2luY3I7IC8qIGluY3JlbWVudGFsIHNpemUgb2YgcG9vbCBmb3Iga21wX21hbGxvYygpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfY2h1bms7ICAgICAgLyogd2FzIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X3N0a3NpemU7ICAgIC8qIHdhcyBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfc3Rrc2l6ZTsvKiB3YXMgT01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYWxsX3RocmVhZHM7ICAgIC8qIHdhcyBLTVBfQUxMX1RIUkVBRFMgb3IgS01QX01BWF9USFJFQURTIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfYWxsX3RocmVhZHM7Lyogd2FzIE9NUF9USFJFQURfTElNSVQgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZTsgIC8qIHdhcyBLTVBfQkxPQ0tUSU1FIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaGVja3M7ICAgICAvKiB3YXMgS01QX0NIRUNLUyBzcGVjaWZpZWQ/ICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiB3YXMgS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzOyAvKiBzaG91bGQgd2UgaXNzdWUgd2FybmluZ3M/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm47ICAgLyogaGF2ZSB3ZSBpc3N1ZWQgcmVzZXJ2ZV90aHJlYWRzIHdhcm5pbmc/ICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50OyAgLyogY291bnQgaW5zaWRlIF9fa21wX3N1c3BlbmQoKSAqLworI2VuZGlmCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2luaXQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9uZXh0OworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRpbmdfb247CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZTsKK2V4dGVybiBrbXBfaW50MzIgIF9fa21wX3lpZWxkX29uX2NvdW50OworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb2ZmX2NvdW50OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQ7CisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX2FsaWduX2FsbG9jOworLyogZm9sbG93aW5nIGRhdGEgcHJvdGVjdGVkIGJ5IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF94cHJvYzsgICAgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NvcnMgaW4gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYXZhaWxfcHJvYzsgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZTsgLyogc3lzdGVtLWRlZmluZWQgbWluaW11bSBzdGFjayBzaXplICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zeXNfbWF4X250aDsgICAgLyogc3lzdGVtLWltcG9zZWQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbWF4X250aDsgICAgICAgIC8qIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGNvbmN1cnJlbnRseS1leGlzdGluZyB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyAvKiBjYXBhY2l0eSBvZiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGg7ICAvKiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGluIGEgcGFyYWxsZWwgcmVnaW9uIGEgbGEgT01QX05VTV9USFJFQURTICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViOyAvKiB1cHBlciBib3VuZCBvbiAiIiBkZXRlcm1pbmVkIGF0IHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FwYWNpdHk7ICAgIC8qIGNhcGFjaXR5IG9mIF9fa21wX3RocmVhZHMgaWYgdGhyZWFkcHJpdmF0ZSBpcyB1c2VkIChmaXhlZCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RwX2NhY2hlZDsgICAgICAvKiB3aGV0aGVyIHRocmVhZHByaXZhdGUgY2FjaGUgaGFzIGJlZW4gY3JlYXRlZCAoX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKCkpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X25lc3RlZDsgICAgLyogbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9ORVNURUQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lOyAvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGJsb2NraW5nIChlbnYgc2V0dGluZykgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX21vbml0b3Jfd2FrZXVwczsvKiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHM7ICAgLyogbnVtYmVyIG9mIG1vbml0b3IgdGltZXN0YW1wIGludGVydmFscyBiZWZvcmUgYmxvY2tpbmcgKi8KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorZXh0ZXJuIGludCAgICAgICAgX19rbXBfemVyb19idDsgICAgICAgIC8qIHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIGZvcmNlZCB0byB6ZXJvICovCisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2h0X2NhcGFibGU7ICAgICAvKiB3aGV0aGVyIENQVXMgc3VwcG9ydCBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfaHRfZW5hYmxlZDsgICAgIC8qIHdoZXRoZXIgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMgZW5hYmxlZCBpbiBPUyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmNvcmVzOyAgICAgICAgIC8qIE51bWJlciBvZiBwaHlzaWNhbCBwcm9jcyBpbiBIVCBtYWNoaW5lICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9odF9sb2dfcGVyX3BoeTsgLyogTWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzIHBlciBwYWNrYWdlICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmU7LyogTnVtYmVyIG9mIGh5cGVydGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lLiAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWJvcnRfZGVsYXk7ICAgIC8qIE51bWJlciBvZiBtaWxsaXNlY3MgdG8gZGVsYXkgb24gYWJvcnQgZm9yIFZUdW5lICovCisKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZDsKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrOy8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ndGlkX21vZGU7ICAgICAgLyogTWV0aG9kIG9mIGdldHRpbmcgZ3RpZCwgdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBub3Qgc2V0LCB3aWxsIGJlIHNldCBhdCBydW50aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIHVzaW5nIHN0YWNrIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBkeW5hbWljIFRMUyAocHRocmVhZF9nZXRzcGVjaWZpYyhMaW51eCogT1MvT1MgWCopIG9yIFRsc0dldFZhbHVlKFdpbmRvd3MqIE9TKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gc3RhdGljIFRMUyAoX19kZWNsc3BlYyh0aHJlYWQpIF9fa21wX2d0aWQpLCBMaW51eCogT1MgLnNvIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlOyAvKiBJZiB0cnVlLCBhZGp1c3QgbWV0aG9kIGJhc2VkIG9uICN0aHJlYWRzICovCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIF9fZGVjbHNwZWModGhyZWFkKSBpbnQgX19rbXBfZ3RpZDsgLyogVGhpcyB0aHJlYWQncyBndGlkLCBpZiBfX2ttcF9ndGlkX21vZGUgPT0gMyAqLworI2Vsc2UKK2V4dGVybiBfX3RocmVhZCBpbnQgX19rbXBfZ3RpZDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAtIHdvcmthcm91bmQgYmVjYXVzZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBjb21waWxlciAyMDExMDMxNiBkb2Vzbid0IGFjY2VwdCBfX2RlY2xzcGVjICovCisjZW5kaWYKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbjsgICAvKiAjdGhyZWFkcyBiZWxvdyB3aGljaCB1c2Ugc3Agc2VhcmNoIGZvciBndGlkICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9mb3JlaWduX3RwOyAgICAgLyogSWYgdHJ1ZSwgc2VwYXJhdGUgVFAgdmFyIGZvciBlYWNoIGZvcmVpZ24gdGhyZWFkICovCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorZXh0ZXJuIGludCAgICAgICAgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sOyAvKiBjb3B5IGZwIGNyZWcocykgcGFyZW50LT53b3JrZXJzIGF0IGZvcmsgKi8KK2V4dGVybiBrbXBfaW50MTYgIF9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQ7IC8qIGluaXQgdGhyZWFkJ3MgRlAgY29udHJvbCByZWcgKi8KK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2luaXRfbXhjc3I7ICAgICAgLyogaW5pdCB0aHJlYWQncyBteHNjciAqLworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIE9NUF8zMF9FTkFCTEVECitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOyAvKiBtYXhfYWN0aXZlX2xldmVscyBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyAqLworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyMgaWYgS01QX09TX0xJTlVYCitleHRlcm4gZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIF9fa21wX2Nsb2NrX2Z1bmN0aW9uOworZXh0ZXJuIGludCBfX2ttcF9jbG9ja19mdW5jdGlvbl9wYXJhbTsKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyMgaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZXh0ZXJuIGRvdWJsZSAgICAgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbDsgICAvKiBJbnRlcnZhbCBmb3IgdGhlIGxvYWQgYmFsYW5jZSBhbGdvcml0aG0gKi8KKyMgZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisvLyBPcGVuTVAgMy4xIC0gTmVzdGVkIG51bSB0aHJlYWRzIGFycmF5Cit0eXBlZGVmIHN0cnVjdCBrbXBfbmVzdGVkX250aHJlYWRzX3QgeworICAgIGludCAqIG50aDsKKyAgICBpbnQgICBzaXplOworICAgIGludCAgIHVzZWQ7Cit9IGttcF9uZXN0ZWRfbnRocmVhZHNfdDsKKworZXh0ZXJuIGttcF9uZXN0ZWRfbnRocmVhZHNfdCBfX2ttcF9uZXN0ZWRfbnRoOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyBQYXJhbWV0ZXJzIGZvciB0aGUgc3BlY3VsYXRpdmUgbG9jayBiYWNrb2ZmIHN5c3RlbS4KK3N0cnVjdCBrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCB7CisgICAgLy8gTnVtYmVyIG9mIHNvZnQgcmV0cmllcyBiZWZvcmUgaXQgY291bnRzIGFzIGEgaGFyZCByZXRyeS4KKyAgICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisgICAgLy8gQmFkbmVzcyBpcyBhIGJpdCBtYXNrIDogMCwxLDMsNywxNSwuLi4gb24gZWFjaCBoYXJkIGZhaWx1cmUgd2UgbW92ZSBvbmUgdG8gdGhlIHJpZ2h0CisgICAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKK307CisKK2V4dGVybiBrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtczsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworZXh0ZXJuIGNoYXIgKiBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGU7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52OyAgICAgICAgICAgLyogVFJVRSBvciBGQUxTRSAqLworZXh0ZXJuIGludCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlOyAgIC8qIFRSVUUgaWYgT01QX0RJU1BMQVlfRU5WPVZFUkJPU0UgKi8KK2V4dGVybiBpbnQgX19rbXBfb21wX2NhbmNlbGxhdGlvbjsgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHByb3RlY3RlZCBieSB0aGUgZm9yay9qb2luIGxvY2sgKi8KKy8qIHdyaXRlOiBsb2NrICByZWFkOiBhbnl0aW1lICovCitleHRlcm4gICAgICAgICAga21wX2luZm9fdCAqKl9fa21wX3RocmVhZHM7ICAgICAgLyogRGVzY3JpcHRvcnMgZm9yIHRoZSB0aHJlYWRzICovCisvKiByZWFkL3dyaXRlOiBsb2NrICovCitleHRlcm4gdm9sYXRpbGUga21wX3RlYW1fdCAgKiAgICAgX19rbXBfdGVhbV9wb29sOworZXh0ZXJuIHZvbGF0aWxlIGttcF9pbmZvX3QgICogICAgIF9fa21wX3RocmVhZF9wb29sOworCisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfbnRoOworLyogdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgcmVhY2hhYmxlIGZyb20gc29tZSByb290IHRocmVhZCBpbmNsdWRpbmcgYWxsIHJvb3QgdGhyZWFkcywKKyAgIGFuZCB0aG9zZSBpbiB0aGUgdGhyZWFkIHBvb2wgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfYWxsX250aDsKK2V4dGVybiBpbnQgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoOworCitleHRlcm4ga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3Q7ICAgICAgICAgLyogcm9vdCBvZiB0aHJlYWQgaGllcmFyY2h5ICovCisvKiBlbmQgZGF0YSBwcm90ZWN0ZWQgYnkgZm9yay9qb2luIGxvY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4ga21wX2dsb2JhbF90ICBfX2ttcF9nbG9iYWw7ICAgICAgICAgLyogZ2xvYmFsIHN0YXR1cyAqLworCitleHRlcm4ga21wX2luZm9fdCBfX2ttcF9tb25pdG9yOworZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGVhbV9jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KK2V4dGVybiB2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3Rhc2tfY291bnRlcjsgICAgICAvLyBVc2VkIGJ5IERlYnVnZ2luZyBTdXBwb3J0IExpYnJhcnkuCisKKyNkZWZpbmUgX0tNUF9HRU5fSUQoIGNvdW50ZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKworCisjZGVmaW5lIEtNUF9HRU5fVEFTS19JRCgpICAgIF9LTVBfR0VOX0lEKCBfX2ttcF90YXNrX2NvdW50ZXIgKQorI2RlZmluZSBLTVBfR0VOX1RFQU1fSUQoKSAgICBfS01QX0dFTl9JRCggX19rbXBfdGVhbV9jb3VudGVyICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkKiBwMiwgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSggdm9pZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9iZWdpbiggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kdG9yKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdCggdm9pZCogKTsKKworZXh0ZXJuIGludCAgX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3QoIGludCBndGlkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2lnbm9yZV9tcHBlbmQoIHZvaWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfZW50ZXJfc2luZ2xlKCBpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhpdF9zaW5nbGUoIGludCBndGlkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICk7CitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApOworCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gaW50ICBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVFYKK2V4dGVybiB2b2lkIF9fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwgdm9pZCAqdGhyZWFkX2FkZHIgKTsKKyNlbmRpZgorCitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCggdm9pZCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3RocmVhZCggaW50IGV4aXRfc3RhdHVzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hYm9ydCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9hYm9ydF90aHJlYWQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3Byb2Nlc3MoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhcm4oIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOworCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfbnVtX3RocmVhZHMoIGludCBuZXdfbnRoLCBpbnQgZ3RpZCApOworCisvLyBSZXR1cm5zIGN1cnJlbnQgdGhyZWFkIChwb2ludGVyIHRvIGttcF9pbmZvX3QpLiBDdXJyZW50IHRocmVhZCAqbXVzdCogYmUgcmVnaXN0ZXJlZC4KK3N0YXRpYyBpbmxpbmUga21wX2luZm9fdCAqIF9fa21wX2VudHJ5X3RocmVhZCgpCit7CisgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgICAgcmV0dXJuIF9fa21wX3RocmVhZHNbZ3RpZF07Cit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbmV3X21heF9hY3RpdmVfbGV2ZWxzICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggaW50IGd0aWQsIGludCBsZXZlbCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApOworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgbmV3X3NjaGVkLCBpbnQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wX2dldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90ICogc2NoZWQsIGludCAqIGNodW5rICk7CisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKKworZXh0ZXJuIGttcF9yX3NjaGVkX3QgX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWRqdXN0X251bV90aHJlYWRzKCBpbnQgbmV3X25wcm9jICk7CisKK2V4dGVybiB2b2lkICogX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKKyNkZWZpbmUgX19rbXBfYWxsb2NhdGUoIHNpemUgKSAgICAgIF9fX2ttcF9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplICkgX19fa21wX3BhZ2VfYWxsb2NhdGUoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZnJlZSggcHRyICkgICAgICAgICAgIF9fX2ttcF9mcmVlKCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKworI2lmIFVTRV9GQVNUX01FTU9SWQorZXh0ZXJuIHZvaWQgKiBfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CisjZGVmaW5lIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRoaXNfdGhyLCBzaXplICkgX19fa21wX2Zhc3RfYWxsb2NhdGUoICh0aGlzX3RociksIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZmFzdF9mcmVlKCB0aGlzX3RociwgcHRyICkgICAgICBfX19rbXBfZmFzdF9mcmVlKCAodGhpc190aHIpLCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNlbmRpZgorCitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF90aHJlYWRfbWFsbG9jKCAgdGgsIHNpemUgKSAgICAgICAgICBfX19rbXBfdGhyZWFkX21hbGxvYyggICh0aCksIChzaXplKSAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfY2FsbG9jKCAgdGgsIG5lbGVtLCBlbHNpemUgKSBfX19rbXBfdGhyZWFkX2NhbGxvYyggICh0aCksIChuZWxlbSksIChlbHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfcmVhbGxvYyggdGgsIHB0ciwgc2l6ZSApICAgICBfX19rbXBfdGhyZWFkX3JlYWxsb2MoICh0aCksIChwdHIpLCAoc2l6ZSkgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfZnJlZSggICAgdGgsIHB0ciApICAgICAgICAgICBfX19rbXBfdGhyZWFkX2ZyZWUoICAgICh0aCksIChwdHIpICAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9NQUxMT0Moc3opICAgIG1hbGxvYyhzeikKKyNkZWZpbmUgS01QX0lOVEVSTkFMX0ZSRUUocCkgICAgICAgZnJlZShwKQorI2RlZmluZSBLTVBfSU5URVJOQUxfUkVBTExPQyhwLHN6KSByZWFsbG9jKChwKSwoc3opKQorI2RlZmluZSBLTVBfSU5URVJOQUxfQ0FMTE9DKG4sc3opICBjYWxsb2MoKG4pLChzeikpCisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApOworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICk7CitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfeWllbGQoIGludCBjb25kICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlKCBrbXBfaW5mb190ICp0YXJnZXRfdGhyLCB2b2xhdGlsZSBrbXBfdWludCAqc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0ga21wX21lbV9mZW5jZV90eXBlIGZldGNoYWRkX2ZlbmNlICk7CisKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworCitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CisKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2VxXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2x0XzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2dlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2xlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZXFfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbmVxXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbHRfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZ2VfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbGVfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF93YWl0X3lpZWxkXzQoIGttcF91aW50MzIgdm9sYXRpbGUgKiBzcGlubmVyLCBrbXBfdWludDMyIGNoZWNrZXIsIGttcF91aW50MzIgKCpwcmVkKSAoa21wX3VpbnQzMiwga21wX3VpbnQzMiksIHZvaWQgKiBvYmogKTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX3dhaXRfeWllbGRfOCgga21wX3VpbnQ2NCB2b2xhdGlsZSAqIHNwaW5uZXIsIGttcF91aW50NjQgY2hlY2tlciwga21wX3VpbnQzMiAoKnByZWQpIChrbXBfdWludDY0LCBrbXBfdWludDY0KSwgdm9pZCAqIG9iaiApOworCitleHRlcm4gdm9pZCBfX2ttcF93YWl0X3NsZWVwKCBrbXBfaW5mb190ICp0aGlzX3Rociwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIsIGttcF91aW50IGNoZWNrZXIsIGttcF9pbnQgZmluYWxfc3BpbgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyk7CitleHRlcm4gdm9pZCBfX2ttcF9pbmZpbml0ZV9sb29wKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXAoIHZvaWQgKTsKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIGV4dGVybiBpbnQgIF9fa21wX2hhbmRsZV9zaWduYWxzOworICAgIGV4dGVybiB2b2lkIF9fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKTsKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIGttcF9pbmZvX3QgKnRociApOworCitleHRlcm4gdm9pZCBfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplICk7CitleHRlcm4gdm9pZCBfX2ttcF9leHBhbmRfZmlsZV9uYW1lKCBjaGFyICpyZXN1bHQsIHNpemVfdCBybGVuLCBjaGFyICpwYXR0ZXJuICk7CisKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljayggdm9pZCApOyAgLyogSW5pdGlhbGl6ZSB0aW1lciB0aWNrIHZhbHVlICovCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICk7ICAvKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKK2V4dGVybiBjaGFyICpfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCk7IC8qIHNldCBhZmZpbml0eSBhY2NvcmRpbmcgdG8gS01QX0FGRklOSVRZICovCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZShpbnQgZ3RpZCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2NoYW5nZV90aHJlYWRfYWZmaW5pdHlfbWFzayggaW50IGd0aWQsIGttcF9hZmZpbl9tYXNrX3QgKm5ld19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIGNvbnN0IGNoYXIgKmVudl92YXIgKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3NldF9hZmZpbml0eSh2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IHRlYW1fc2l6ZSApOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworZXh0ZXJuIGludCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSggdm9pZCApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworZXh0ZXJuIHZvaWQgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGludCBndGlkICk7CitleHRlcm4gaW50ICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYyggdm9pZCApOworCitleHRlcm4gZG91YmxlIF9fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApOworCitleHRlcm4gdm9pZCBfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKTsKKworZXh0ZXJuIHZvaWQgKl9fa21wX2xhdW5jaF90aHJlYWQoIGttcF9pbmZvX3QgKnRociApOworCitleHRlcm4gdm9pZCBfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICk7CisKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIGludCAgX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCk7CitleHRlcm4gaW50ICBfX2ttcF9pc190aHJlYWRfYWxpdmUoIGttcF9pbmZvX3QgKiB0aCwgRFdPUkQgKmV4aXRfdmFsICk7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX2hhbmRsZSgga21wX3RocmVhZF90IHRIYW5kbGUgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmQoIGludCB0aF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwga21wX3VpbnQgY2hlY2tlciApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lKCBpbnQgdGFyZ2V0X2d0aWQsIHZvbGF0aWxlIGttcF91aW50ICpzcGlubmVyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWQoIGRvdWJsZSAqICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VuYWJsZSggaW50IG9sZF9zdGF0ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZGlzYWJsZSggaW50ICpvbGRfc3RhdGUgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggaW50IGd0aWQgKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gdm9pZCBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoIHZvaWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICk7CisKK2V4dGVybiBrbXBfaW5mb190ICogX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQpOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyApOworI2VsaWYgT01QXzMwX0VOQUJMRUQKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjICk7CisjZWxzZQorZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ucHJvYywgaW50IG5ld19zZXRfZHluYW1pYywgaW50IG5ld19zZXRfbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MgKTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90aHJlYWQoIGttcF9pbmZvX3QgKiApOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90ZWFtKCBrbXBfcm9vdF90ICosIGttcF90ZWFtX3QgKiApOworZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9yZWFwX3RlYW0oIGttcF90ZWFtX3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfZmluYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKTsKKworS01QX0VYUE9SVCB2b2lkICprbXBjX21hbGxvYyggc2l6ZV90IHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19jYWxsb2MoIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICprbXBjX3JlYWxsb2MoIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAga21wY19mcmVlKCB2b2lkICpwdHIgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIHVzZSAqLworCitleHRlcm4gaW50ICBfX2ttcF9iYXJyaWVyKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKSApOworZXh0ZXJuIHZvaWQgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIgKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCBfX2ttcF9mb3JrX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBleGVjX21hc3RlciwKKyAga21wX2ludDMyIGFyZ2MsIG1pY3JvdGFza190IG1pY3JvdGFzaywgbGF1bmNoX3QgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAqYXAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitleHRlcm4gdm9pZCBfX2ttcF9qb2luX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcyA9IDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZm9yayggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworCisvLyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkCitLTVBfRVhQT1JUIGludCBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGludCAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3RlYW1zX21hc3RlciggbWljcm90YXNrX3QgbWljcm90YXNrLCBpbnQgZ3RpZCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCBrbXBfaW5mb190ICogdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF91c2VyX3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyLCBpbnQgbGVuICk7CisKKy8qIEZ1bmN0aW9ucyBiZWxvdyBwdXQgaGVyZSB0byBjYWxsIHRoZW0gZnJvbSBfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoKSBpbiBrbXBfc2V0dGluZ3MuYyAqLwordm9pZCBrbXBjX3NldF9ibG9ja3RpbWUgKGludCBhcmcpOwordm9pZCBvbXBjX3NldF9uZXN0ZWQoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X2R5bmFtaWMoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4ga21wX3Rhc2tfdCogX19rbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLCBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKTsKKworZXh0ZXJuIGludCAgX19rbXBfZXhlY3V0ZV90YXNrcygga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludCBjaGVja2VyLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF91bnJlZl90YXNrX3RlYW0oIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3NldHVwICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV9zeW5jICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fd2FpdCAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNraW5nX2JhcnJpZXIoIGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IGd0aWQgKTsKKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKK2V4dGVybiBpbnQgIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCB2b2lkICphZGRyICk7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCk7CisKKyNpZiBLTVBfT1NfVU5JWAorZXh0ZXJuIGludCAgX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICk7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLworLy8gQXNzZW1ibHkgcm91dGluZXMgdGhhdCBoYXZlIG5vIGNvbXBpbGVyIGludHJpbnNpYyByZXBsYWNlbWVudAorLy8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworZXh0ZXJuIHZvaWQgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoIGttcF9jcHVpbmZvX3QgKnAgKTsKKworI2RlZmluZSBfX2ttcF9sb2FkX214Y3NyKHApIF9tbV9zZXRjc3IoKihwKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdG9yZV9teGNzcigga21wX3VpbnQzMiAqcCApIHsgKnAgPSBfbW1fZ2V0Y3NyKCk7IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisjIGRlZmluZSBLTVBfWDg2X01YQ1NSX01BU0sgICAgICAweGZmZmZmZmMwICAgLyogaWdub3JlIHN0YXR1cyBmbGFncyAoNiBsc2IpICovCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCBucHIsIGludCBhcmdjLCB2b2lkICphcmd2W10gKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZmxhZ3MgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3IgY3Rvciwga21wY19jY3RvciBjY3Rvciwga21wY19kdG9yIGR0b3IgKTsKK0tNUF9FWFBPUlQgdm9pZCAqIF9fa21wY190aHJlYWRwcml2YXRlICAgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIHZvaWQgKiBkYXRhLCBzaXplX3Qgc2l6ZSApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JvdW5kX251bV90aHJlYWRzICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX29rX3RvX2ZvcmsgICAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgbmFyZ3MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4gKTsKKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZmx1c2ggICAgICAgICAgICAgICggaWRlbnRfdCAqLCAuLi4gKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19iYXJyaWVyICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9tYXN0ZXIgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19vcmRlcmVkICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfY3JpdGljYWwgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0ZPUl9TVEFUSUNfSU5JVCAgICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludCAqcGxvd2VyLCBrbXBfaW50ICpwdXBwZXIsIGttcF9pbnQgKnBzdHJpZGUsIGttcF9pbnQgaW5jciwga21wX2ludCBjaHVuayApOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Zvcl9zdGF0aWNfZmluaSAgKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApOworCitleHRlcm4gdm9pZCBLTVBDX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgKCBpbnQgYXJnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9EWU5BTUlDICAgICAgICAgICAgKCBpbnQgZmxhZyApOworZXh0ZXJuIHZvaWQgS01QQ19TRVRfTkVTVEVEICAgICAgICAgICAgICggaW50IGZsYWcgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUYXNrcSBpbnRlcmZhY2Ugcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcGNfdGh1bmtfdCAqIF9fa21wY190YXNrcSAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3QgdGFza3FfdGFzaywgc2l6ZV90IHNpemVvZl90aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsIGttcF9pbnQzMiBmbGFncywga21wY19zaGFyZWRfdmFyc190ICoqc2hhcmVkcyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcSAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2txX3Rhc2sgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBzdGF0dXMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIGttcGNfdGh1bmtfdCAqIF9fa21wY190YXNrX2J1ZmZlciAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzayk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgT01QXzMwX0VOQUJMRUQKKy8qCisgKiBPTVAgMy4wIHRhc2tpbmcgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfdGFza190KgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOworS01QX0VYUE9SVCB2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza19wYXJ0cyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApOworCisjaWYgVEFTS19VTlVTRUQKK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKTsKK3ZvaWQgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY190YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKTsKKworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbF9iYXJyaWVyKGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkKTsKK0tNUF9FWFBPUlQgaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCk7CisjZW5kaWYKKworLyoKKyAqIExvY2sgaW50ZXJmYWNlIHJvdXRpbmVzIChmYXN0IHZlcnNpb25zIHdpdGggZ3RpZCBwYXNzZWQgaW4pCisgKi8KK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogSW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIG1ldGhvZHMgcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICk7CisKK0tNUF9FWFBPUlQga21wX3VpbnQ2NCBfX2ttcGNfZ2V0X3Rhc2tpZCgpOworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BsYWNlX3RocmVhZHMoaW50LGludCxpbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBDKysgcG9ydAorLy8gbWlzc2luZyAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb25zCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BvcF9udW1fdGhyZWFkcyggIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgaW50IHByb2NfYmluZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLik7CisKKyNlbmRpZgorCitLTVBfRVhQT1JUIHZvaWQqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKioqIGNhY2hlICk7CisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnk7CitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnk7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGV4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnk7CisjZW5kaWYKKworCisvLyBUaGUgcm91dGluZXMgYmVsb3cgYXJlIG5vdCBleHBvcnRlZC4KKy8vIENvbnNpZGVyIG1ha2luZyB0aGVtICdzdGF0aWMnIGluIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLgordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKKy8vCisvLyBvbXBjXywga21wY18gZW50cmllcyBtb3ZlZCBmcm9tIG9tcC5oLgorLy8KKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04gX19jZGVjbAorI2Vsc2UKKyMgICBkZWZpbmUgS01QQ19DT05WRU5USU9OCisjZW5kaWYKKworI2lmIE9NUF8zMF9FTkFCTEVECisKKyNpZm5kZWYgX19PTVBfSAordHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKyAgICBvbXBfc2NoZWRfc3RhdGljICA9IDEsCisgICAgb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorICAgIG9tcF9zY2hlZF9ndWlkZWQgID0gMywKKyAgICBvbXBfc2NoZWRfYXV0byAgICA9IDQKK30gb21wX3NjaGVkX3Q7Cit0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfc2NoZWR1bGUob21wX3NjaGVkX3QsIGludCk7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfdGVhbV9zaXplKGludCk7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfc3RhY2tzaXplKGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZV9zKHNpemVfdCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2xpYnJhcnkoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfZGVmYXVsdHMoY2hhciBjb25zdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyZWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCkBAIC0wLDAgKzEsNDU0NiBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5jcHAgLS0gYWZmaW5pdHkgbWFuYWdlbWVudAorICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8KKy8vIFByaW50IHRoZSBhZmZpbml0eSBtYXNrIHRvIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW4gYSBwcmV0dHkgZm9ybWF0LgorLy8KK2NoYXIgKgorX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisgICAgY2hhciAqc2NhbiA9IGJ1ZjsKKyAgICBjaGFyICplbmQgPSBidWYgKyBidWZfbGVuIC0gMTsKKworICAgIC8vCisgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IC8gY2hlY2sgZm9yIGVtcHR5IHNldC4KKyAgICAvLworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7IGkrKykgeworICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChpLCBtYXNrKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gS01QX0NQVV9TRVRTSVpFKSB7CisgICAgICAgIHNwcmludGYoc2NhbiwgIns8ZW1wdHk+fSIpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgICAgICBLTVBfQVNTRVJUKHNjYW4gPD0gZW5kKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBzcHJpbnRmKHNjYW4sICJ7JWxkIiwgaSk7CisgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICBpKys7CisgICAgZm9yICg7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7IGkrKykgeworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIG1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cuICBBIHN0cmluZyBvZiB0aGUgZm9ybSAiLDxuPiIgd2lsbCBoYXZlCisgICAgICAgIC8vIGF0IG1vc3QgMTAgY2hhcmFjdGVycywgcGx1cyB3ZSB3YW50IHRvIGxlYXZlIHJvb20gdG8gcHJpbnQgIiwuLi59IgorICAgICAgICAvLyBpZiB0aGUgc2V0IGlzIHRvbyBsYXJnZSB0byBwcmludCBmb3IgYSB0b3RhbCBvZiAxNSBjaGFyYWN0ZXJzLgorICAgICAgICAvLyBXZSBhbHJlYWR5IGxlZnQgcm9vbSBmb3IgJ1wwJyBpbiBzZXR0aW5nIGVuZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGVuZCAtIHNjYW4gPCAxNSkgeworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzcHJpbnRmKHNjYW4sICIsJS1sZCIsIGkpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIH0KKyAgICBpZiAoaSA8IEtNUF9DUFVfU0VUU0laRSkgeworICAgICAgICBzcHJpbnRmKHNjYW4sICIsLi4uIik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIHNwcmludGYoc2NhbiwgIn0iKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgIHJldHVybiBidWY7Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIGludCBncm91cDsKKyAgICAgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICE9IE5VTEwpOworICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IG51bSA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50KGdyb3VwKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGkgKyBncm91cCAqIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSwgbWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgeworICAgICAgICBpbnQgcHJvYzsKKyAgICAgICAgZm9yIChwcm9jID0gMDsgcHJvYyA8IF9fa21wX3hwcm9jOyBwcm9jKyspIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKHByb2MsIG1hc2spOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vCisvLyBJbiBMaW51eCogT1MgZGVidWcgJiBjb3ZlciAoLU8wKSBidWlsZHMsIHdlIG5lZWQgdG8gYXZvaWQgaW5saW5lIG1lbWJlcgorLy8gZnVuY3Rpb25zLgorLy8KKy8vIFRoZSBpY2MgY29kZWdlbiBlbWl0cyBzZWN0aW9ucyB3aXRoIGV4dHJlbWVseSBsb25nIG5hbWVzLCBvZiB0aGUgZm9ybQorLy8gIi5nbnUubGlua29uY2UuPG1hbmdsZWRfbmFtZT4iLiAgVGhlcmUgc2VlbXMgdG8gaGF2ZSBiZWVuIGEgbGlua2VyIGJ1ZworLy8gaW50cm9kdWNlZCBiZXR3ZWVuIEdOVSBsZCB2ZXJzaW9uIDIuMTQuOTAuMC40IGFuZCAyLjE1LjkyLjAuMiBpbnZvbHZpbmcKKy8vIHNvbWUgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbiBvciB0YWJsZSBvdmVyZmxvdyB0aGF0IGlzIHRyaWdnZXJlZCBieQorLy8gdGhlc2UgbG9uZyBzdHJpbmdzLiAgSSBjaGVja2VkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgbGlua2VyIC0KKy8vIEdOVSBsZCAoTGludXgqIE9TL0dOVSBCaW51dGlscykgMi4xOC41MC4wLjcuMjAwODA0MjIgLSBhbmQgdGhlIGJ1ZyBpcyBub3QKKy8vIGZpeGVkLgorLy8KKy8vIFVuZm9ydHVuYXRlbHksIG15IGF0dGVtcHRzIHRvIHJlcHJvZHVjZSBpdCBpbiBhIHNtYWxsZXIgZXhhbXBsZSBoYXZlCisvLyBmYWlsZWQgLSBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcHJvc3BlY3RzIGFyZSBvZiBnZXR0aW5nIGl0IGZpeGVkCisvLyBwcm9wZXJseSAtIGJ1dCB3ZSBuZWVkIGEgcmVwcm9kdWNlciBzbWFsbGVyIHRoYW4gYWxsIG9mIGxpYmlvbXAuCisvLworLy8gV29yayBhcm91bmQgdGhlIHByb2JsZW0gYnkgYXZvaWRpbmcgaW5saW5lIGNvbnN0cnVjdG9ycyBpbiBzdWNoIGJ1aWxkcy4KKy8vIFdlIGRvIHRoaXMgZm9yIGFsbCBwbGF0Zm9ybXMsIG5vdCBqdXN0IExpbnV4KiBPUyAtIG5vbi1pbmxpbmUgZnVuY3Rpb25zIGFyZQorLy8gbW9yZSBkZWJ1Z2dhYmxlIGFuZCBwcm92aWRlIGJldHRlciBjb3ZlcmFnZSBpbnRvIHRoYW4gaW5saW5lIGZ1bmN0aW9ucy4KKy8vIFVzZSBpbmxpbmUgZnVuY3Rpb25zIGluIHNoaXBwaW5nIGxpYnMsIGZvciBwZXJmb3JtYW5jZS4KKy8vCisKKyMgaWYgIWRlZmluZWQoS01QX0RFQlVHKSAmJiAhZGVmaW5lZChDT1ZFUikKKworY2xhc3MgQWRkcmVzcyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heERlcHRoID0gMzI7CisgICAgdW5zaWduZWQgbGFiZWxzW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBjaGlsZE51bXNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGRlcHRoOworICAgIHVuc2lnbmVkIGxlYWRlcjsKKyAgICBBZGRyZXNzKHVuc2lnbmVkIF9kZXB0aCkKKyAgICAgIDogZGVwdGgoX2RlcHRoKSwgbGVhZGVyKEZBTFNFKSB7CisgICAgfQorICAgIEFkZHJlc3MgJm9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKSB7CisgICAgICAgIGRlcHRoID0gYi5kZXB0aDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgICAgIGxhYmVsc1tpXSA9IGIubGFiZWxzW2ldOworICAgICAgICAgICAgY2hpbGROdW1zW2ldID0gYi5jaGlsZE51bXNbaV07CisgICAgICAgIH0KKyAgICAgICAgbGVhZGVyID0gRkFMU0U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICAgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQorICAgICAgICAgICAgaWYobGFiZWxzW2ldICE9IGIubGFiZWxzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgaXNDbG9zZShjb25zdCBBZGRyZXNzICZiLCBpbnQgbGV2ZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICgodW5zaWduZWQpbGV2ZWwgPj0gZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IChkZXB0aCAtIGxldmVsKTsgaSsrKQorICAgICAgICAgICAgaWYobGFiZWxzW2ldICE9IGIubGFiZWxzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShiKTsKKyAgICB9Cit9OworCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpCisgICAgICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKSB7CisgICAgfQorICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpCisgICAgeworICAgICAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgICAgIHNlY29uZCA9IGIuc2Vjb25kOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorfTsKKworIyBlbHNlCisKK2NsYXNzIEFkZHJlc3MgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyOworICAgIHVuc2lnbmVkIGxhYmVsc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgY2hpbGROdW1zW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBsZWFkZXI7CisgICAgQWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpOworICAgIEFkZHJlc3MgJm9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKTsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3Q7CisgICAgYm9vbCBpc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0OworfTsKKworQWRkcmVzczo6QWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpCit7CisgICAgZGVwdGggPSBfZGVwdGg7CisgICAgbGVhZGVyID0gRkFMU0U7Cit9CisKK0FkZHJlc3MgJkFkZHJlc3M6Om9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKSB7CisgICAgZGVwdGggPSBiLmRlcHRoOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGxhYmVsc1tpXSA9IGIubGFiZWxzW2ldOworICAgICAgICBjaGlsZE51bXNbaV0gPSBiLmNoaWxkTnVtc1tpXTsKKyAgICB9CisgICAgbGVhZGVyID0gRkFMU0U7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIEFkZHJlc3M6Om9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBZGRyZXNzOjppc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3QgeworICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IChkZXB0aCAtIGxldmVsKTsgaSsrKQorICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWRkcmVzczo6b3BlcmF0b3IhPShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworfQorCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpOworICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpOworfTsKKworQWRkclVuc1BhaXI6OkFkZHJVbnNQYWlyKEFkZHJlc3MgX2ZpcnN0LCB1bnNpZ25lZCBfc2Vjb25kKQorICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKQoreworfQorCitBZGRyVW5zUGFpciAmQWRkclVuc1BhaXI6Om9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYikKK3sKKyAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjIGVuZGlmIC8qICFkZWZpbmVkKEtNUF9ERUJVRykgJiYgIWRlZmluZWQoQ09WRVIpICovCisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIGZvciAoaSAgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA8IGJiLT5sYWJlbHNbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5sYWJlbHNbaV0gPiBiYi0+bGFiZWxzW2ldKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3QgPD0gZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IGkrKykgeworICAgICAgICBpbnQgaiA9IGRlcHRoIC0gaSAtIDE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdIDwgYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA+IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgaW50IGogPSBpIC0gX19rbXBfYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBXaGVuIHNvcnRpbmcgYnkgbGFiZWxzLCBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcygpIG11c3QgZmlyc3QgYmUKKy8vIGNhbGxlZCB0byByZW51bWJlciB0aGUgbGFiZWxzIGZyb20gWzAuLm5dIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGNoaWxkX251bQorLy8gdmVjdG9yIG9mIHRoZSBhZGRyZXNzIG9iamVjdC4gIFRoaXMgaXMgZG9uZSBpbiBjYXNlIHRoZSBsYWJlbHMgdXNlZCBmb3IKKy8vIHRoZSBjaGlsZHJlbiBhdCBvbmUgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGRpZmZlciBmcm9tIHRob3NlIHVzZWQgZm9yCisvLyBhbm90aGVyIG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwuICBFeGFtcGxlOiAgc3VwcG9zZSB0aGUgbWFjaGluZSBoYXMgMiBub2RlcworLy8gd2l0aCAyIHBhY2thZ2VzIGVhY2guICBUaGUgZmlyc3Qgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDEgYW5kIDYwMiwgYW5kCisvLyBzZWNvbmQgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDMgYW5kIDYwNC4gIElmIHdlIHRyeSB0byBzb3J0IHRoZSB0YWJsZQorLy8gZm9yICJzY2F0dGVyIiBhZmZpbml0eSwgdGhlIHRhYmxlIHdpbGwgc3RpbGwgYmUgc29ydGVkIDYwMSwgNjAyLCA2MDMsIDYwNAorLy8gYmVjYXVzZSB3ZSBhcmUgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgbGFiZWxzIHRoZW1zZWx2ZXMsIG5vdCB0aGUgb3JkaW5hbAorLy8gY2hpbGQgbnVtYmVycy4gIEJ5IHVzaW5nIHRoZSBjaGlsZCBudW1iZXJzIGluIHRoZSBzb3J0LCB0aGUgcmVzdWx0IGlzCisvLyB7MCwwfT02MDEsIHswLDF9PTYwMywgezEsMH09NjAyLCB7MSwxfT02MDQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLAorICBpbnQgbnVtQWRkcnMpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGludCBkZXB0aCA9IGFkZHJlc3Myb3MtPmZpcnN0LmRlcHRoOworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0TGFiZWwgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aAorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBpbnQgbGFiQ3Q7CisgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgYWRkcmVzczJvc1swXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gY291bnRzW2xhYkN0XSA9IDA7CisgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdICE9IGxhc3RMYWJlbFtsYWJDdF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGFiQ3QyOworICAgICAgICAgICAgICAgIGZvciAobGFiQ3QyID0gbGFiQ3QgKyAxOyBsYWJDdDIgPCBkZXB0aDsgbGFiQ3QyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0Ml0gPSAwOworICAgICAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3QyXSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tsYWJDdF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3RdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBsYWJDdCA8IChpbnQpQWRkcmVzczo6bWF4RGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8KKy8vIEFsbCBvZiB0aGUgX19rbXBfYWZmaW5pdHlfY3JlYXRlXypfbWFwKCkgcm91dGluZXMgc2hvdWxkIHNldAorLy8gX19rbXBfYWZmaW5pdHlfbWFza3MgdG8gYSB2ZWN0b3Igb2YgYWZmaW5pdHkgbWFzayBvYmplY3RzIG9mIGxlbmd0aAorLy8gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBpZiBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUsIGFuZAorLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUgKHplcm8gaWYKKy8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkuCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0ICpmdWxsTWFzaworLy8gdG8gdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQuICBUaGV5IG5lZWQgdG8gc2F2ZSBhbmQKKy8vIHJlc3RvcmUgdGhlIG1hc2ssIGFuZCBpdCBjb3VsZCBiZSBuZWVkZWQgbGF0ZXIsIHNvIHNhdmluZyBpdCBpcyBqdXN0IGFuCisvLyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgY2FsbGluZyBrbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFnYWluLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpmdWxsTWFzayA9IE5VTEw7CisKK2ttcF9hZmZpbl9tYXNrX3QgKgorX19rbXBfYWZmaW5pdHlfZ2V0X2Z1bGxNYXNrKCkgeyByZXR1cm4gZnVsbE1hc2s7IH0KKworCitzdGF0aWMgaW50IG5Db3Jlc1BlclBrZywgblBhY2thZ2VzOworaW50IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKworLy8KKy8vIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSBkb2Vzbid0IHdvcmsgd2hlbiBjYWxsZWQgZnJvbQorLy8gcGxhY2VzIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJpbHkgbWFueSBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kKKy8vIG1hcCwgaS5lLiB0aGUgbm9uLWRlZmF1bHQgY2FzZXMgaW4gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCkKKy8vIF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoKS4KKy8vCitpbmxpbmUgc3RhdGljIGJvb2wKK19fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKQoreworICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jID09IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBuQ29yZXNQZXJQa2cgKiBuUGFja2FnZXMpOworfQorCisKKy8vCisvLyBQcmludCBvdXQgdGhlIGRldGFpbGVkIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLCBpLmUuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMKKy8vIG9mIGVhY2ggT1MgcHJvYy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBsZW4sIGludCBkZXB0aCwKKyAgaW50IHBrZ0xldmVsLCBpbnQgY29yZUxldmVsLCBpbnQgdGhyZWFkTGV2ZWwpCit7CisgICAgaW50IHByb2M7CisKKyAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgbGVuOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFRocmVhZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKENvcmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFBhY2thZ2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID4gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlc18lZCAiLCBLTVBfSTE4Tl9TVFIoTm9kZSksCisgICAgICAgICAgICAgICAgICBsZXZlbCAtIHBrZ0xldmVsIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJMJWQgIiwgbGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQgIiwKKyAgICAgICAgICAgICAgYWRkcmVzczJvc1twcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY01hcFRvUGFjaywgIktNUF9BRkZJTklUWSIsIGFkZHJlc3Myb3NbcHJvY10uc2Vjb25kLAorICAgICAgICAgIGJ1Zi5zdHIpOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorfQorCisKKy8vCisvLyBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZXRyaWV2ZSB0aGUgbWFjaGluZSdzIHByb2Nlc3NvciB0b3BvbG9neSwgb3IKKy8vIGVuY291bnRlciBhbiBlcnJvciBpbiBkb2luZyBzbywgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmb3JtIGEgImZsYXQiCisvLyBtYXBwaW5nIG9mIG9zIHRocmVhZCBpZCdzIDwtPiBwcm9jZXNzb3IgaWQncy4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgdGhpcyByb3V0aW5lIG1pZ2h0IHN0aWxsCisgICAgLy8gY2FsbGVkIHRvIHNldCBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAgIC8vIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZGbGF0VG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIGZ1bGxNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VGbGF0LCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGFja2FnZSwgIktNUF9BRkZJTklUWSIpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gT25seSB0aGUgcGFja2FnZSBsZXZlbCBpcyBtb2RlbGVkIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcCwKKyAgICAgICAgLy8gc28gdGhlICNsZXZlbHMgb2YgZ3JhbnVsYXJpdHkgaXMgZWl0aGVyIDAgb3IgMS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisvLworLy8gSWYgbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcyBleGlzdCwgd2UgY2FuIGNyZWF0ZSBhIDItbGV2ZWwKKy8vIHRvcG9sb2d5IG1hcCB3aXRoIHRoZSBncm91cHMgYXQgbGV2ZWwgMCBhbmQgdGhlIGluZGl2aWR1YWwgcHJvY3MgYXQKKy8vIGxldmVsIDEuCisvLworLy8gVGhpcyBmYWNpbGl0YXRlcyBsZXR0aW5nIHRoZSB0aHJlYWRzIGZsb2F0IGFtb25nIGFsbCBwcm9jcyBpbiBhIGdyb3VwLAorLy8gaWYgZ3JhbnVsYXJpdHk9Z3JvdXAgKHRoZSBkZWZhdWx0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdyb3VwcykuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBwcm9jZXNzb3IgZ3JvdXBzLCByZXR1cm4gbm93LgorICAgIC8vIFRoZSBmbGF0IG1hcHBpbmcgd2lsbCBiZSB1c2VkLgorICAgIC8vCisgICAgaWYgKCghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHx8IChfX2ttcF9nZXRfcHJvY19ncm91cChmdWxsTWFzaykgPj0gMCkpIHsKKyAgICAgICAgLy8gRklYTUUgc2V0ICptc2dfaWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29udHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCoqYWRkcmVzczJvcykgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7ICsraSkgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkZHJlc3MgYWRkcigyKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgICAgICBhZGRyLmxhYmVsc1sxXSA9IGkgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk9TUHJvY1RvR3JvdXAsICJLTVBfQUZGSU5JVFkiLCBpLCBhZGRyLmxhYmVsc1swXSwKKyAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lKQorICAgICAgICAgIHx8IChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZ3Jhbl9zdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAiY29yZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gInBhY2thZ2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX25vZGUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJub2RlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdhcm5pbmc6IGNhbid0IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcImdyYW5cIiB3aXRoIGdyb3VwIHRvcG9sb2d5IG1ldGhvZCwgdXNpbmcgInRocmVhZCIKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMjsKK30KKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIGludAorX19rbXBfY3B1aWRfbWFza193aWR0aChpbnQgY291bnQpIHsKKyAgICBpbnQgciA9IDA7CisKKyAgICB3aGlsZSgoMTw8cikgPCBjb3VudCkKKyAgICAgICAgKytyOworICAgIHJldHVybiByOworfQorCisKK2NsYXNzIGFwaWNUaHJlYWRJbmZvIHsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBvc0lkOyAgICAgICAgICAgICAgLy8gcGFyYW0gdG8gX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQKKyAgICB1bnNpZ25lZCBhcGljSWQ7ICAgICAgICAgICAgLy8gZnJvbSBjcHVpZCBhZnRlciBiaW5kaW5nCisgICAgdW5zaWduZWQgbWF4Q29yZXNQZXJQa2c7ICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCBtYXhUaHJlYWRzUGVyUGtnOyAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIHBrZ0lkOyAgICAgICAgICAgICAvLyBpbmZlcnJlZCBmcm9tIGFib3ZlIHZhbHVlcworICAgIHVuc2lnbmVkIGNvcmVJZDsgICAgICAgICAgICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgdGhyZWFkSWQ7ICAgICAgICAgIC8vICAgICAgIiIKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+b3NJZCA8IGJiLT5vc0lkKSByZXR1cm4gLTE7CisgICAgaWYgKGFhLT5vc0lkID4gYmItPm9zSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+cGtnSWQgPCBiYi0+cGtnSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnBrZ0lkID4gYmItPnBrZ0lkKSByZXR1cm4gMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA8IGJiLT5jb3JlSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA+IGJiLT5jb3JlSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+dGhyZWFkSWQgPCBiYi0+dGhyZWFkSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnRocmVhZElkID4gYmItPnRocmVhZElkKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIHdlIGF0dGVtcHQgdG8gdXNlCisvLyBhbiBhbGdvcml0aG0gd2hpY2ggY3ljbGVzIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcyB0aHJlYWRzLCBzZXR0aW5nCisvLyB0aGUgY3VycmVudCB0aHJlYWQncyBhZmZpbml0eSBtYXNrIHRvIHRoYXQgdGhyZWFkLCBhbmQgdGhlbiByZXRyaWV2ZXMKKy8vIHRoZSBBcGljIElkIGZvciBlYWNoIHRocmVhZCBjb250ZXh0IHVzaW5nIHRoZSBjcHVpZCBpbnN0cnVjdGlvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICBpbnQgcmM7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisjICBpZiBLTVBfTUlDCisgICAgeworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyB3aWxsIHVzZSBjcHVpZCg0KS4KKyAgICAgICAgLy8gQ2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkLgorICAgICAgICAvLyBGSVhNRT8gLSB0aGlzIHJlYWxseSBkb2Vzbid0IG5lZWQgdG8gYmUgc3BlY2lmaWMgdG8gTUlDLgorICAgICAgICBrbXBfY3B1aWQgYnVmOworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4IDwgNCkgeworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWY0U3VwcG9ydDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyMgIGVuZGlmIC8vIEtNUF9NSUMKKworICAgIC8vCisgICAgLy8gRXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIHRoaXMgcm91dGluZSBpcyBzdGlsbAorICAgIC8vIGNhbGxlZCB0byBzZXQgX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMKKyAgICAvLyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyZWl2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZSBub3QKKyAgICAvLyBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfYWZmaW5pdHlfZ2V0X21hcCgpL19fa21wX2FmZmluaXR5X2dldF9tYXAoKSwKKyAgICAvLyB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR2V0IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSB1c2luZworICAgICAgICAvLyBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gc29tZSBPUy9jaHBzIGNvbWJpbmF0aW9ucyB3aGVyZSBIVCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAKKyAgICAgICAgLy8gYnV0IGlzIGRpc2FibGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgMiBvbiBhIHNpbmdsZSBjb3JlIGNoaXAuCisgICAgICAgIC8vIFVzdWFsbHksIGl0IHdpbGwgYmUgMiBpZiBIVCBpcyBlbmFibGVkIGFuZCAxIGlmIEhUIGlzIGRpc2FibGVkLgorICAgICAgICAvLworICAgICAgICBrbXBfY3B1aWQgYnVmOworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGludCBtYXhUaHJlYWRzUGVyUGtnID0gKGJ1Zi5lYnggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaWYgKG1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgbWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbnVtIGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgYXV0aG9yIG9mIGNwdV9jb3VudC5jcHAgdHJlYXRlZCB0aGlzIG9ubHkgYW4gdXBwZXIgYm91bmQKKyAgICAgICAgLy8gb24gdGhlIG51bWJlciBvZiBjb3JlcywgYnV0IEkgaGF2ZW4ndCBzZWVuIGFueSBjYXNlcyB3aGVyZSBpdAorICAgICAgICAvLyB3YXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvcmVzLCBzbyB3ZSB3aWxsIHRyZWF0CisgICAgICAgIC8vIGl0IGFzIGV4YWN0IGluIHRoaXMgYmxvY2sgb2YgY29kZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4KKyAgICAgICAgLy8gVG8gc2VlIGlmIGNwdWlkKG4pIGlzIHN1cHBvcnRlZCwgaXNzdWUgY3B1aWQoMCkgYW5kIGNoZWNrIGlmIGVheAorICAgICAgICAvLyBoYXMgdGhlIHZhbHVlIG4gb3IgZ3JlYXRlci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA+PSA0KSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNCwgMCwgJmJ1Zik7CisgICAgICAgICAgICBuQ29yZXNQZXJQa2cgPSAoKGJ1Zi5lYXggPj4gMjYpICYgMHgzZikgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSB0ZWxsIGlmIEhUIGlzIGVuYWJsZWQgd2l0aG91dCBpc3N1aW5nCisgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmcm9tIGV2ZXJ5IHRocmVhZCwgY2FuIGNvcnJlbGF0aW5nIHRoZSBjcHVpZAorICAgICAgICAvLyBpbmZvLCBzbyBpZiB0aGUgbWFjaGluZSBpcyBub3QgYWZmaW5pdHkgY2FwYWJsZSwgd2UgYXNzdW1lIHRoYXQgSFQKKyAgICAgICAgLy8gaXMgb2ZmLiAgV2UgaGF2ZSBzZWVuIHF1aXRlIGEgZmV3IG1hY2hpbmVzIHdoZXJlIG1heFRocmVhZHNQZXJQa2cKKyAgICAgICAgLy8gaXMgMiwgeWV0IHRoZSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgSFQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT2xkZXIgT1NlcyBhcmUgdXN1YWxseSBmb3VuZCBvbiBtYWNoaW5lcyB3aXRoIG9sZGVyIGNoaXBzLCB3aGljaAorICAgICAgICAvLyAgIGRvIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIFRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nIGEgbWFjaGluZSBhcworICAgICAgICAvLyAgIEhUIHdoZW4gaXQgaXNuJ3QgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjbHkgc2V0CisgICAgICAgIC8vICAgdG8gMCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBwZW5hbHR5IHdoZW4gZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcKKyAgICAgICAgLy8gICBhIG1hY2hpbmUgYXMgYmVpbmcgMSB0aHJlYWQvY29yZSB3aGVuIGl0IGlzIHJlYWxseSBIVCBlbmFibGVkCisgICAgICAgIC8vICAgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjdGx5IHNldCB0byBhIHBvc2l0aXZlCisgICAgICAgIC8vICAgdmFsdWUpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgICAvLyBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYW5kIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKSwKKyAgICAvLyBldmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lLgorICAgIC8vCisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZE1hc2s7CisgICAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgICBLTVBfQVNTRVJUKG9sZE1hc2sgIT0gTlVMTCk7CisgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAgIC8vIHRvIGl0LCBhbmQgb2J0YWluaW5nIHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNwdWlkIGluc3RyLgorICAgIC8vCisgICAgLy8gVGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzOgorICAgIC8vCisgICAgLy8gQXBpYyBJZDogQml0cyAyNDozMSBvZiBlYnggYWZ0ZXIgaXNzdWluZyBjcHVpZCgxKSAtIGVhY2ggdGhyZWFkIGNvbnRleHQKKyAgICAvLyAgICBoYXMgYSB1bmlxaWUgQXBpYyBJZCwgd2hpY2ggaXMgb2YgdGhlIGZvcm0gcGtnIyA6IGNvcmUjIDogdGhyZWFkIy4KKyAgICAvLworICAgIC8vIE1heCBUaHJlYWRzIFBlciBQa2c6IEJpdHMgMTY6MjMgb2YgZWJ4IGFmdGVyIGlzc3VpbmcgY3B1aWQoMSkuICBUaGUKKyAgICAvLyAgICB2YWx1ZSBvZiB0aGlzIGZpZWxkIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBjb3JlIyArIHRocmVhZCMKKyAgICAvLyAgICBmaWVsZHMgaW4gdGhlIEFwaWMgSWQuICBJdCBpcyBhbHNvIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIKKyAgICAvLyAgICBvZiB0aHJlYWRzIHBlciBwYWNrYWdlLCBidXQgaXQgaGFzIGJlZW4gdmVyaWZpZWQgdGhhdCBzaXR1YXRpb25zCisgICAgLy8gICAgaGFwcGVuIHdlcmUgaXQgaXMgbm90IGV4YWN0LiAgSW4gcGFydGljdWxhciwgb24gY2VydGFpbiBPUy9jaGlwCisgICAgLy8gICAgY29tYmluYXRpb25zIHdoZXJlIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5IGlzIHN1cHBvcnRlZAorICAgIC8vICAgIGJ5IHRoZSBjaGlwIGJ1dCBoYXMKKyAgICAvLyAgICBiZWVuIGRpc2FibGVkLCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCB3aWxsIGJlIDIgKGZvciBhIHNpbmdsZSBjb3JlCisgICAgLy8gICAgY2hpcCkuICBPbiBvdGhlciBPUy9jaGlwIGNvbWJpbmF0aW9ucyBzdXBwb3J0aW5nCisgICAgLy8gICAgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3ksIHRoZSB2YWx1ZSBvZgorICAgIC8vICAgIHRoaXMgZmllbGQgd2lsbCBiZSAxIHdoZW4gSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMKKyAgICAvLyAgICBkaXNhYmxlZCBhbmQgMiB3aGVuIGl0IGlzIGVuYWJsZWQuCisgICAgLy8KKyAgICAvLyBNYXggQ29yZXMgUGVyIFBrZzogIEJpdHMgMjY6MzEgb2YgZWF4IGFmdGVyIGlzc3VpbmcgY3B1aWQoNCkuICBUaGUKKyAgICAvLyAgICB2YWx1ZSBvZiB0aGlzIGZpZWxkICgrMSkgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjIGZpZWxkIGluCisgICAgLy8gICAgdGhlIEFwaWMgSWQuICBUaGUgY29tbWVudHMgaW4gImNwdWNvdW50LmNwcCIgc2F5IHRoYXQgdGhpcyB2YWx1ZSBpcworICAgIC8vICAgIGFuIHVwcGVyIGJvdW5kLCBidXQgdGhlIElBLTMyIGFyY2hpdGVjdHVyZSBtYW51YWwgc2F5cyB0aGF0IGl0IGlzCisgICAgLy8gICAgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGNvcmVzIHBlciBwYWNrYWdlLCBhbmQgSSBoYXZlbid0IHNlZW4gYW55CisgICAgLy8gICAgY2FzZSB3aGVyZSBpdCB3YXNuJ3QuCisgICAgLy8KKyAgICAvLyBGcm9tIHRoaXMgaW5mb3JtYXRpb24sIGRlZHVjZSB0aGUgcGFja2FnZSBJZCwgY29yZSBJZCwgYW5kIHRocmVhZCBJZCwKKyAgICAvLyBhbmQgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgYXBpY1RocmVhZEluZm8gc3RydWN0LgorICAgIC8vCisgICAgdW5zaWduZWQgaTsKKyAgICBhcGljVGhyZWFkSW5mbyAqdGhyZWFkSW5mbyA9IChhcGljVGhyZWFkSW5mbyAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgX19rbXBfYXZhaWxfcHJvYyAqIHNpemVvZihhcGljVGhyZWFkSW5mbykpOworICAgIHVuc2lnbmVkIG5BcGljcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCluQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgICAgICBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpKTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm9zSWQgPSBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBhcGljIGlkIGFuZCBtYXggdGhyZWFkcyBwZXIgcGtnIGNvbWUgZnJvbSBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAga21wX2NwdWlkIGJ1ZjsKKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgICAgICBpZiAoISAoYnVmLmVkeCA+PiA5KSAmIDEpIHsKKyAgICAgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9BcGljTm90UHJlc2VudDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID0gKGJ1Zi5lYnggPj4gMjQpICYgMHhmZjsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgICAgICBpZiAodGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWF4IGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBjaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwLgorICAgICAgICAvLyBUbyBzZWUgaWYgY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4CisgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgbiBvciBncmVhdGVyLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5mZXIgdGhlIHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQgdXNpbmcgb25seSB0aGUgaW5mbworICAgICAgICAvLyBvYnRhaW5lZCBsb2NhbGx5LgorICAgICAgICAvLworICAgICAgICBpbnQgd2lkdGhDVCA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ucGtnSWQgPSB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoQ1Q7CisKKyAgICAgICAgaW50IHdpZHRoQyA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnKTsKKyAgICAgICAgaW50IHdpZHRoVCA9IHdpZHRoQ1QgLSB3aWR0aEM7CisgICAgICAgIGlmICh3aWR0aFQgPCAwKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGhhcHBlbiwgYnV0IEkgc3VwcG9zZSBpdCBjb3VsZCwgaWYKKyAgICAgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBvbiBhIGNoaXAgd2FzIHJlYWxseSBzY3Jld2VkIHVwLgorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlc3RvcmUgdGhlIGFmZmluaXR5IG1hc2sgYmVmb3JlIHRoZSB0YWlsIGNhbGwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWFza0MgPSAoMSA8PCB3aWR0aEMpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLmNvcmVJZCA9ICh0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoVCkKKyAgICAgICAgICAmbWFza0M7CisKKyAgICAgICAgaW50IG1hc2tUID0gKDEgPDwgd2lkdGhUKSAtIDE7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS50aHJlYWRJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgJm1hc2tUOworCisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChuQXBpY3MgPiAwKTsKKyAgICBpZiAobkFwaWNzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF0ub3NJZCk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBuQXBpY3MsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgLy8gV2UgYWxzbyBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgYXQgdGhpcyBwb2ludDogdGhlIHZhbHVlcyByZXR1cm5lZAorICAgIC8vIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IgYW55IHRocmVhZCBib3VuZCB0byBhIGdpdmVuIHBhY2thZ2UgaGFkCisgICAgLy8gYmV0dGVyIHJldHVybiB0aGUgc2FtZSBpbmZvIGZvciBtYXhUaHJlYWRzUGVyUGtnIGFuZCBtYXhDb3Jlc1BlclBrZy4KKyAgICAvLworICAgIG5QYWNrYWdlcyA9IDE7CisgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIHVuc2lnbmVkIG5Db3JlcyA9IDE7CisKKyAgICB1bnNpZ25lZCBwa2dDdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSByYWRpaQorICAgIHVuc2lnbmVkIGxhc3RQa2dJZCA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgdW5zaWduZWQgY29yZUN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1swXS5jb3JlSWQ7CisgICAgdW5zaWduZWQgdGhyZWFkQ3QgPSAxOworICAgIHVuc2lnbmVkIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9bMF0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJhLXBrZyBjb25zaXN0IGNoZWNrcworICAgIHVuc2lnbmVkIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4Q29yZXNQZXJQa2c7CisgICAgdW5zaWduZWQgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heFRocmVhZHNQZXJQa2c7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbkFwaWNzOyBpKyspIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9baV0ucGtnSWQgIT0gbGFzdFBrZ0lkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIHBrZ0N0Kys7CisgICAgICAgICAgICBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICAgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgICAgICAgICBjb3JlQ3QgPSAxOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgcGFja2FnZSwgc28gZ28gb24gdG8gdGhlIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGFueSBjb25zaXN0ZW5jeSBjaGVja3MuICBSZXNldCB0aGUgY29uc2lzdGVuY3kKKyAgICAgICAgICAgIC8vIGNoZWNrIHZhcnMsIHRob3VnaC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnOworICAgICAgICAgICAgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2c7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLmNvcmVJZCAhPSBsYXN0Q29yZUlkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIGNvcmVDdCsrOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJbmZvW2ldLnRocmVhZElkICE9IGxhc3RUaHJlYWRJZCkgeworICAgICAgICAgICAgdGhyZWFkQ3QrKzsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9MZWdhY3lBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1heENvcmVzUGVyUGtnIGFuZCBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGZpZWxkcyBhZ3JlZSBiZXR3ZWVuIGFsbCB0aGUgdGhyZWFkcyBib3VuZHMgdG8gYSBnaXZlbiBwYWNrYWdlLgorICAgICAgICAvLworICAgICAgICBpZiAoKHByZXZNYXhDb3Jlc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnKQorICAgICAgICAgIHx8IChwcmV2TWF4VGhyZWFkc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2cpKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgblBhY2thZ2VzID0gcGtnQ3Q7CisgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX2h0X2VuYWJsZWQsICYgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgX19rbXBfaHRfZW5hYmxlZCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKTsKKyAgICBfX2ttcF9uY29yZXMgPSBuQ29yZXM7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBudW1iZXIgb2YgcGFja2FnZXMsIHRoZSBudW1iZXIgb2YgY29yZXMKKyAgICAvLyBwZXIgcGFja2FnZSwgYW5kIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY29yZSwgd2UgY2FuIGNvbnN0cnVjdCB0aGUKKyAgICAvLyBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgaW50IHBrZ0xldmVsID0gMDsKKyAgICBpbnQgY29yZUxldmVsID0gKG5Db3Jlc1BlclBrZyA8PSAxKSA/IC0xIDogMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlIDw9IDEpID8gLTEgOiAoKGNvcmVMZXZlbCA+PSAwKSA/IDIgOiAxKTsKKyAgICB1bnNpZ25lZCBkZXB0aCA9IChwa2dMZXZlbCA+PSAwKSArIChjb3JlTGV2ZWwgPj0gMCkgKyAodGhyZWFkTGV2ZWwgPj0gMCk7CisKKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5BcGljczsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgICAgICBpbnQgZCA9IDA7CisKKyAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICB9CisgICAgICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBrZ0xldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIEludGVsKFIpIG1pY3JvYXJjaGl0ZWN0dXJlIGNvZGUgbmFtZSBOZWhhbGVtLCBEdW5uaW5ndG9uIGFuZCBsYXRlcgorLy8gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IGEgbmV3ZXIgaW50ZXJmYWNlIGZvciBzcGVjaWZ5aW5nIHRoZSB4MkFQSUMgSWRzLAorLy8gYmFzZWQgb24gY3B1aWQgbGVhZiAxMS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBjcHVpZCBsZWFmIDExIGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVheCA8IDExKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgMCwgJmJ1Zik7CisgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjExU3VwcG9ydDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neS4gIFdoaWxlIHdlJ3JlIGF0IGl0LAorICAgIC8vIGdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIF9fa21wX25UaHJlYWRzUGVyQ29yZSAmIG5Db3Jlc1BlclBrZy4gIFdlIHdpbGwKKyAgICAvLyB0cnkgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgdmFsdWVzIGxhdGVyIGJ5IGV4cGxpY2l0bHkgY291bnRpbmcgdGhlbSwKKyAgICAvLyBidXQgZ2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgbm93LCBpbiBjYXNlIHdlIHJldHVybiBlYXJseS4KKyAgICAvLworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKworICAgIGZvciAobGV2ZWwgPSAwOzsgbGV2ZWwrKykgeworICAgICAgICBpZiAobGV2ZWwgPiAzMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYWNrIGZvciBEUEQyMDAxNjMxODAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBsZXZlbCBpcyBiaWcgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZyAtPiBleGl0aW5nCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYWN0dWFsbHkgYmUgMzIgdmFsaWQgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LAorICAgICAgICAgICAgLy8gYnV0IHNvIGZhciwgdGhlIG9ubHkgbWFjaGluZSB3ZSBoYXZlIHNlZW4gd2hpY2ggZG9lcyBub3QgZXhpdAorICAgICAgICAgICAgLy8gdGhpcyBsb29wIGJlZm9yZSBpdGVyYXRpb24gMzIgaGFzIGZ1YmFyIHgyQVBJQyBzZXR0aW5ncy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IHJlamVjdCB0aGlzIGNhc2UgYmFzZWQgdXBvbiBsb29wIHRyaXAgY291bnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocGtnTGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXaWxsIGluZmVyIG5QYWNrYWdlcyBmcm9tIF9fa21wX3hwcm9jCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQga2luZCA9IChidWYuZWN4ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaWYgKGtpbmQgPT0gMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNNVCBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2luZCA9PSAyKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gY29yZSBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKG5Db3Jlc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgblBhY2thZ2VzID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoblBhY2thZ2VzID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGludCBkZXB0aCA9IGxldmVsOworCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJvdmUgbG9vcCwgImxldmVsIiB3YXMgY291bnRlZCBmcm9tIHRoZSBmaW5lc3QgbGV2ZWwgKHVzdWFsbHkKKyAgICAvLyB0aHJlYWQpIHRvIHRoZSBjb2Fyc2VzdC4gIFRoZSBjYWxsZXIgZXhwZWN0cyB0aGF0IHdlIHdpbGwgcGxhY2UgdGhlCisgICAgLy8gbGFiZWxzIGluICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSBpbiB0aGUgaW52ZXJzZSBvcmRlciwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGludmVydCB0aGUgdmFycyBzYXlpbmcgd2hpY2ggbGV2ZWwgbWVhbnMgd2hhdC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIHRocmVhZExldmVsID0gZGVwdGggLSB0aHJlYWRMZXZlbCAtIDE7CisgICAgfQorICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICBjb3JlTGV2ZWwgPSBkZXB0aCAtIGNvcmVMZXZlbCAtIDE7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQocGtnTGV2ZWwgPj0gMCk7CisgICAgcGtnTGV2ZWwgPSBkZXB0aCAtIHBrZ0xldmVsIC0gMTsKKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUgbm90CisgICAgLy8gY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2FmZmluaXR5X2dldF9tYXAoKS9fX2ttcF9hZmZpbml0eV9nZXRfbWFwKCksCisgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlIHRoZSBkZWZhdWx0cyB0aGF0IHdlIGNhbGN1bGF0ZWQKKyAgICAvLyBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nIHRvIGVhY2ggcHJvYy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIF9fa21wX25jb3JlcyA9IF9fa21wX3hwcm9jIC8gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgICAvLyBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYW5kIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKSwKKyAgICAvLyBldmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lLgorICAgIC8vCisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZE1hc2s7CisgICAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBBbGxvY2F0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBBZGRyVW5zUGFpciAqcmV0dmFsID0gKEFkZHJVbnNQYWlyICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGF2YWlsYWJsZSBjb250ZXh0cywgYmluZGluZyB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAvLyB0byBpdCwgYW5kIG9idGFpbmluZyB0aGUgcGVydGluZW50IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjcHVpZCBpbnN0ci4KKyAgICAvLworICAgIHVuc2lnbmVkIGludCBwcm9jOworICAgIGludCBuQXBpY3MgPSAwOworICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBLTVBfQ1BVX1NFVFNJWkU7ICsrcHJvYykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKHByb2MpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4dHJhY2ggdGhlIGxhYmVscyBmb3IgZWFjaCBsZXZlbCBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAKKyAgICAgICAgLy8gZnJvbSB0aGUgQXBpYyBJRC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgaW50IHByZXZfc2hpZnQgPSAwOworCisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoMTEsIGxldmVsLCAmYnVmKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFwaWNJZCA9IGJ1Zi5lZHg7CisgICAgICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IGFwaWNJZCA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2hpZnQgPSBidWYuZWF4ICYgMHgxZjsKKyAgICAgICAgICAgIGludCBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IChhcGljSWQgJiBtYXNrKSA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgcHJldl9zaGlmdCA9IHNoaWZ0OworICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbCAhPSBkZXB0aCkgeworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR2YWxbbkFwaWNzXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHByb2MpOworICAgICAgICBuQXBpY3MrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdlJ3ZlIGNvbGxlY3RlZCBhbGwgdGhlIGluZm8gd2UgbmVlZC4KKyAgICAvLyBSZXN0b3JlIHRoZSBvbGQgYWZmaW5pdHkgbWFzayBmb3IgdGhpcyB0aHJlYWQuCisgICAgLy8KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBfX2ttcF9odF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gYW4gQWRkcmVzcyBvYmplY3Qgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgcGFja2FnZSBsZXZlbC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgICAgICByZXR2YWxbMF0uZmlyc3QgPSBhZGRyOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQocmV0dmFsLCBuQXBpY3MsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgcmFkaXggYXQgZWFjaCBvZiB0aGUgbGV2ZWxzLgorICAgIC8vCisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgdG90YWxzW2xldmVsXSA9IDE7CisgICAgICAgIG1heEN0W2xldmVsXSA9IDE7CisgICAgICAgIGNvdW50c1tsZXZlbF0gPSAxOworICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlICJsZXZlbCIgcnVucyBmcm9tIHRoZSBmaW5lc3QKKyAgICAvLyBsZXZlbCB0byB0aGUgY29hcnNlc3QsIGkuZS4gd2UgaXRlcmF0ZSBmb3J3YXJkIHRocm91Z2gKKyAgICAvLyAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gLSBpbiB0aGUgcHJldmlvdXMgbG9vcHMsIHdlIGl0ZXJhdGVkCisgICAgLy8gYmFja3dhcmRzLgorICAgIC8vCisgICAgZm9yIChwcm9jID0gMTsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9IGxhc3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gbGV2ZWwgKyAxOyBqIDwgZGVwdGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbal0rKzsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgYmVsb3cgY2F1c2VzIHByaW50aW5nIGluY29ycmVjdCB0b3BvbG9neSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBtYXggdmFsdWUgZm9yIHNvbWUgbGV2ZWwgKG1heEN0W2xldmVsXSkgaXMgZW5jb3VudGVyZWQgZWFybGllciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgbGVzcyB2YWx1ZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGxldCBwa2cwIGhhcyA0IGNvcmVzIGFuZCBwa2cxIGhhcyAyIGNvcmVzLiBUaGVuIG1heEN0WzFdID09IDIKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmVhcyBpdCBtdXN0IGJlIDQuCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8hISEgQ2hlY2sgaWYgaXQgY2FuIGJlIGNvbW1lbnRlZCBzYWZlbHkKKyAgICAgICAgICAgICAgICAgICAgLy9tYXhDdFtqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3Rbal0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgY291bnRzW2xldmVsXSsrOworICAgICAgICAgICAgICAgIGlmIChjb3VudHNbbGV2ZWxdID4gbWF4Q3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgICAgIG1heEN0W2xldmVsXSA9IGNvdW50c1tsZXZlbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBkZXB0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX3gyQXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZExldmVsXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgfQorICAgIF9fa21wX2h0X2VuYWJsZWQgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlID4gMSk7CisKKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnTGV2ZWxdOworCisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlTGV2ZWxdOworICAgICAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzOworICAgICAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSBtYXhDdFswXTsKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbbGV2ZWxdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbbGV2ZWwgLSAxXSk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbMF0pOworICAgICAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgICAvLyAoZXhjZXB0IGZvciB0aGUgcGFja2FnZSBsZXZlbCkuCisgICAgLy8KKyAgICBpbnQgbmV3X2RlcHRoID0gMDsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXB0aCsrOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgICAgLy8gYW5kIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGl0LgorICAgIC8vCisgICAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aCkgeworICAgICAgICBBZGRyVW5zUGFpciAqbmV3X3JldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgQWRkcmVzcyBhZGRyKG5ld19kZXB0aCk7CisgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdID0gQWRkclVuc1BhaXIoYWRkciwgcmV0dmFsW3Byb2NdLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld19sZXZlbCA9IDA7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gdGhyZWFkTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbCA9IC0xOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRocmVhZExldmVsID49IDApICYmIChsZXZlbCA8IHRocmVhZExldmVsKSkgeworICAgICAgICAgICAgICAgICAgIHRocmVhZExldmVsLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgY29yZUxldmVsID0gLTE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmICgoY29yZUxldmVsID49IDApICYmIChsZXZlbCA8IGNvcmVMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICBjb3JlTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgICAgcGtnTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tuZXdfbGV2ZWxdCisgICAgICAgICAgICAgICAgICA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2xldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIHJldHZhbCA9IG5ld19yZXR2YWw7CisgICAgICAgIGRlcHRoID0gbmV3X2RlcHRoOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgcmV0dXJuIGRlcHRoOworfQorCisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisKKyNkZWZpbmUgb3NJZEluZGV4ICAgICAgIDAKKyNkZWZpbmUgdGhyZWFkSWRJbmRleCAgIDEKKyNkZWZpbmUgY29yZUlkSW5kZXggICAgIDIKKyNkZWZpbmUgcGtnSWRJbmRleCAgICAgIDMKKyNkZWZpbmUgbm9kZUlkSW5kZXggICAgIDQKKwordHlwZWRlZiB1bnNpZ25lZCAqUHJvY0NwdUluZm87CitzdGF0aWMgdW5zaWduZWQgbWF4SW5kZXggPSBwa2dJZEluZGV4OworCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19vc19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IHVuc2lnbmVkICphYSA9IChjb25zdCB1bnNpZ25lZCAqKWE7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKGNvbnN0IHVuc2lnbmVkICopYjsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA8IGJiW29zSWRJbmRleF0pIHJldHVybiAtMTsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA+IGJiW29zSWRJbmRleF0pIHJldHVybiAxOworICAgIHJldHVybiAwOworfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fcGh5c19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgY29uc3QgdW5zaWduZWQgKmFhID0gKigoY29uc3QgdW5zaWduZWQgKiopYSk7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKigoY29uc3QgdW5zaWduZWQgKiopYik7CisgICAgZm9yIChpID0gbWF4SW5kZXg7IDsgaS0tKSB7CisgICAgICAgIGlmIChhYVtpXSA8IGJiW2ldKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYVtpXSA+IGJiW2ldKSByZXR1cm4gMTsKKyAgICAgICAgaWYgKGkgPT0gb3NJZEluZGV4KSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIFBhcnNlIC9wcm9jL2NwdWluZm8gKG9yIGFuIGFsdGVybmF0ZSBmaWxlIGluIHRoZSBzYW1lIGZvcm1hdCkgdG8gb2J0YWluIHRoZQorLy8gYWZmaW5pdHkgbWFwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsIGludCAqbGluZSwKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkLCBGSUxFICpmKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gU2NhbiBvZiB0aGUgZmlsZSwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgInByb2Nlc3NvciIgKG9zSWQpIGZpZWxkcywKKyAgICAvLyBhbmQgZmluZCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiA8bj4gZm9yIGEgbm9kZV88bj4gZmllbGQuCisgICAgLy8KKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIHVuc2lnbmVkIG51bV9yZWNvcmRzID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIGVycm9ycyBwcmVzdW1hYmx5IGJlY2F1c2Ugb2YgRU9GCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIG51bV9yZWNvcmRzKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FIC0gdGhpcyB3aWxsIG1hdGNoICJub2RlXzxuPiA8Z2FyYmFnZT4iCisgICAgICAgIC8vCisgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICBpZiAoc3NjYW5mKGJ1ZiwgIm5vZGVfJWQgaWQiLCAmbGV2ZWwpID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub2RlSWRJbmRleCArIGxldmVsID49IG1heEluZGV4KSB7CisgICAgICAgICAgICAgICAgbWF4SW5kZXggPSBub2RlSWRJbmRleCArIGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENoZWNrIGZvciBlbXB0eSBmaWxlIC8gbm8gdmFsaWQgcHJvY2Vzc29yIHJlY29yZHMsIG9yIHRvbyBtYW55LgorICAgIC8vIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBjYW4ndCBleGNlZWQgdGhlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIHRoZQorICAgIC8vIGFmZmluaXR5IG1hc2suCisgICAgLy8KKyAgICBpZiAobnVtX3JlY29yZHMgPT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9Qcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobnVtX3JlY29yZHMgPiAodW5zaWduZWQpX19rbXBfeHByb2MpIHsKKyAgICAgICAgKmxpbmUgPSAwOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlQcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBmaWxlIHBvaW50ZXIgYmFjayB0byB0aGUgYmVnZ2lubmluZywgc28gdGhhdCB3ZSBjYW4gc2NhbiB0aGUKKyAgICAvLyBmaWxlIGFnYWluLCB0aGlzIHRpbWUgcGVyZm9ybWluZyBhIGZ1bGwgcGFyc2Ugb2YgdGhlIGRhdGEuCisgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3Igb2YgUHJvY0NwdUluZm8gb2JqZWN0LCB3aGVyZSB3ZSB3aWxsIHBsYWNlIHRoZSBkYXRhLgorICAgIC8vIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IGF0IHRoZSBlbmQgYWxsb3dzIHVzIHRvIHJlbW92ZSBhIGxvdCBvZiBleHRyYQorICAgIC8vIGNoZWNrcyBmb3IgdGVybWluYXRpb24gY29uZGl0aW9ucy4KKyAgICAvLworICAgIGlmIChmc2VlayhmLCAwLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfQ2FudFJld2luZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBhcnJheSBvZiByZWNvcmRzIHRvIHN0b3JlIHRoZSBwcm9jIGluZm8gaW4uICBUaGUgZHVtbXkKKyAgICAvLyBlbGVtZW50IGF0IHRoZSBlbmQgbWFrZXMgdGhlIGxvZ2ljIGluIGZpbGxpbmcgdGhlbSBvdXQgZWFzaWVyIHRvIGNvZGUuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqKnRocmVhZEluZm8gPSAodW5zaWduZWQgKiopX19rbXBfYWxsb2NhdGUoKG51bV9yZWNvcmRzICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkICopKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICB0aHJlYWRJbmZvW2ldID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKworI2RlZmluZSBDTEVBTlVQX1RIUkVBRF9JTkZPIFwKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworCisgICAgLy8KKyAgICAvLyBBIHZhbHVlIG9mIFVJTlRfTUFYIG1lYW5zIHRoYXQgd2UgZGlkbid0IGZpbmQgdGhlIGZpZWxkCisgICAgLy8KKyAgICB1bnNpZ25lZCBfX2luZGV4OworCisjZGVmaW5lIElOSVRfUFJPQ19JTkZPKHApIFwKKyAgICBmb3IgKF9faW5kZXggPSAwOyBfX2luZGV4IDw9IG1heEluZGV4OyBfX2luZGV4KyspIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHApW19faW5kZXhdID0gVUlOVF9NQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsKKyAgICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tpXSk7CisgICAgfQorCisgICAgdW5zaWduZWQgbnVtX2F2YWlsID0gMDsKKyAgICAqbGluZSA9IDA7CisgICAgd2hpbGUgKCEgZmVvZihmKSkgeworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgYW4gaW5uZXIgc2NvcGluZyBsZXZlbCwgc28gdGhhdCBhbGwgdGhlIGdvdG8gdGFyZ2V0cyBhdCB0aGUKKyAgICAgICAgLy8gZW5kIG9mIHRoZSBsb29wIGFwcGVhciBpbiBhbiBvdXRlciBzY29waW5nIGxldmVsLiAgVGhpcyBhdm9pZHMKKyAgICAgICAgLy8gd2FybmluZ3MgYWJvdXQganVtcGluZyBwYXN0IGFuIGluaXRpYWxpemF0aW9uIHRvIGEgdGFyZ2V0IGluIHRoZQorICAgICAgICAvLyBzYW1lIGJsb2NrLgorICAgICAgICAvLworICAgICAgICB7CisgICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICAgICAgICBib29sIGxvbmdfbGluZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIHZhbGlkIGRhdGEgaW4gdGhyZWFkSW5mb1tudW1fYXZhaWxdLCB0aGVuIGZha2UKKyAgICAgICAgICAgICAgICAvLyBhIGJsYW5rIGxpbmUgaW4gZW5zdXJlIHRoYXQgdGhlIGxhc3QgYWRkcmVzcyBnZXRzIHBhcnNlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1heEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtpXSAhPSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghIHZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICghYnVmW3NpemVvZihidWYpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBTZXQgYSBmbGFnIGFuZCBkb24ndAorICAgICAgICAgICAgICAgIC8vIGVtaXQgYW4gZXJyb3IgaWYgd2Ugd2VyZSBnb2luZyB0byBpZ25vcmUgdGhlIGxpbmUsIGFueXdheS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGxvbmdfbGluZSA9IHRydWU7CisKKyNkZWZpbmUgQ0hFQ0tfTElORSBcCisgICAgaWYgKGxvbmdfbGluZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTG9uZ0xpbmVDcHVpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpsaW5lKSsrOworCisgICAgICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMSkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKHNzY2FuZihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9IHZhbDsKKyNpZiBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgICAgICBjaGFyIHBhdGhbMjU2XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9waHlzaWNhbF9wYWNrYWdlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0pOworCisgICAgICAgICAgICAgICAgc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvY29yZV9pZCIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFkX2Zyb21fZmlsZShwYXRoLCAiJXUiLCAmdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisjZWxzZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzMltdID0gInBoeXNpY2FsIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczIsIHNpemVvZihzMikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMikgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKHNzY2FuZihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzM1tdID0gImNvcmUgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMywgc2l6ZW9mKHMzKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMzKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgczRbXSA9ICJ0aHJlYWQgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzNCwgc2l6ZW9mKHM0KSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHM0KSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3RocmVhZElkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChzc2NhbmYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobm9kZUlkSW5kZXggKyBsZXZlbCA8PSBtYXhJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW25vZGVJZEluZGV4ICsgbGV2ZWxdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgZGlkbid0IHJlY29nbml6ZSB0aGUgbGVhZGluZyB0b2tlbiBvbiB0aGUgbGluZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBsb3RzIG9mIGxlYWRpbmcgdG9rZW5zIHRoYXQgd2UgZG9uJ3QgcmVjb2duaXplIC0KKyAgICAgICAgICAgIC8vIGlmIHRoZSBsaW5lIGlzbid0IGVtcHR5LCBnbyBvbiB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoKmJ1ZiAhPSAwKSAmJiAoKmJ1ZiAhPSAnXG4nKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlciwgcmVhZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgLy8gdW50aWwgd2UgZmluZCBhIG5ld2xpbmUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAobG9uZ19saW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgoY2ggPSBmZ2V0YyhmKSkgIT0gRU9GKSAmJiAoY2ggIT0gJ1xuJykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgbmV3bGluZSBoYXMgc2lnbmFsbGVkIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3NvciByZWNvcmQuCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZW4ndCB0b28gbWFueSBwcm9jcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKG51bV9hdmFpbCA9PSBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ub29NYW55RW50cmllczsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyBmaWVsZHMuICBUaGUgb3NJZCBmaWVsZCBtdXN0IGJlIHRoZXJlLCBhbmQgd2UKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSByZXF1aXJlIHRoYXQgdGhlIHBoeXNpY2FsIGlkIGZpZWxkIGlzIHNwZWNpZmllZCwgYWxzby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1Byb2NGaWVsZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUGh5c2ljYWxJREZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgdGhpcyBwcm9jJ3MgaW5mby4KKyAgICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgY291bnRlciwgYW5kIHByZXBhcmUgZm9yIHRoZSBuZXh0IHByb2MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbnVtX2F2YWlsKys7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5vX3ZhbDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nVmFsQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGR1cF9maWVsZDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9EdXBsaWNhdGVGaWVsZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmxpbmUgPSAwOworCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIHVuc2lnbmVkIHRlYW1TaXplID0gMDsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAvLyBjaGVjayBmb3IgbnVtX3JlY29yZHMgPT0gX19rbXBfeHByb2MgPz8/CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPiAwKTsKKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgaWYgKG51bV9hdmFpbCA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAgICAgICAgIGZ1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiMSIpOworICAgICAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4IC0gMTsgaW5kZXggPiBwa2dJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgMSwgMSwgMSk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSk7CisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSB0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdOworICAgICAgICAoKmFkZHJlc3Myb3MpWzBdID0gQWRkclVuc1BhaXIoYWRkciwgdGhyZWFkSW5mb1swXVtvc0lkSW5kZXhdKTsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBudW1fYXZhaWwsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICptYXhDdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICp0b3RhbHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdElkID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisKKyAgICBib29sIGFzc2lnbl90aHJlYWRfaWRzID0gZmFsc2U7CisgICAgdW5zaWduZWQgdGhyZWFkSWRDdDsKKyAgICB1bnNpZ25lZCBpbmRleDsKKworICAgIHJlc3RhcnRfcmFkaXhfY2hlY2s6CisgICAgdGhyZWFkSWRDdCA9IDA7CisKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgYXJyYXlzIHdpdGggZGF0YSBmcm9tIHRocmVhZEluZm9bMF0uCisgICAgLy8KKyAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMpIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGNvdW50c1tpbmRleF0gPSAxOworICAgICAgICBtYXhDdFtpbmRleF0gPSAxOworICAgICAgICB0b3RhbHNbaW5kZXhdID0gMTsKKyAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9bMF1baW5kZXhdOzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBPUyBwcm9jcy4KKyAgICAvLworICAgIGZvciAoaSA9IDE7IGkgPCBudW1fYXZhaWw7IGkrKykgeworICAgICAgICAvLworICAgICAgICAvLyBGaW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGluZGV4IHdob3NlIGlkIGRpZmZlcnMKKyAgICAgICAgLy8gZnJvbSB0aGUgaWQgZm9yIHRoZSBwcmV2aW91cyBPUyBwcm9jLgorICAgICAgICAvLworICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXg7IGluZGV4ID49IHRocmVhZElkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcyAmJiAoaW5kZXggPT0gdGhyZWFkSWRJbmRleCkpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEF1dG8tYXNzaWduIHRoZSB0aHJlYWQgaWQgZmllbGQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBcGFycmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZQorICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG5vdCBvdGhlcnMuICBTdGFydCB0aGUgdGhyZWFkIGlkIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAvLyBvZmYgYXQgdGhlIG5leHQgaGlnaGVyIHRocmVhZCBpZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1baW5kZXhdICE9IGxhc3RJZFtpbmRleF0pIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIGFsbCBpbmRpY2VzIHdoaWNoIGFyZSBsZXNzIHNpZ25pZmljYW50LAorICAgICAgICAgICAgICAgIC8vIGFuZCByZXNldCB0aGUgY291bnRzIHRvIDEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBdCBhbGwgbGV2ZWxzIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5kZXgsIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRvdGFscyBhbmQgcmVjb3JkIHRoZSBsYXN0IGlkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgyOworICAgICAgICAgICAgICAgIGZvciAoaW5kZXgyID0gdGhyZWFkSWRJbmRleDsgaW5kZXgyIDwgaW5kZXg7IGluZGV4MisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsc1tpbmRleDJdKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHNbaW5kZXgyXSA+IG1heEN0W2luZGV4Ml0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEN0W2luZGV4Ml0gPSBjb3VudHNbaW5kZXgyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3VudHNbaW5kZXgyXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3RJZFtpbmRleDJdID0gdGhyZWFkSW5mb1tpXVtpbmRleDJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudHNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgdG90YWxzW2luZGV4XSsrOworICAgICAgICAgICAgICAgIGxhc3RJZFtpbmRleF0gPSB0aHJlYWRJbmZvW2ldW2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcyAmJiAoaW5kZXggPiB0aHJlYWRJZEluZGV4KSkgeworCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB0ZWFtIHNpemUgaXMgdGhlIHRvdGFsICN0aHJlYWRzIGluIHRoZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIC8vIG1pbnVzIDEgdGhyZWFkIGZvciBldmVyeSBjb3JlIHRoYXQgaGFzIDMgb3IgbW9yZSB0aHJlYWRzLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB0ZWFtU2l6ZSArPSAoIHRocmVhZElkQ3QgPD0gMiApID8gKCB0aHJlYWRJZEN0ICkgOiAoIHRocmVhZElkQ3QgLSAxICk7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHRocmVhZCBjb3VudGVyLCBhcyB3ZSBhcmUgb24gYSBuZXcgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1hc3NpZ24gdGhlIHRocmVhZCBpZCBmaWVsZCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEFwYXJyZW50bHkgdGhlIHRocmVhZCBpZCBmaWVsZCB3YXMgc3BlY2lmaWVkIGZvciBzb21lCisgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG5vdCBvdGhlcnMuICBTdGFydCB0aGUgdGhyZWFkIGlkIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIGF0IHRoZSBuZXh0IGhpZ2hlciB0aHJlYWQgaWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA8IHRocmVhZElkSW5kZXgpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aHJlYWQgaWRzIHdlcmUgc3BlY2lmaWVkLCBpdCBpcyBhbiBlcnJvciBpZiB0aGV5IGFyZSBub3QKKyAgICAgICAgICAgIC8vIHVuaXF1ZS4gIEFsc28sIGNoZWNrIHRoYXQgd2Ugd2F2ZW4ndCBhbHJlYWR5IHJlc3RhcnRlZCB0aGUKKyAgICAgICAgICAgIC8vIGxvb3AgKHRvIGJlIHNhZmUgLSBzaG91bGRuJ3QgbmVlZCB0bykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICE9IFVJTlRfTUFYKQorICAgICAgICAgICAgICB8fCBhc3NpZ25fdGhyZWFkX2lkcykgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9QaHlzaWNhbElEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGlkcyB3ZXJlIG5vdCBzcGVjaWZpZWQgYW5kIHdlIHNlZSBlbnRyaWVzCisgICAgICAgICAgICAvLyBlbnRyaWVzIHRoYXQgYXJlIGR1cGxpY2F0ZXMsIHN0YXJ0IHRoZSBsb29wIG92ZXIgYW5kCisgICAgICAgICAgICAvLyBhc3NpZ24gdGhlIHRocmVhZCBpZHMgbWFudWFsbHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYXNzaWduX3RocmVhZF9pZHMgPSB0cnVlOworICAgICAgICAgICAgZ290byByZXN0YXJ0X3JhZGl4X2NoZWNrOworICAgICAgICB9CisgICAgfQorCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgdGVhbSBzaXplIGlzIHRoZSB0b3RhbCAjdGhyZWFkcyBpbiB0aGUgbWFjaGluZQorICAgIC8vIG1pbnVzIDEgdGhyZWFkIGZvciBldmVyeSBjb3JlIHRoYXQgaGFzIDMgb3IgbW9yZSB0aHJlYWRzLgorICAgIC8vCisgICAgdGVhbVNpemUgKz0gKCB0aHJlYWRJZEN0IDw9IDIgKSA/ICggdGhyZWFkSWRDdCApIDogKCB0aHJlYWRJZEN0IC0gMSApOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBpZiAoY291bnRzW2luZGV4XSA+IG1heEN0W2luZGV4XSkgeworICAgICAgICAgICAgbWF4Q3RbaW5kZXhdID0gY291bnRzW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZElkSW5kZXhdOworICAgIG5Db3Jlc1BlclBrZyA9IG1heEN0W2NvcmVJZEluZGV4XTsKKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnSWRJbmRleF07CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgICAgLy8KKyAgICB1bnNpZ25lZCBwcm9kID0gdG90YWxzW21heEluZGV4XTsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPCBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbaW5kZXhdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbdGhyZWFkSWRJbmRleF0pOworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX2h0X2VuYWJsZWQsICYgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgX19rbXBfaHRfZW5hYmxlZCA9IChtYXhDdFt0aHJlYWRJZEluZGV4XSA+IDEpOyAvLyB0aHJlYWRzIHBlciBjb3JlID4gMQorICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlSWRJbmRleF07CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIGZ1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIHRvdGFsc1ttYXhJbmRleF0pOworICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+PSBwa2dJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2luZGV4XSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgIG1heEN0W2NvcmVJZEluZGV4XSwKKyAgICAgICAgICBtYXhDdFt0aHJlYWRJZEluZGV4XSwgX19rbXBfbmNvcmVzKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIC8vCisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRlYW0gc2l6ZS4KKyAgICAvLworICAgIGlmICgoX19rbXBfZGZsdF90ZWFtX250aCA9PSAwKSAmJiAodGVhbVNpemUgPiAwKSkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gdGVhbVNpemU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcDogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCkpOworICAgIH0KKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGV2ZWxzIHdoaWNoIGhhdmUgbW9yZSBub2RlcyBhdCB0aGF0IGxldmVsIHRoYW4KKyAgICAvLyBhdCB0aGUgcGFyZW50J3MgbGV2ZWwgKHdpdGggdGhlcmUgYmVpbmcgYW4gaW1wbGljaXQgcm9vdCBub2RlIG9mCisgICAgLy8gdGhlIHRvcCBsZXZlbCkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2F5aW5nIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QKKyAgICAvLyBvbmUgbm9kZSBhdCB0aGlzIGxldmVsIHdoaWNoIGhhcyBhIHNpYmxpbmcuICBUaGVzZSBsZXZlbHMgYXJlIGluIHRoZQorICAgIC8vIG1hcCwgYW5kIHRoZSBwYWNrYWdlIGxldmVsIGlzIGFsd2F5cyBpbiB0aGUgbWFwLgorICAgIC8vCisgICAgYm9vbCAqaW5NYXAgPSAoYm9vbCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpICogc2l6ZW9mKGJvb2wpKTsKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIEtNUF9BU1NFUlQodG90YWxzW2luZGV4XSA+PSB0b3RhbHNbaW5kZXggKyAxXSk7CisgICAgICAgIGluTWFwW2luZGV4XSA9ICh0b3RhbHNbaW5kZXhdID4gdG90YWxzW2luZGV4ICsgMV0pOworICAgIH0KKyAgICBpbk1hcFttYXhJbmRleF0gPSAodG90YWxzW21heEluZGV4XSA+IDEpOworICAgIGluTWFwW3BrZ0lkSW5kZXhdID0gdHJ1ZTsKKworICAgIGludCBkZXB0aCA9IDA7CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGlmIChpbk1hcFtpbmRleF0pIHsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogbnVtX2F2YWlsKTsKKyAgICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHRocmVhZExldmVsID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F2YWlsOyArK2kpIHsKKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgdW5zaWduZWQgb3MgPSB0aHJlYWRJbmZvW2ldW29zSWRJbmRleF07CisgICAgICAgIGludCBzcmNfaW5kZXg7CisgICAgICAgIGludCBkc3RfaW5kZXggPSAwOworCisgICAgICAgIGZvciAoc3JjX2luZGV4ID0gbWF4SW5kZXg7IHNyY19pbmRleCA+PSB0aHJlYWRJZEluZGV4OyBzcmNfaW5kZXgtLSkgeworICAgICAgICAgICAgaWYgKCEgaW5NYXBbc3JjX2luZGV4XSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkci5sYWJlbHNbZHN0X2luZGV4XSA9IHRocmVhZEluZm9baV1bc3JjX2luZGV4XTsKKyAgICAgICAgICAgIGlmIChzcmNfaW5kZXggPT0gcGtnSWRJbmRleCkgeworICAgICAgICAgICAgICAgIHBrZ0xldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2luZGV4ID09IGNvcmVJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgY29yZUxldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2luZGV4ID09IHRocmVhZElkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdF9pbmRleCsrOworICAgICAgICB9CisgICAgICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgdW5zaWduZWQgc3JjX2luZGV4OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIGZvciAoc3JjX2luZGV4ID0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4IDw9IG1heEluZGV4OyBzcmNfaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCEgaW5NYXBbc3JjX2luZGV4XSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChzcmNfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIHRocmVhZElkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY29yZUlkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHBrZ0lkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgbnVtX2F2YWlsLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgICAgfQorCisgICAgX19rbXBfZnJlZShpbk1hcCk7CisgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgdGFibGUgb2YgYWZmaW5pdHkgbWFza3MsIGluZGV4ZWQgYnkgT1MgdGhyZWFkIElELgorLy8gVGhpcyByb3V0aW5lIGhhbmRsZXMgT1InaW5nIHRvZ2V0aGVyIGFsbCB0aGUgYWZmaW5pdHkgbWFza3Mgb2YgdGhyZWFkcworLy8gdGhhdCBhcmUgc3VmZmljaWVudGx5IGNsb3NlLCBpZiBncmFudWxhcml0eSA+IGZpbmUuCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKgorX19rbXBfY3JlYXRlX21hc2tzKHVuc2lnbmVkICptYXhJbmRleCwgdW5zaWduZWQgKm51bVVuaXF1ZSwKKyAgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIHVuc2lnbmVkIG51bUFkZHJzKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZm9ybSBhIHRhYmxlIG9mIGFmZmluaXR5IG1hc2tzIGluIG9yZGVyIG9mIE9TIHRocmVhZCBpZC4KKyAgICAvLworICAgIHVuc2lnbmVkIGRlcHRoOworICAgIHVuc2lnbmVkIG1heE9zSWQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIEtNUF9BU1NFUlQobnVtQWRkcnMgPiAwKTsKKyAgICBkZXB0aCA9IGFkZHJlc3Myb3NbMF0uZmlyc3QuZGVwdGg7CisKKyAgICBtYXhPc0lkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQWRkcnM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tpXS5zZWNvbmQ7CisgICAgICAgIGlmIChvc0lkID4gbWF4T3NJZCkgeworICAgICAgICAgICAgbWF4T3NJZCA9IG9zSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIChtYXhPc0lkICsgMSkgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byBwaHlzaWNhbCBvcmRlci4gIERvaW5nIHNvCisgICAgLy8gd2lsbCBwdXQgYWxsIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS9wYWNrYWdlL25vZGUgaW4gY29uc2VjdXRpdmUKKyAgICAvLyBsb2NhdGlvbnMuCisgICAgLy8KKyAgICBxc29ydChhZGRyZXNzMm9zLCBudW1BZGRycywgc2l6ZW9mKCphZGRyZXNzMm9zKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID49IDApOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlICYmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+IDApKSB7CisgICAgICAgIEtNUF9JTkZPUk0oVGhyZWFkc01pZ3JhdGUsICJLTVBfQUZGSU5JVFkiLCAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gKGludClkZXB0aCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRocmVhZHNNYXlNaWdyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHRhYmxlLCBmb3JtaW5nIHRoZSBtYXNrcyBmb3IgYWxsIHRocmVhZHMgb24gZWFjaAorICAgIC8vIGNvcmUuICBUaHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUgd2lsbCBoYXZlIGlkZW50aWNhbCAiQWRkcmVzcyIKKyAgICAvLyBvYmplY3RzLCBub3QgY29uc2lkZXJpbmcgdGhlIGxhc3QgbGV2ZWwsIHdoaWNoIG11c3QgYmUgdGhlIHRocmVhZAorICAgIC8vIGlkLiAgQWxsIHRocmVhZHMgb24gYSBjb3JlIHdpbGwgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisgICAgLy8KKyAgICB1bnNpZ25lZCB1bmlxdWUgPSAwOworICAgIHVuc2lnbmVkIGogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgMXN0IHRocmVhZCBvbiBjb3JlCisgICAgdW5zaWduZWQgbGVhZGVyID0gMDsKKyAgICBBZGRyZXNzICpsZWFkZXJBZGRyID0gJihhZGRyZXNzMm9zWzBdLmZpcnN0KTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW0KKyAgICAgID0gKGttcF9hZmZpbl9tYXNrX3QgKilhbGxvY2EoX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICBLTVBfQ1BVX1NFVChhZGRyZXNzMm9zWzBdLnNlY29uZCwgc3VtKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtQWRkcnM7IGkrKykgeworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBpcyBzdWZmaWNpZW50bHkgY2xvc2UgdG8gdGhlIGxlYWRlciAod2l0aGluIHRoZQorICAgICAgICAvLyBncmFudWxhcml0eSBzZXR0aW5nKSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhpcyBvcyB0aHJlYWQgaW4gdGhlCisgICAgICAgIC8vIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgZ3JvdXAsIGFuZCBnbyBvbiB0byB0aGUgbmV4dCB0aHJlYWQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChsZWFkZXJBZGRyLT5pc0Nsb3NlKGFkZHJlc3Myb3NbaV0uZmlyc3QsCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMpKSB7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVChhZGRyZXNzMm9zW2ldLnNlY29uZCwgc3VtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiB0aGlzIGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncworICAgICAgICAvLyBlbnRyeSBpbiB0aGUgb3NJZDJNYXNrIHRhYmxlLiAgTWFyayB0aGUgZmlyc3QgYWRkcmVzcyBhcyBhCisgICAgICAgIC8vIGxlYWRlci4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yICg7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3NJZCA8PSBtYXhPc0lkKTsKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgb3NJZCk7CisgICAgICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgICAgIGFkZHJlc3Myb3Nbal0uZmlyc3QubGVhZGVyID0gKGogPT0gbGVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICB1bmlxdWUrKzsKKworICAgICAgICAvLworICAgICAgICAvLyBTdGFydCBhIG5ldyBtYXNrLgorICAgICAgICAvLworICAgICAgICBsZWFkZXIgPSBpOworICAgICAgICBsZWFkZXJBZGRyID0gJihhZGRyZXNzMm9zW2ldLmZpcnN0KTsKKyAgICAgICAgS01QX0NQVV9aRVJPKHN1bSk7CisgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgIH0KKworICAgIC8vCisgICAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiBsYXN0IGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncworICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuCisgICAgLy8KKyAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tqXS5zZWNvbmQ7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3NJZCA8PSBtYXhPc0lkKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgS01QX0NQVV9DT1BZKG1hc2ssIHN1bSk7CisgICAgICAgIGFkZHJlc3Myb3Nbal0uZmlyc3QubGVhZGVyID0gKGogPT0gbGVhZGVyKTsKKyAgICB9CisgICAgdW5pcXVlKys7CisKKyAgICAqbWF4SW5kZXggPSBtYXhPc0lkOworICAgICpudW1VbmlxdWUgPSB1bmlxdWU7CisgICAgcmV0dXJuIG9zSWQyTWFzazsKK30KKworCisvLworLy8gU3R1ZmYgZm9yIHRoZSBhZmZpbml0eSBwcm9jbGlzdCBwYXJzZXJzLiAgSXQncyBlYXNpZXIgdG8gZGVjbGFyZSB0aGVzZSB2YXJzCisvLyBhcyBmaWxlLXN0YXRpYyB0aGFuIHRvIHRyeSBhbmQgcGFzcyB0aGVtIHRocm91Z2ggdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YKKy8vIHRoZSByZWN1cnNpdmUtZGVzY2VudCBPTVBfUExBQ0VTIHBhcnNlci4KKy8vCitzdGF0aWMga21wX2FmZmluX21hc2tfdCAqbmV3TWFza3M7CitzdGF0aWMgaW50IG51bU5ld01hc2tzOworc3RhdGljIGludCBuZXh0TmV3TWFzazsKKworI2RlZmluZSBBRERfTUFTSyhfbWFzaykgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobmV4dE5ld01hc2sgPj0gbnVtTmV3TWFza3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbnVtTmV3TWFza3MgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3TWFza3MgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9SRUFMTE9DKG5ld01hc2tzLCBcCisgICAgICAgICAgICAgIG51bU5ld01hc2tzICogX19rbXBfYWZmaW5fbWFza19zaXplKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DUFVfQ09QWShLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBuZXh0TmV3TWFzayksIChfbWFzaykpOyAgICBcCisgICAgICAgIG5leHROZXdNYXNrKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEFERF9NQVNLX09TSUQoX29zSWQsX29zSWQyTWFzayxfbWF4T3NJZCkgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKChfb3NJZCkgPiBfbWF4T3NJZCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoKF9vc0lkKSwgS01QX0NQVV9JTkRFWChfb3NJZDJNYXNrLCAoX29zSWQpKSkpKSB7XAorICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICAgXAorICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIF9vc0lkKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUREX01BU0soS01QX0NQVV9JTkRFWChfb3NJZDJNYXNrLCAoX29zSWQpKSk7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisvLworLy8gUmUtcGFyc2UgdGhlIHByb2NsaXN0IChmb3IgdGhlIGV4cGxpY2l0IGFmZmluaXR5IHR5cGUpLCBhbmQgZm9ybSB0aGUgbGlzdAorLy8gb2YgYWZmaW5pdHkgbmV3TWFza3MgaW5kZXhlZCBieSBndGlkLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3Byb2NsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLCBjb25zdCBjaGFyICpwcm9jbGlzdCwKKyAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLCBpbnQgbWF4T3NJZCkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gcHJvY2xpc3Q7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHByb2NsaXN0OworCisgICAgLy8KKyAgICAvLyBXZSB1c2UgbWFsbG9jKCkgZm9yIHRoZSB0ZW1wb3JhcnkgbWFzayB2ZWN0b3IsCisgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHJlYWxsb2MoKSB0byBleHRlbmQgaXQuCisgICAgLy8KKyAgICBudW1OZXdNYXNrcyA9IDI7CisgICAgbmV3TWFza3MgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobnVtTmV3TWFza3MKKyAgICAgICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBuZXh0TmV3TWFzayA9IDA7CisgICAga21wX2FmZmluX21hc2tfdCAqc3VtTWFzayA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIGludCBzZXRTaXplID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpuZXh0ID09ICd7JykgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAneycKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBwcm9jbGlzdCIpOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ29weSB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gKHVuaW9uKSBtYXNrLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgobnVtID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtTWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoc3VtTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgICAgIHNldFNpemUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd9JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMihudW0gPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBtYXNrIGZvciB0aGF0IG9zSWQgdG8gdGhlIHN1bSBtYXNrLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEFERF9NQVNLKHN1bU1hc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0ID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIHJhbmdlLCB0aGVuIGFkZCBhIG1hc2sgdG8gdGhlIGxpc3QgYW5kIGdvIG9uLgorICAgICAgICAvLworICAgICAgICBpZiAoKm5leHQgIT0gJy0nKSB7CisgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSByYW5nZS4gIFNraXAgb3ZlciB0aGUgJy0nIGFuZCByZWFkIGluIHRoZSAybmQgaW50LgorICAgICAgICAvLworICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnLScKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQyKGVuZCA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICc6JykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnOicKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RyaWRlID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIERvIHNvbWUgcmFuZ2UgY2hlY2tzLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUMihzdHJpZGUgIT0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0IDw9IGVuZCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0ID49IGVuZCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigoZW5kIC0gc3RhcnQpIC8gc3RyaWRlIDw9IDY1NTM2LCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEFkZCB0aGUgbWFzayBmb3IgZWFjaCBPUyBwcm9jICMgdG8gdGhlIGxpc3QuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA8PSBlbmQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPj0gZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfQorICAgICAgICBzY2FuID0gbmV4dDsKKyAgICB9CisKKyAgICAqb3V0X251bU1hc2tzID0gbmV4dE5ld01hc2s7CisgICAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAgICAgKm91dF9tYXNrcyA9IE5VTEw7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKG5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqb3V0X21hc2tzCisgICAgICA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUobmV4dE5ld01hc2sgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIG1lbWNweSgqb3V0X21hc2tzLCBuZXdNYXNrcywgbmV4dE5ld01hc2sgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIF9fa21wX2ZyZWUoc3VtTWFzayk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUobmV3TWFza3MpOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZS1wYXJzZSB0aGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QsIGZvcm1pbmcgdGhlIG5ld01hc2tzIGZvciB0aGUgZGlmZmVyZW50CitwbGFjZXMuICBBZ2FpbiwgSGVyZSBpcyB0aGUgZ3JhbW1hcjoKKworcGxhY2VfbGlzdCA6PSBwbGFjZQorcGxhY2VfbGlzdCA6PSBwbGFjZSAsIHBsYWNlX2xpc3QKK3BsYWNlIDo9IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtIDogc2lnbmVkCitwbGFjZSA6PSB7IHN1YnBsYWNlbGlzdCB9CitwbGFjZSA6PSAhIHBsYWNlICAgICAgICAgICAgICAgICAgLy8gKGxvd2VzdCBwcmlvcml0eSkKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UgLCBzdWJwbGFjZV9saXN0CitzdWJwbGFjZSA6PSBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtIDogc2lnbmVkCitzaWduZWQgOj0gbnVtCitzaWduZWQgOj0gKyBzaWduZWQKK3NpZ25lZCA6PSAtIHNpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3QoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlLCBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3NfcGxhY2UoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIF9fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQgLCB0ZW1wTWFzaywKKyAgICAgICAgICBzZXRTaXplKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICd9JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKHNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCwgdGVtcE1hc2ssIHNldFNpemUpOworICAgICAgICBLTVBfQ1BVX0NPTVBMRU1FTlQodGVtcE1hc2spOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICB9CisgICAgZWxzZSBpZiAoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSkgeworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgbnVtID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgfQorICAgICAgICAqc2NhbiA9IG5leHQ7ICAvLyBza2lwIG51bQorICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLCBjb25zdCBjaGFyICpwbGFjZWxpc3QsCisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywgaW50IG1heE9zSWQpCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHBsYWNlbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcGxhY2VsaXN0OworCisgICAgbnVtTmV3TWFza3MgPSAyOworICAgIG5ld01hc2tzID0gKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKG51bU5ld01hc2tzCisgICAgICAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgbmV4dE5ld01hc2sgPSAwOworCisgICAga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgIGludCBzZXRTaXplID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgX19rbXBfcHJvY2Vzc19wbGFjZSgmc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgJnNldFNpemUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcgfHwgKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqc2NhbiA+PSAnMCcpICYmICgqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBpZiAoc2V0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gX19rbXBfYWZmaW5fbWFza19zaXplICogQ0hBUl9CSVQgLSAxOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhIHRlbXAgdmFyIGluIGNhc2UgbWFjcm8gaXMgY2hhbmdlZCB0byBldmFsdWF0ZQorICAgICAgICAgICAgICAgICAgICAvLyBhcmdzIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChqIC0gMSwgdGVtcE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCAtIDE7IGogPj0gc3RyaWRlOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtNUF9DUFVfSVNTRVQoaiAtIHN0cmlkZSwgdGVtcE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgajsKKyAgICAgICAgICAgICAgICBpZiAoc2V0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCkgKyBzdHJpZGU7CisgICAgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtNUF9DUFVfSVNTRVQoaiAtIHN0cmlkZSwgdGVtcE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICg7IGogPCBfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKm91dF9tYXNrcworICAgICAgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKG5leHROZXdNYXNrICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBtZW1jcHkoKm91dF9tYXNrcywgbmV3TWFza3MsIG5leHROZXdNYXNrICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBfX2ttcF9mcmVlKHRlbXBNYXNrKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI3VuZGVmIEFERF9NQVNLCisjdW5kZWYgQUREX01BU0tfT1NJRAorCisKKyMgaWYgS01QX01JQworCitzdGF0aWMgdm9pZAorX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcyhBZGRyVW5zUGFpciAqKnBBZGRyLCBpbnQgZGVwdGgpCit7CisgICAgaWYgKCBfX2ttcF9wbGFjZV9udW1fY29yZXMgPT0gMCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIG5vIGNvcmVzIGxpbWl0aW5nIGFjdGlvbnMgcmVxdWVzdGVkLCBleGl0CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkNvcmVzUGVyUGtnOyAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgfQorICAgIGlmICggIV9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSB8fCBkZXB0aCAhPSAzICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VVbnN1cHBvcnRlZCApOworICAgICAgICByZXR1cm47IC8vIGRvbid0IHN1cHBvcnQgbm9uLXVuaWZvcm0gdG9wb2xvZ3kgb3Igbm90LTMtbGV2ZWwgYXJjaGl0ZWN0dXJlCisgICAgfQorICAgIGlmICggX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICAvLyB1c2UgYWxsIEhXIGNvbnRleHRzCisgICAgfQorICAgIGlmICggX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMgPiBuQ29yZXNQZXJQa2cgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZU1hbnlDb3JlcyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQWRkclVuc1BhaXIgKm5ld0FkZHIgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKEFkZHJVbnNQYWlyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhY2thZ2VzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzICogX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworICAgIGludCBpLCBqLCBrLCBuX29sZCA9IDAsIG5fbmV3ID0gMDsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5QYWNrYWdlczsgKytpICkgeworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5Db3Jlc1BlclBrZzsgKytqICkgeworICAgICAgICAgICAgaWYgKCBqIDwgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgfHwgaiA+PSBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCArIF9fa21wX3BsYWNlX251bV9jb3JlcyApIHsKKyAgICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICAgLy8gc2tpcCBub3QtcmVxdWVzdGVkIGNvcmUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICggayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsrayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBrIDwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBZGRyW25fbmV3XSA9ICgqcEFkZHIpW25fb2xkXTsgICAvLyBjb3B5IHJlcXVlc3RlZCBjb3JlJyBkYXRhIHRvIG5ldyBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbl9uZXcrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuX29sZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBuQ29yZXNQZXJQa2cgPSBfX2ttcF9wbGFjZV9udW1fY29yZXM7ICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBuQ29yZXNQZXJQa2cKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZTsgLy8gY29ycmVjdCBfX2ttcF9uVGhyZWFkc1BlckNvcmUKKyAgICBfX2ttcF9hdmFpbF9wcm9jID0gbl9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBhdmFpbF9wcm9jCisgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzOyAgICAgICAgIC8vIGNvcnJlY3QgbmNvcmVzCisKKyAgICBfX2ttcF9mcmVlKCAqcEFkZHIgKTsKKyAgICAqcEFkZHIgPSBuZXdBZGRyOyAgICAgIC8vIHJlcGxhY2Ugb2xkIHRvcG9sb2d5IHdpdGggbmV3IG9uZQorfQorCisjIGVuZGlmIC8qIEtNUF9NSUMgKi8KKworCitzdGF0aWMgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MgPSBOVUxMOworc3RhdGljIGludCAgICAgICAgICAgKiBwcm9jYXJyID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgIF9fa21wX2FmZl9kZXB0aCA9IDA7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIGlmIChfX2ttcF9hZmZpbml0eV9tYXNrcyAhPSBOVUxMKSB7CisgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgImZ1bGwiIG1hc2sgLSB0aGlzIGRlZmluZXMgYWxsIG9mIHRoZSBwcm9jZXNzb3JzIHRoYXQgd2UKKyAgICAvLyBjb25zaWRlciB0byBiZSBpbiB0aGUgbWFjaGluZSBtb2RlbC4gIElmIHJlc3BlY3QgaXMgc2V0LCB0aGVuIGl0IGlzCisgICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZCdzIGFmZmluaXR5IG1hc2suICBPdGhlcndpc2UsIGl0IGlzIGFsbAorICAgIC8vIHByb2Nlc3NvcnMgdGhhdCB3ZSBrbm93IGFib3V0IG9uIHRoZSBtYWNoaW5lLgorICAgIC8vCisgICAgaWYgKGZ1bGxNYXNrID09IE5VTEwpIHsKKyAgICAgICAgZnVsbE1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgfQorICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoZnVsbE1hc2ssIFRSVUUpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS01QX0NQVV9TRVRTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX2F2YWlsX3Byb2MgPiBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKGZ1bGxNYXNrKTsKKyAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBkZXB0aCA9IC0xOworICAgIGttcF9pMThuX2lkX3QgbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHNldHRpbmcgS01QX0NQVUlORk9fRklMRSA9PgorICAgIC8vIEtNUF9UT1BPTE9HWV9NRVRIT0Q9Y3B1aW5mbworICAgIC8vCisgICAgaWYgKChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgJiYKKyAgICAgIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNvZGUgcGF0aCwgZXJyb3JzIGFyZSBub3QgZmF0YWwgLSB3ZSBqdXN0IHRyeSB1c2luZworICAgICAgICAvLyBhbm90aGVyIG1ldGhvZC4gIFdlIG9ubHkgZW1pdCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhZmZpbml0eSBpcyBvbiwKKyAgICAgICAgLy8gb3IgdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQsIGFuIHRoZSBub3dhcm5pbmdzIGZsYWcgd2FzIG5vdCBzZXQuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgIGludCBsaW5lID0gMDsKKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmICgobXNnX2lkICE9IGttcF9pMThuX251bGwpCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpKSB7CisjICBpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyU3RyLCAiS01QX0FGRklOSVRZIiwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICAgICAgICAgIH0KKyMgIGVsc2UKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJbmZvU3RyU3RyLCAiS01QX0FGRklOSVRZIiwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCksCisgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisjICBlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjIGlmIEtNUF9PU19MSU5VWAorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmICgobXNnX2lkICE9IGttcF9pMThuX251bGwpCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpKSB7CisjICBpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZTdHJQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCksICIvcHJvYy9jcHVpbmZvIik7CisgICAgICAgICAgICAgICAgfQorIyAgZWxzZQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlN0clBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwgIi9wcm9jL2NwdWluZm8iKTsKKyMgIGVuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInIiKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtc2dfaWQgPSBrbXBfaTE4bl9zdHJfQ2FudE9wZW5DcHVpbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gIi9wcm9jL2NwdWluZm8iOworICAgICAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCZhZGRyZXNzMm9zLCAmbGluZSwgJm1zZ19pZCwgZik7CisgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKFVzaW5nRmxhdE9TLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhVc2luZ0ZsYXRPU0ZpbGUsIGZpbGVfbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoVXNpbmdGbGF0T1NGaWxlTGluZSwgZmlsZV9uYW1lLCBsaW5lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSAiIjsKKyAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhhdCBhIHBhcmljdWxhciB0b3BvbG9neSBkaXNjb3ZlcnkgbWV0aG9kCisgICAgLy8gaXMgdG8gYmUgdXNlZCwgdGhlbiB3ZSBhYm9ydCBpZiB0aGF0IG1ldGhvZCBmYWlscy4gIFRoZSBleGNlcHRpb24gaXMKKyAgICAvLyBncm91cCBhZmZpbml0eSwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGltcGxpY2l0bHkgc2V0LgorICAgIC8vCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2Rpbmd4MkFQSUMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwKKyAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8pIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZmlsZW5hbWUgPSBfX2ttcF9jcHVpbmZvX2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gZXJybm87CisgICAgICAgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCZhZGRyZXNzMm9zLCAmbGluZSwgJm1zZ19pZCwgZik7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZUxpbmVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEZpbGVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPT0gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXApIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmV2luZG93c1Byb2NHcm91cE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBLTVBfQVNTRVJUKGRlcHRoICE9IDApOworCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmICgobXNnX2lkICE9IGttcF9pMThuX251bGwpCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoVXNpbmdGbGF0T1MsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNob3VsZCBub3QgZmFpbAorICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zICE9IE5VTEwpOworICAgICAgICB9CisgICAgfQorCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdGbGF0T1MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgfQorCisgICAgaWYgKGFkZHJlc3Myb3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworIyBpZiBLTVBfTUlDCisgICAgX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcygmYWRkcmVzczJvcywgZGVwdGgpOworIyBlbmRpZgorCisgICAgLy8KKyAgICAvLyBDcmVhdGUgdGhlIHRhYmxlIG9mIG1hc2tzLCBpbmRleGVkIGJ5IHRocmVhZCBJZC4KKyAgICAvLworICAgIHVuc2lnbmVkIG1heEluZGV4OworICAgIHVuc2lnbmVkIG51bVVuaXF1ZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2sgPSBfX2ttcF9jcmVhdGVfbWFza3MoJm1heEluZGV4LCAmbnVtVW5pcXVlLAorICAgICAgYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID09IDApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChudW1VbmlxdWUgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGNoaWxkTnVtcyB2ZWN0b3IgaW4gYWxsIEFkZHJlc3Mgb2JqZWN0cy4gIFRoaXMgbXVzdCBiZSBkb25lCisgICAgLy8gYmVmb3JlIHdlIGNhbiBzb3J0IHVzaW5nIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSgpLAorICAgIC8vIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2V0dGluZyBvZiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICBzd2l0Y2ggKF9fa21wX2FmZmluaXR5X3R5cGUpIHsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCkKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdCgmX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCBvc0lkMk1hc2ssCisgICAgICAgICAgICAgIG1heEluZGV4KTsKKyAgICAgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGVuZGlmCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZk5vVmFsaWRQcm9jSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG90aGVyIGFmZmluaXR5IHR5cGVzIHJlbHkgb24gc29ydGluZyB0aGUgQWRkcmVzc2VzIGFjY29yZGluZworICAgICAgICAvLyB0byBzb21lIHBlcm11dGF0aW9uIG9mIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUuICBTZXQKKyAgICAgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCBhbmQgX19rbXBfYWZmaW5pdHlfb2Zmc2V0IGFwcHJvcHJpYXRlbHksCisgICAgICAgIC8vIHRoZW4ganVtcCB0byBhIGNvbW1vbiBjb2RlIGZyYWdtZW50IHRvIGRvIHRoZSBzb3J0IGFuZCBjcmVhdGUKKyAgICAgICAgLy8gdGhlIGFycmF5IG9mIGFmZmluaXR5IG1hc2tzLgorICAgICAgICAvLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6CisgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBfX2ttcF9hZmZpbml0eV9vZmZzZXQKKyAgICAgICAgICAgICAgJSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDEgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gZGVwdGggLSAxOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworIyBpZiBLTVBfTUlDCisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgIC8vIEJhbGFuY2VkIHdvcmtzIG9ubHkgZm9yIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHBhY2thZ2UgYW5kIHVuaWZvcm0gdG9wb2xvZ3kKKyAgICAgICAgaWYoIG5QYWNrYWdlcyA+IDEgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmQmFsYW5jZWROb3RBdmFpbCwgIktNUF9BRkZJTklUWSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBkZXB0aCBmb3IgZnVydGhlciB1c2FnZQorICAgICAgICAgICAgX19rbXBfYWZmX2RlcHRoID0gZGVwdGg7CisKKyAgICAgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgICAgIGludCBudGhfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisKKyAgICAgICAgICAgIGludCBjb3JlX2xldmVsOworICAgICAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICAgICAgY29yZV9sZXZlbCA9IGRlcHRoIC0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29yZV9sZXZlbCA9IGRlcHRoIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuY29yZXMgPSBhZGRyZXNzMm9zWyBfX2ttcF9hdmFpbF9wcm9jIC0gMSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdICsgMTsKKyAgICAgICAgICAgIGludCBucHJvYyA9IG50aF9wZXJfY29yZSAqIG5jb3JlczsKKworICAgICAgICAgICAgcHJvY2FyciA9ICggaW50ICogKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGludCApICogbnByb2MgKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBwcm9jYXJyWyBpIF0gPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IHByb2MgPSBhZGRyZXNzMm9zWyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIC8vIElmIGRlcHRoID09IDMgdGhlbiBsZXZlbD0wIC0gcGFja2FnZSwgbGV2ZWw9MSAtIGNvcmUsIGxldmVsPTIgLSB0aHJlYWQuCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkIHBlciBjb3JlIHRoZW4gZGVwdGggPT0gMjogbGV2ZWwgMCAtIHBhY2thZ2UsCisgICAgICAgICAgICAgICAgLy8gbGV2ZWwgMSAtIGNvcmUuCisgICAgICAgICAgICAgICAgaW50IGxldmVsID0gZGVwdGggLSAxOworCisgICAgICAgICAgICAgICAgLy8gX19rbXBfbnRoX3Blcl9jb3JlID09IDEKKyAgICAgICAgICAgICAgICBpbnQgdGhyZWFkID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29yZSA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIF07CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBsZXZlbCBleGlzdHMsIHRoYXQgaXMgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHRocmVhZCBjb250ZXh0IHBlciBjb3JlCisgICAgICAgICAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIF0gJSBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCAtIDEgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvY2FyclsgY29yZSAqIG50aF9wZXJfY29yZSArIHRocmVhZCBdID0gcHJvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgZW5kaWYKKworICAgICAgICBzb3J0QWRkcmVzc2VzOgorICAgICAgICAvLworICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgZ3RpZC0+YWZmaW5pdHkgbWFzayB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2R1cHMpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBudW1VbmlxdWU7CisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9pbnRlbCApCisgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApCisgICAgICAgICAgJiYgKCAodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA8IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICAgICAgfQorIyBlbmRpZgorCisgICAgICAgIF9fa21wX2FmZmluaXR5X21hc2tzID0gKGttcF9hZmZpbl9tYXNrX3QqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU29ydCB0aGUgYWRkcmVzczJvcyB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCB0aGVuIGZpbGwgb3V0IF9fa21wX2FmZmluaXR5X21hc2tzLgorICAgICAgICAvLworICAgICAgICBxc29ydChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgdW5zaWduZWQgajsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCghIF9fa21wX2FmZmluaXR5X2R1cHMpICYmICghIGFkZHJlc3Myb3NbaV0uZmlyc3QubGVhZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKnNyYyA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpkZXN0CisgICAgICAgICAgICAgICAgICA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGopOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoS01QX0NQVV9JU1NFVChvc0lkLCBzcmMpKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoKytqID49IF9fa21wX2FmZmluaXR5X251bV9tYXNrcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGogPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMigwLCAiVW5leHBlY3RlZCBhZmZpbml0eSBzZXR0aW5nIik7CisgICAgfQorCisgICAgX19rbXBfZnJlZShvc0lkMk1hc2spOworfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2luaXRpYWxpemUodm9pZCkKK3sKKyAgICAvLworICAgIC8vIE11Y2ggb2YgdGhlIGNvZGUgYWJvdmUgd2FzIHdyaXR0ZW4gYXNzdW1taW5nIHRoYXQgaWYgYSBtYWNoaW5lIHdhcyBub3QKKyAgICAvLyBhZmZpbml0eSBjYXBhYmxlLCB0aGVuIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZS4gIFdlIG5vdworICAgIC8vIGV4cGxpY2l0bHkgcmVwcmVzZW50IHRoaXMgYXMgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIC8vIFRoZXJlIGFyZSB0b28gbWFueSBjaGVja3MgZm9yIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgIC8vIGluIHRoaXMgY29kZS4gIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGNoYW5nZSB0aGVtIGFsbCwgY2hlY2sgaWYKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLCBhbmQgaWYgc28sIHNsYW0gaXQgd2l0aAorICAgIC8vIGFmZmluaXR5X25vbmUsIGNhbGwgdGhlIHJlYWwgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgdGhlbiByZXN0b3JlCisgICAgLy8gX19rbXBfYWZmaW5pdHlfdHlwZSB0byBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIGludCBkaXNhYmxlZCA9IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkKTsKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIEtNUF9BU1NFUlQoZGlzYWJsZWQpOworICAgIH0KKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorICAgIF9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisgICAgaWYgKGRpc2FibGVkKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9hZmZpbml0eV9tYXNrcyk7CisgICAgICAgIF9fa21wX2FmZmluaXR5X21hc2tzID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGZ1bGxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9GUkVFKGZ1bGxNYXNrKTsKKyAgICAgICAgZnVsbE1hc2sgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSAwOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworIyBlbmRpZgorICAgIGlmIChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmKCBhZGRyZXNzMm9zICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIGFkZHJlc3Myb3MgKTsKKyAgICAgICAgYWRkcmVzczJvcyA9IE5VTEw7CisgICAgfQorICAgIGlmKCBwcm9jYXJyICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHByb2NhcnIgKTsKKyAgICAgICAgcHJvY2FyciA9IE5VTEw7CisgICAgfQorfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCkKK3sKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgIGlmICh0aC0+dGgudGhfYWZmaW5fbWFzayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfQUxMT0ModGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0NQVV9aRVJPKHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUuCisgICAgLy8gSWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCBjb3B5IHRoZSAiZnVsbCIgbWFzaywgaS5lLiBvbmUKKyAgICAvLyB0aGF0IGhhcyBhbGwgb2YgdGhlIE9TIHByb2MgaWRzIHNldCwgb3IgaWYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrCisgICAgLy8gaXMgc2V0LCB0aGVuIHRoZSBmdWxsIG1hc2sgaXMgdGhlIHNhbWUgYXMgdGhlIG1hc2sgb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgLy8gdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBpbnQgaTsKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpCisjIGlmIEtNUF9NSUMKKyAgICAgICAgICB8fCAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCkKKyMgZW5kaWYKKyAgICAgICAgICApIHsKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgICAgICBpID0gLTE7CisgICAgICAgICAgICBtYXNrID0gZnVsbE1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICk7CisgICAgICAgICAgICBpID0gKGd0aWQgKyBfX2ttcF9hZmZpbml0eV9vZmZzZXQpICUgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICAgICAgbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGkpOworICAgICAgICB9CisgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGVsc2UgeworICAgICAgICBpZiAoKCEgaXNhX3Jvb3QpCisgICAgICAgICAgfHwgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZmFsc2UpKSB7CisjICBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorIyAgZW5kaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgICAgICBpID0gS01QX1BMQUNFX0FMTDsKKyAgICAgICAgICAgIG1hc2sgPSBmdWxsTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBpbnQgaSA9IHNvbWUgaGFzaCBmdW5jdGlvbiBvciBqdXN0IGEgY291bnRlciB0aGF0IGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGFsd2F5cyBzdGFydCBhdCAwLiAgVXNlIGd0aWQgZm9yIG5vdy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICk7CisgICAgICAgICAgICBpID0gKGd0aWQgKyBfX2ttcF9hZmZpbml0eV9vZmZzZXQpICUgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICAgICAgbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGkpOworICAgICAgICB9CisgICAgfQorIyBlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBpOworICAgIGlmIChpc2Ffcm9vdCkgeworICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gaTsKKyAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gMDsKKyAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworICAgIH0KKworICAgIGlmIChpID09IEtNUF9QTEFDRV9BTEwpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBhbGwgcGxhY2VzXG4iLAorICAgICAgICAgIGd0aWQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgaSkpOworICAgIH0KKyMgZWxzZQorICAgIGlmIChpID09IC0xKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gZnVsbE1hc2tcbiIsCisgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBtYXNrICVkXG4iLAorICAgICAgICAgIGd0aWQsIGkpKTsKKyAgICB9CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIktNUF9BRkZJTklUWSIsIGd0aWQsIGJ1Zik7CisgICAgfQorCisjIGlmIEtNUF9PU19XSU5ET1dTCisgICAgLy8KKyAgICAvLyBPbiBXaW5kb3dzKiBPUywgdGhlIHByb2Nlc3MgYWZmaW5pdHkgbWFzayBtaWdodCBoYXZlIGNoYW5nZWQuCisgICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IHJlcXVlc3QgYWZmaW5pdHkgYW5kIHRoaXMgY2FsbCBmYWlscywKKyAgICAvLyBqdXN0IGNvbnRpbnVlIHNpbGVudGx5LiAgU2VlIENRMTcxMzkzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKSB7CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorIyBlbmRpZgorICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIFRSVUUpOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKwordm9pZAorX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9wbGFjZTogYmluZGluZyBUIyVkIHRvIHBsYWNlICVkIChjdXJyZW50IHBsYWNlID0gJWQpXG4iLAorICAgICAgZ3RpZCwgdGgtPnRoLnRoX25ld19wbGFjZSwgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UpKTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbmV3IHBsYWNlIGlzIHdpdGhpbiB0aGlzIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfbmV3X3BsYWNlID49IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQoKHVuc2lnbmVkKXRoLT50aC50aF9uZXdfcGxhY2UgPD0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICBpZiAodGgtPnRoLnRoX2ZpcnN0X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgJiYgKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgfHwgKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUsCisgICAgLy8gYW5kIHNldCB0aGlzIHRocmVhZCdzIGFmZmluaXR5LgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlKTsKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gdGgtPnRoLnRoX25ld19wbGFjZTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJPTVBfUFJPQ19CSU5EIiwgZ3RpZCwgYnVmKTsKKyAgICB9CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgVFJVRSk7Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCitpbnQKK19fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHk6IHNldHRpbmcgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwcm9jOworICAgICAgICAgICAgaW50IG51bV9wcm9jcyA9IDA7CisKKyAgICAgICAgICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBLTVBfQ1BVX1NFVFNJWkU7IHByb2MrKykgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtX3Byb2NzKys7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fcHJvY3MgPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICAgICAgfQorCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgaWYgKF9fa21wX2dldF9wcm9jX2dyb3VwKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICByZXR2YWwgPSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworIyBlbmRpZgorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQKK19fa21wX2F1eF9nZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spCit7CisgICAgaW50IGd0aWQ7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzdG9yZWQgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX2dldF9hZmZpbml0eSIpOworICAgICAgICB9CisgICAgfQorCisjIGlmICFLTVBfT1NfV0lORE9XUworCisgICAgcmV0dmFsID0gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIEZBTFNFKTsKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX3ByaW50Zigia21wX2dldF9hZmZpbml0eTogc3lzdGVtIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLCBndGlkLCBidWYpOworICAgIH0pOworICAgIHJldHVybiByZXR2YWw7CisKKyMgZWxzZQorCisgICAgS01QX0NQVV9DT1BZKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIHJldHVybiAwOworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK30KKworCitpbnQKK19fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYzogc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIEtNUF9DUFVfU0VUKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jOiB1bnNldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIEtNUF9DUFVfQ0xSKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2M6IGdldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHByb2MgPCAwKSB8fCAoKHVuc2lnbmVkKXByb2MgPj0gS01QX0NQVV9TRVRTSVpFKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKK30KKworIyBpZiBLTVBfTUlDCisKKy8vIER5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MgLSBBZmZpbml0eSBiYWxhbmNlZAordm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IG50aHJlYWRzICkKK3sKKyAgICBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICBpbnQgY29yZUlEOworICAgICAgICBpbnQgdGhyZWFkSUQ7CisgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgaW50IF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBfX2ttcF9uY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcworICAgICAgICBpbnQgbmNvcmVzID0gX19rbXBfbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSB0aHJlYWRzIHdpbGwgYmUgYm91bmQgdG8gZWFjaCBjb3JlCisgICAgICAgIGludCBjaHVuayA9IG50aHJlYWRzIC8gbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSBjb3JlcyB3aWxsIGhhdmUgYW4gYWRkaXRpb25hbCB0aHJlYWQgYm91bmQgdG8gaXQgLSAiYmlnIGNvcmVzIgorICAgICAgICBpbnQgYmlnX2NvcmVzID0gbnRocmVhZHMgJSBuY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiB0aHJlYWRzIG9uIHRoZSBiaWcgY29yZXMKKyAgICAgICAgaW50IGJpZ19udGggPSAoIGNodW5rICsgMSApICogYmlnX2NvcmVzOworICAgICAgICBpZiggdGlkIDwgYmlnX250aCApIHsKKyAgICAgICAgICAgIGNvcmVJRCA9IHRpZCAvIChjaHVuayArIDEgKTsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCB0aWQgJSAoY2h1bmsgKyAxICkgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0gZWxzZSB7IC8vdGlkID49IGJpZ19udGgKKyAgICAgICAgICAgIGNvcmVJRCA9ICggdGlkIC0gYmlnX2NvcmVzICkgLyBjaHVuazsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCAoIHRpZCAtIGJpZ19jb3JlcyApICUgY2h1bmsgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIHRocmVhZElEIF0uc2Vjb25kOworICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX250aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBvc0lEOworICAgICAgICAgICAgICAgIG9zSUQgPSBhZGRyZXNzMm9zWyBjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG1hc2spOworICAgICAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgdGlkLCBidWYpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIG1hc2ssIFRSVUUgKTsKKyAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICBjb3JlX2xldmVsID0gX19rbXBfYWZmX2RlcHRoIC0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIC0gbWF4aW11bSB2YWx1ZTsgaXQgZG9lcyBub3QgY291bnQgdHJhaWwgY29yZXMgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworCisgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSBnYWluIGNvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2UgbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYworICAgICAgICBpZiggbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgIGludCBjb3JlSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBjb3VudCBmb3VuZCBvc0lEcyBmb3IgdGhlIGN1cnJlbnQgY29yZTsgdGhleSBjYW4gYmUgbm90IG1vcmUgdGhhbiBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGFkZHJlc3Myb3MgaXMgc29ydGllZCB3ZSBjYW4gYnJlYWsgd2hlbiBjbnQ9PW50aF9wZXJfY29yZQorICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgICAgICBpZiggY29yZSA9PSBjb3JlSUQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gbnRoX3Blcl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoIG50aHJlYWRzIDw9IF9fa21wX25jb3JlcyApIHsKKworICAgICAgICAgICAgaW50IGNvcmUgPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvcmUgZnJvbSBwcm9jYXJyW10gaXMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICBpbnQgaW5fbWFzayA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5fbWFzayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaW5fbWFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRpZCA9PSBjb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9zSUQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBncmFudWxhcml0eT10aHJlYWQgaXQgaXMgZW5vdWdoIHRvIHNldCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9zSUQgZm9yIHRoaXMgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUgfHwgX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeyAvLyBudGhyZWFkcyA+IF9fa21wX25jb3JlcworCisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdCBlYWNoIGNvcmUKKyAgICAgICAgICAgIGludCBucHJvY19hdF9jb3JlWyBuY29yZXMgXTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICJ4IiBhdmFpbGFibGUgcHJvY2Vzc29yczsKKyAgICAgICAgICAgIGludCBuY29yZXNfd2l0aF94X3Byb2NzWyBudGhfcGVyX2NvcmUgKyAxIF07CisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgY29yZXMgd2l0aCAjIHByb2NzIGZyb20geCB0byBudGhfcGVyX2NvcmUKKyAgICAgICAgICAgIGludCBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgbnRoX3Blcl9jb3JlICsgMSBdOworCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBudGhfcGVyX2NvcmU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnByb2NfYXRfY29yZVsgaSBdID0gY250OworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGNudCBdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaSBdICs9IG5jb3Jlc193aXRoX3hfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworICAgICAgICAgICAgLy8gQW4gYXJyYXkgdG8ga2VlcCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgZWFjaCBjb250ZXh0CisgICAgICAgICAgICBpbnQgKiBuZXdhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbmV3YXJyWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnRoID0gbnRocmVhZHM7CisgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSggbnRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNudCA9IG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBqIF07CisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBjb3JlIHdpdGggMCBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbnByb2NfYXRfY29yZVsgaSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBrID0gMDsgayA8IG50aF9wZXJfY29yZTsgaysrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWcgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY250ID09IDAgfHwgbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG50aCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbmV3YXJyWyBpIF07CisgICAgICAgICAgICAgICAgaWYoIHN1bSA+IHRpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGkgLyBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpaSA9IDA7IGlpIDwgbnRoX3Blcl9jb3JlOyBpaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgY29yZUlEICogbnRoX3Blcl9jb3JlICsgaWkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBuZXdhcnIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgIH0KK30KKworIyBlbmRpZiAvKiBLTVBfTUlDICovCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2FsbG9jLmMgYi9yYzEvcnVudGltZS9zcmMva21wX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1NzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYwpAQCAtMCwwICsxLDIwNDYgQEAKKy8qCisgKiBrbXBfYWxsb2MuYyAtLSBwcml2YXRlL3NoYXJlZCBkeWFubWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYW5hZ2VtZW50CisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworLy8gRGlzYWJsZSBiZ2V0IHdoZW4gaXQgaXMgbm90IHVzZWQKKyNpZiBLTVBfVVNFX0JHRVQKKworLyogVGhyZWFkIHByaXZhdGUgYnVmZmVyIG1hbmFnZW1lbnQgY29kZSAqLworCit0eXBlZGVmIGludCAgICgqYmdldF9jb21wYWN0X3QpKHNpemVfdCwgaW50KTsKK3R5cGVkZWYgdm9pZCAqKCpiZ2V0X2FjcXVpcmVfdCkoc2l6ZV90KTsKK3R5cGVkZWYgdm9pZCAgKCpiZ2V0X3JlbGVhc2VfdCkodm9pZCAqKTsKKworLyogTk9URTogYnVmc2l6ZSBtdXN0IGJlIGEgc2lnbmVkIGRhdGF0eXBlICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisgICB0eXBlZGVmIGttcF9pbnQzMiBidWZzaXplOworIyBlbHNlCisgICB0eXBlZGVmIGttcF9pbnQ2NCBidWZzaXplOworIyBlbmRpZgorI2Vsc2UKKyAgdHlwZWRlZiBzc2l6ZV90IGJ1ZnNpemU7CisjZW5kaWYKKworLyogVGhlIHRocmVlIG1vZGVzIG9mIG9wZXJhdGlvbiBhcmUsIGZpZm8gc2VhcmNoLCBsaWZvIHNlYXJjaCwgYW5kIGJlc3QtZml0ICovCisKK3R5cGVkZWYgZW51bSBiZ2V0X21vZGUgeworICAgIGJnZXRfbW9kZV9maWZvID0gMCwKKyAgICBiZ2V0X21vZGVfbGlmbyA9IDEsCisgICAgYmdldF9tb2RlX2Jlc3QgPSAyCit9IGJnZXRfbW9kZV90OworCisKK3N0YXRpYyB2b2lkICAgIGJwb29sKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmZmVyLCBidWZzaXplIGxlbik7CitzdGF0aWMgdm9pZCAgICpiZ2V0KCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplKTsKK3N0YXRpYyB2b2lkICAgKmJnZXR6KCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplKTsKK3N0YXRpYyB2b2lkICAgKmJnZXRyKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmZmVyLCBidWZzaXplIG5ld3NpemUpOworc3RhdGljIHZvaWQgICAgYnJlbCgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1Zik7CitzdGF0aWMgdm9pZCAgICBiZWN0bCggIGttcF9pbmZvX3QgKnRoLCBiZ2V0X2NvbXBhY3RfdCBjb21wYWN0LCBiZ2V0X2FjcXVpcmVfdCBhY3F1aXJlLCBiZ2V0X3JlbGVhc2VfdCByZWxlYXNlLCBidWZzaXplIHBvb2xfaW5jciApOworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgdm9pZCAgICBic3RhdHMoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpjdXJhbGxvYywgYnVmc2l6ZSAqdG90ZnJlZSwgYnVmc2l6ZSAqbWF4ZnJlZSwgbG9uZyAqbmdldCwgbG9uZyAqbnJlbCk7CitzdGF0aWMgdm9pZCAgICBic3RhdHNlKCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqcG9vbF9pbmNyLCBsb25nICpucG9vbCwgbG9uZyAqbnBnZXQsIGxvbmcgKm5wcmVsLCBsb25nICpuZGdldCwgbG9uZyAqbmRyZWwpOworc3RhdGljIHZvaWQgICAgYnVmZHVtcCgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1Zik7CitzdGF0aWMgdm9pZCAgICBicG9vbGQoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sLCBpbnQgZHVtcGFsbG9jLCBpbnQgZHVtcGZyZWUpOworc3RhdGljIGludCAgICAgYnBvb2x2KCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcG9vbCk7CisjZW5kaWYKKworLyogQkdFVCBDT05GSUdVUkFUSU9OICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBhbGxvY2F0aW9uIHNpemUgcXVhbnR1bToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGFyZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIHRoaXMgc2l6ZS4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgd2l0aCAgTGludXgqIE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2MoKSBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmUgMTYgYnl0ZSBhbGlnbm1uZW50ICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgIUtNUF9IQVZFX1FVQUQKKworI2RlZmluZSBTaXplUXVhbnQgICA4CisjZGVmaW5lIEFsaWduVHlwZSAgIGRvdWJsZQorCisjZWxzZQorCisjZGVmaW5lIFNpemVRdWFudCAgIDE2CisjZGVmaW5lIEFsaWduVHlwZSAgIF9RdWFkCisKKyNlbmRpZgorCisjZGVmaW5lIEJ1ZlN0YXRzICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzdGF0cygpIGZ1bmN0aW9uIHdoaWNoIGNhbGN1bGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCB0aGUgbGFyZ2VzdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBhbmQgdGhlIHRvdGFsIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBhbGxvY2F0ZWQuICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2RlZmluZSBCdWZEdW1wICAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicG9vbGQoKSBmdW5jdGlvbiB3aGljaCBkdW1wcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycyBpbiBhIGJ1ZmZlciBwb29sLiAqLworCisjZGVmaW5lIEJ1ZlZhbGlkICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sdigpIGZ1bmN0aW9uIGZvciB2YWxpZGF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgRHVtcERhdGEgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZHVtcCgpIGZ1bmN0aW9uIHdoaWNoIGFsbG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1waW5nIHRoZSBjb250ZW50cyBvZiBhbiBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZnJlZSBidWZmZXIuICovCisjaWZkZWYgTk9UX1VTRURfTk9XCisKKyNkZWZpbmUgRnJlZVdpcGUgICAgMSAgICAgICAgICAgICAgICAgLyogV2lwZSBmcmVlIGJ1ZmZlcnMgdG8gYSBndWFyYW50ZWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gb2YgZ2FyYmFnZSB0byB0cmlwIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NyZWFudHMgd2hvIGF0dGVtcHQgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJzIGludG8gcmVsZWFzZWQgYnVmZmVycy4gKi8KKworI2RlZmluZSBCZXN0Rml0ICAgICAxICAgICAgICAgICAgICAgICAvKiBVc2UgYSBiZXN0IGZpdCBhbGdvcml0aG0gd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hpbmcgZm9yIHNwYWNlIGZvciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHJlcXVlc3QuICBUaGlzIHVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IG1vcmUgZWZmaWNpZW50bHksIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHdpbGwgYmUgbXVjaCBzbG93ZXIuICovCisjZW5kaWYgLyogTk9UX1VTRURfTk9XICovCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKworc3RhdGljIGJ1ZnNpemUgYmdldF9iaW5fc2l6ZVsgXSA9IHsKKyAgICAwLAorLy8gICAgMSA8PCA2LCAgICAvKiAuNSBDYWNoZSBsaW5lICovCisgICAgMSA8PCA3LCAgICAvKiAxIENhY2hlIGxpbmUsIG5ldyAqLworICAgIDEgPDwgOCwgICAgLyogMiBDYWNoZSBsaW5lcyAqLworICAgIDEgPDwgOSwgICAgLyogNCBDYWNoZSBsaW5lcywgbmV3ICovCisgICAgMSA8PCAxMCwgICAvKiA4IENhY2hlIGxpbmVzICovCisgICAgMSA8PCAxMSwgICAvKiAxNiBDYWNoZSBsaW5lcywgbmV3ICovCisgICAgMSA8PCAxMiwKKyAgICAxIDw8IDEzLCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTQsCisgICAgMSA8PCAxNSwgICAvKiBuZXcgKi8KKyAgICAxIDw8IDE2LAorICAgIDEgPDwgMTcsCisgICAgMSA8PCAxOCwKKyAgICAxIDw8IDE5LAorICAgIDEgPDwgMjAsICAgIC8qICAxTUIgKi8KKyAgICAxIDw8IDIxLCAgICAvKiAgMk1CICovCisgICAgMSA8PCAyMiwgICAgLyogIDRNQiAqLworICAgIDEgPDwgMjMsICAgIC8qICA4TUIgKi8KKyAgICAxIDw8IDI0LCAgICAvKiAxNk1CICovCisgICAgMSA8PCAyNSwgICAgLyogMzJNQiAqLworfTsKKworI2RlZmluZSBNQVhfQkdFVF9CSU5TICAgKGludCkoc2l6ZW9mKGJnZXRfYmluX3NpemUpIC8gc2l6ZW9mKGJ1ZnNpemUpKQorCitzdHJ1Y3QgYmZoZWFkOworCisvKiAgRGVjbGFyZSB0aGUgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSB0eXBlLAorICAgIGJ1ZnNpemUuICAqLworCisvKiBRdWV1ZSBsaW5rcyAqLworCit0eXBlZGVmIHN0cnVjdCBxbGlua3MgeworICAgIHN0cnVjdCBiZmhlYWQgKmZsaW5rOyAgICAgICAgICAgICAvKiBGb3J3YXJkIGxpbmsgKi8KKyAgICBzdHJ1Y3QgYmZoZWFkICpibGluazsgICAgICAgICAgICAgLyogQmFja3dhcmQgbGluayAqLworfSBxbGlua3NfdDsKKworLyogSGVhZGVyIGluIGFsbG9jYXRlZCBhbmQgZnJlZSBidWZmZXJzICovCisKK3R5cGVkZWYgc3RydWN0IGJoZWFkMiB7CisgICAga21wX2luZm9fdCAqYnRocjsgICAgICAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgd2hpY2ggb3ducyB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBidWZzaXplICAgICBwcmV2ZnJlZTsgICAgICAgICAgICAgLyogUmVsYXRpdmUgbGluayBiYWNrIHRvIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUgYnVmZmVyIGluIG1lbW9yeSBvciAwIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICAqLworICAgIGJ1ZnNpemUgICAgIGJzaXplOyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgc2l6ZTogcG9zaXRpdmUgaWYgZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgaWYgYWxsb2NhdGVkLiAqLworfSBiaGVhZDJfdDsKKworLyogTWFrZSBzdXJlIHRoZSBiaGVhZCBzdHJ1Y3R1cmUgaXMgYSBtdWx0aXBsZSBvZiBTaXplUXVhbnQgaW4gc2l6ZS4gKi8KKwordHlwZWRlZiB1bmlvbiBiaGVhZCB7CisgICAgS01QX0FMSUdOKCBTaXplUXVhbnQgKQorICAgIEFsaWduVHlwZSAgICAgICAgICAgYl9hbGlnbjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGJfcGFkWyBzaXplb2YoYmhlYWQyX3QpICsgKFNpemVRdWFudCAtIChzaXplb2YoYmhlYWQyX3QpICUgU2l6ZVF1YW50KSkgXTsKKyAgICBiaGVhZDJfdCAgICAgICAgICAgIGJiOworfSBiaGVhZF90OworI2RlZmluZSBCSChwKSAgICgoYmhlYWRfdCAqKSAocCkpCisKKy8qICBIZWFkZXIgaW4gZGlyZWN0bHkgYWxsb2NhdGVkIGJ1ZmZlcnMgKGJ5IGFjcWZjbikgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmRoZWFkCit7CisgICAgYnVmc2l6ZSB0c2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIHNpemUsIGluY2x1ZGluZyBvdmVyaGVhZCAqLworICAgIGJoZWFkX3QgYmg7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tb24gaGVhZGVyICovCit9IGJkaGVhZF90OworI2RlZmluZSBCREgocCkgICgoYmRoZWFkX3QgKikgKHApKQorCisvKiBIZWFkZXIgaW4gZnJlZSBidWZmZXJzICovCisKK3R5cGVkZWYgc3RydWN0IGJmaGVhZCB7CisgICAgYmhlYWRfdCAgYmg7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBhbGxvY2F0ZWQvZnJlZSBoZWFkZXIgKi8KKyAgICBxbGlua3NfdCBxbDsgICAgICAgICAgICAgICAgICAgICAgLyogTGlua3Mgb24gZnJlZSBsaXN0ICovCit9IGJmaGVhZF90OworI2RlZmluZSBCRkgocCkgICgoYmZoZWFkX3QgKikgKHApKQorCit0eXBlZGVmIHN0cnVjdCB0aHJfZGF0YSB7CisgICAgYmZoZWFkX3QgZnJlZWxpc3RbIE1BWF9CR0VUX0JJTlMgXTsKKyNpZiBCdWZTdGF0cworICAgIHNpemVfdCB0b3RhbGxvYzsgICAgICAgICAgICAgICAvKiBUb3RhbCBzcGFjZSBjdXJyZW50bHkgYWxsb2NhdGVkICovCisgICAgbG9uZyBudW1nZXQsIG51bXJlbDsgICAgICAgICAgIC8qIE51bWJlciBvZiBiZ2V0KCkgYW5kIGJyZWwoKSBjYWxscyAqLworICAgIGxvbmcgbnVtcGJsazsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcG9vbCBibG9ja3MgKi8KKyAgICBsb25nIG51bXBnZXQsIG51bXByZWw7ICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrIGdldHMgYW5kIHJlbHMgKi8KKyAgICBsb25nIG51bWRnZXQsIG51bWRyZWw7ICAgICAgICAgLyogTnVtYmVyIG9mIGRpcmVjdCBnZXRzIGFuZCByZWxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAgIC8qIEF1dG9tYXRpYyBleHBhbnNpb24gYmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKyAgICBiZ2V0X2NvbXBhY3RfdCBjb21wZmNuOworICAgIGJnZXRfYWNxdWlyZV90IGFjcWZjbjsKKyAgICBiZ2V0X3JlbGVhc2VfdCByZWxmY247CisKKyAgICBiZ2V0X21vZGVfdCAgICBtb2RlOyAgICAgICAgICAgICAgLyogd2hhdCBhbGxvY2F0aW9uIG1vZGUgdG8gdXNlPyAqLworCisgICAgYnVmc2l6ZSBleHBfaW5jcjsgICAgICAgICAgICAgICAgIC8qIEV4cGFuc2lvbiBibG9jayBzaXplICovCisgICAgYnVmc2l6ZSBwb29sX2xlbjsgICAgICAgICAgICAgICAgIC8qIDA6IG5vIGJwb29sIGNhbGxzIGhhdmUgYmVlbiBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBub3QgYWxsIHBvb2wgYmxvY2tzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+MDogKGNvbW1vbikgYmxvY2sgc2l6ZSBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicG9vbCBjYWxscyBtYWRlIHNvIGZhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGJmaGVhZF90ICogbGFzdF9wb29sOyAgICAgICAgICAgICAvKiBMYXN0IHBvb2wgb3duZWQgYnkgdGhpcyB0aHJlYWQgKGRlbGF5IGRlYWxvY2F0aW9uKSAqLworfSB0aHJfZGF0YV90OworCisvKiAgTWluaW11bSBhbGxvY2F0aW9uIHF1YW50dW06ICovCisKKyNkZWZpbmUgUUxTaXplICAoc2l6ZW9mKHFsaW5rc190KSkKKyNkZWZpbmUgU2l6ZVEgICAoKFNpemVRdWFudCA+IFFMU2l6ZSkgPyBTaXplUXVhbnQgOiBRTFNpemUpCisjZGVmaW5lIE1heFNpemUgKGJ1ZnNpemUpKCB+ICggKCAoYnVmc2l6ZSkoIDEgKSA8PCAoIHNpemVvZiggYnVmc2l6ZSApICogQ0hBUl9CSVQgLSAxICkgKSB8ICggU2l6ZVF1YW50IC0gMSApICkgKQorICAgIC8vIE1heGltdW4gZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKworLyogRW5kIHNlbnRpbmVsOiB2YWx1ZSBwbGFjZWQgaW4gYnNpemUgZmllbGQgb2YgZHVtbXkgYmxvY2sgZGVsaW1pdGluZworICAgZW5kIG9mIHBvb2wgYmxvY2suICBUaGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgd2hpY2ggd2lsbCAgZml0ICBpbiAgYQorICAgYnVmc2l6ZSwgZGVmaW5lZCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciB3aWxsIGFjY2VwdC4gKi8KKworI2RlZmluZSBFU2VudCAgICgoYnVmc2l6ZSkgKC0oKCgoKGJ1ZnNpemUpMSk8PCgoaW50KXNpemVvZihidWZzaXplKSo4LTIpKS0xKSoyKS0yKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRocmVhZCBEYXRhIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KKworc3RhdGljIGludAorYmdldF9nZXRfYmluKCBidWZzaXplIHNpemUgKQoreworICAgIC8vIGJpbmFyeSBjaG9wIGJpbnMKKyAgICBpbnQgbG8gPSAwLCBoaSA9IE1BWF9CR0VUX0JJTlMgLSAxOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+IDAgKTsKKworICAgIHdoaWxlICggKGhpIC0gbG8pID4gMSApIHsKKyAgICAgICAgaW50IG1pZCA9IChsbyArIGhpKSA+PiAxOworICAgICAgICBpZiAoc2l6ZSA8IGJnZXRfYmluX3NpemVbIG1pZCBdKQorICAgICAgICAgICAgaGkgPSBtaWQgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsbyA9IG1pZDsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAobG8gPj0gMCkgJiYgKGxvIDwgTUFYX0JHRVRfQklOUykgKTsKKworICAgIHJldHVybiBsbzsKK30KKworc3RhdGljIHZvaWQKK3NldF90aHJfZGF0YSgga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBpOworICAgIHRocl9kYXRhX3QgKmRhdGE7CisKKyAgICBkYXRhID0KKyAgICAgICAgKHRocl9kYXRhX3QgKikoCisgICAgICAgICAgICAoICEgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSApID8gX19rbXBfYWxsb2NhdGUoIHNpemVvZiggKmRhdGEgKSApIDogdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YQorICAgICAgICApOworCisgICAgbWVtc2V0KCBkYXRhLCAnXDAnLCBzaXplb2YoICpkYXRhICkgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQkdFVF9CSU5TOyArK2kpIHsKKyAgICAgICAgZGF0YS0+ZnJlZWxpc3RbIGkgXS5xbC5mbGluayA9ICYgZGF0YS0+ZnJlZWxpc3RbIGkgXTsKKyAgICAgICAgZGF0YS0+ZnJlZWxpc3RbIGkgXS5xbC5ibGluayA9ICYgZGF0YS0+ZnJlZWxpc3RbIGkgXTsKKyAgICB9CisKKyAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID0gZGF0YTsKKyAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ID0gMDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9pbml0X2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworI2Vsc2UKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCit9CisKK3N0YXRpYyB0aHJfZGF0YV90ICoKK2dldF90aHJfZGF0YSgga21wX2luZm9fdCAqdGggKQoreworICAgIHRocl9kYXRhX3QgKmRhdGE7CisKKyAgICBkYXRhID0gKHRocl9kYXRhX3QgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGRhdGEgIT0gMCApOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKworI2lmZGVmIEtNUF9ERUJVRworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF92YWxpZGF0ZV9xdWV1ZSgga21wX2luZm9fdCAqdGggKQoreworICAgIC8qIE5PVEU6IGFzc3VtZSB0aGF0IHRoZSBnbG9iYWxfbG9jayBpcyBoZWxkICovCisKKyAgICB2b2lkICpwID0gKHZvaWQgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdDsKKworICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIHApIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplICE9IDApOworICAgICAgICBwID0gKHZvaWQgKikgYi0+cWwuZmxpbms7CisgICAgfQorfQorCisjZW5kaWYKKworLyogV2FsayB0aGUgZnJlZSBsaXN0IGFuZCByZWxlYXNlIHRoZSBlbnF1ZXVlZCBidWZmZXJzICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X2RlcXVldWUoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICB2b2lkICpwID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworCisgICAgaWYgKHAgIT0gMCkgeworICAgICAgICAjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCAqb2xkX3ZhbHVlID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgICAgICAgICAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QsIG9sZF92YWx1ZSwgTlVMTCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkX3ZhbHVlID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwID0gKHZvaWQgKikgb2xkX3ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZSAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworICAgICAgICAgICAgI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpICk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICAgICAgICAgICAgI2VuZGlmIC8qIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQgKi8KKworICAgICAgICAgICAgIHAgPSAodm9pZCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworCisgICAgICAgICAgICAjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgI2VuZGlmIC8qIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworCisgICAgICAgIC8qIENoZWNrIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgbGlzdCBpcyBub3QgZW1wdHkgKi8KKworICAgICAgICB3aGlsZSAocCAhPSAwKSB7CisgICAgICAgICAgICB2b2lkICpidWYgPSBwOworICAgICAgICAgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIHApIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgIT0gMCApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEgKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnRwdHJfdCl0aCApOyAvLyBjbGVhciBwb3NzaWJsZSBtYXJrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5xbC5ibGluayA9PSAwICk7CisKKyAgICAgICAgICAgIHAgPSAodm9pZCAqKSBiLT5xbC5mbGluazsKKworICAgICAgICAgICAgYnJlbCggdGgsIGJ1ZiApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGFpbiB0b2dldGhlciB0aGUgZnJlZSBidWZmZXJzIGJ5IHVzaW5nIHRoZSB0aHJlYWQgb3duZXIgZmllbGQgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfZW5xdWV1ZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZgorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICAgICAgLCBrbXBfaW50MzIgcmVsX2d0aWQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgKQoreworICAgIGJmaGVhZF90ICpiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICE9IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSApID09CisgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnRwdHJfdCl0aCApOyAvLyBjbGVhciBwb3NzaWJsZSBtYXJrCisKKyAgICBiLT5xbC5ibGluayA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2JnZXRfZW5xdWV1ZTogbW92aW5nIGJ1ZmZlciB0byBUIyVkIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworCisjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgICAgeworICAgICAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgICAgZXhwb3NpbmcgYSBicm9rZW4gbGlzdCB0byBvdGhlciB0aHJlYWRzLCBldmVuIGZvciBhbiBpbnN0YW50LiAqLworICAgICAgICBiLT5xbC5mbGluayA9IEJGSCggb2xkX3ZhbHVlICk7CisKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QsIG9sZF92YWx1ZSwgYnVmICkgKQorICAgICAgICB7CisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgLyogdGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBiZ2V0X2xpc3QgdG8gYnVmIHRvIGF2b2lkCisgICAgICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgICAgICBiLT5xbC5mbGluayA9IEJGSCggb2xkX3ZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworIyBpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssIHJlbF9ndGlkICk7CisjIGVsc2UKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAjIGVuZGlmCisKKyAgICBiLT5xbC5mbGluayA9IEJGSCggdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCApOworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAodm9pZCAqKSBidWY7CisKKyMgaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLCByZWxfZ3RpZCApOworIyBlbHNlCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjIGVuZGlmCisjZW5kaWYgLyogVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCit9CisKKy8qIGluc2VydCBidWZmZXIgYmFjayBvbnRvIGEgbmV3IGZyZWVsaXN0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHJfZGF0YV90ICp0aHIsIGJmaGVhZF90ICpiICkKK3sKKyAgICBpbnQgYmluOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYiApICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiaW4gPSBiZ2V0X2dldF9iaW4oIGItPmJoLmJiLmJzaXplICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rLT5xbC5mbGluayA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbmstPnFsLmJsaW5rID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSk7CisKKyAgICBiLT5xbC5mbGluayA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKyAgICBiLT5xbC5ibGluayA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rOworCisgICAgdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmsgPSBiOworICAgIGItPnFsLmJsaW5rLT5xbC5mbGluayA9IGI7Cit9CisKKy8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYmZoZWFkX3QgKmIgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+cWwuYmxpbmstPnFsLmZsaW5rID09IGIpOworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+cWwuZmxpbmstPnFsLmJsaW5rID09IGIpOworCisgICAgYi0+cWwuYmxpbmstPnFsLmZsaW5rID0gYi0+cWwuZmxpbms7CisgICAgYi0+cWwuZmxpbmstPnFsLmJsaW5rID0gYi0+cWwuYmxpbms7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgR0VUIFNUQVRTIC0tIGNoZWNrIGluZm8gb24gZnJlZSBsaXN0ICovCisKK3N0YXRpYyB2b2lkCitiY2hlY2soICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqbWF4X2ZyZWUsIGJ1ZnNpemUgKnRvdGFsX2ZyZWUgKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBpbnQgYmluOworCisgICAgKnRvdGFsX2ZyZWUgPSAqbWF4X2ZyZWUgPSAwOworCisgICAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICBiZmhlYWRfdCAqYiwgKmJlc3Q7CisKKyAgICAgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKyAgICAgICAgYiA9IGJlc3QtPnFsLmZsaW5rOworCisgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgKnRvdGFsX2ZyZWUgKz0gKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKCBiaGVhZF90ICkpOworICAgICAgICAgICAgaWYgKChiZXN0ID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgfHwgKGItPmJoLmJiLmJzaXplIDwgYmVzdC0+YmguYmIuYnNpemUpKQorICAgICAgICAgICAgICAgIGJlc3QgPSBiOworCisgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICBiID0gYi0+cWwuZmxpbms7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm1heF9mcmVlIDwgYmVzdC0+YmguYmIuYnNpemUpCisgICAgICAgICAgICAqbWF4X2ZyZWUgPSBiZXN0LT5iaC5iYi5ic2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKm1heF9mcmVlID4gKGJ1ZnNpemUpc2l6ZW9mKCBiaGVhZF90ICkpCisgICAgICAgICptYXhfZnJlZSAtPSBzaXplb2YoIGJoZWFkX3QgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBCR0VUICAtLSAgQWxsb2NhdGUgYSBidWZmZXIuICAqLworCitzdGF0aWMgdm9pZCAqCitiZ2V0KCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgcmVxdWVzdGVkX3NpemUgKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBidWZzaXplIHNpemUgPSByZXF1ZXN0ZWRfc2l6ZTsKKyAgICBiZmhlYWRfdCAqYjsKKyAgICB2b2lkICpidWY7CisgICAgaW50IGNvbXBhY3RzZXEgPSAwOworICAgIGludCB1c2VfYmxpbmsgPSAwOworLyogRm9yIEJlc3RGaXQgKi8KKyAgICBiZmhlYWRfdCAqYmVzdDsKKworICAgIGlmICggc2l6ZSA8IDAgfHwgc2l6ZSArIHNpemVvZiggYmhlYWRfdCApID4gTWF4U2l6ZSApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgICAgaWYgKHNpemUgPCAoYnVmc2l6ZSlTaXplUSkgeyAgICAgIC8qIE5lZWQgYXQgbGVhc3Qgcm9vbSBmb3IgdGhlICovCisgICAgICAgIHNpemUgPSBTaXplUTsgICAgICAgICAgICAgICAgIC8qICAgIHF1ZXVlIGxpbmtzLiAgKi8KKyAgICB9CisgICAgI2lmIGRlZmluZWQoIFNpemVRdWFudCApICYmICggU2l6ZVF1YW50ID4gMSApCisgICAgICAgIHNpemUgPSAoc2l6ZSArIChTaXplUXVhbnQgLSAxKSkgJiAofihTaXplUXVhbnQgLSAxKSk7CisgICAgI2VuZGlmCisKKyAgICBzaXplICs9IHNpemVvZihiaGVhZF90KTsgICAgIC8qIEFkZCBvdmVyaGVhZCBpbiBhbGxvY2F0ZWQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNpemUgcmVxdWlyZWQuICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICB1c2VfYmxpbmsgPSAoIHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfbGlmbyApOworCisgICAgLyogSWYgYSBjb21wYWN0IGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBpbiB0aGUgY2FsbCB0byBiZWN0bCgpLCB3cmFwCisgICAgICAgYSBsb29wIGFyb3VuZCB0aGUgYWxsb2NhdGlvbiBwcm9jZXNzICB0byAgYWxsb3cgIGNvbXBhY3Rpb24gIHRvCisgICAgICAgaW50ZXJ2ZW5lIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhIHN1aXRhYmxlIGJ1ZmZlciBpbiB0aGUgY2hhaW4uICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBiaW47CisKKyAgICAgICAgZm9yIChiaW4gPSBiZ2V0X2dldF9iaW4oIHNpemUgKTsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGIgPSAoIHVzZV9ibGluayA/IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rIDogdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbmsgKTsKKworICAgICAgICAgICAgaWYgKHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfYmVzdCkgeworICAgICAgICAgICAgICAgIGJlc3QgPSAmdGhyLT5mcmVlbGlzdFsgYmluIF07CisKKyAgICAgICAgICAgICAgICAvKiBTY2FuIHRoZSBmcmVlIGxpc3Qgc2VhcmNoaW5nIGZvciB0aGUgZmlyc3QgYnVmZmVyIGJpZyBlbm91Z2gKKyAgICAgICAgICAgICAgICAgICB0byBob2xkIHRoZSByZXF1ZXN0ZWQgc2l6ZSBidWZmZXIuICovCisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID49IChidWZzaXplKSBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJlc3QgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gYi0+cWwuYmxpbmsgOiBiLT5xbC5mbGluayApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiID0gYmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAgICAgaWYgKChidWZzaXplKSBiLT5iaC5iYi5ic2l6ZSA+PSAoYnVmc2l6ZSkgc2l6ZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciAgaXMgYmlnIGVub3VnaCB0byBzYXRpc2Z5ICB0aGUgcmVxdWVzdC4gIEFsbG9jYXRlIGl0CisgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjYWxsZXIuICBXZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoZSBidWZmZXIgaXMgIGxhcmdlCisgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCAgdG8gIHNwbGl0ICBpbnRvICB0aGUgcGFydCBnaXZlbiB0byB0aGUgY2FsbGVyIGFuZCBhCisgICAgICAgICAgICAgICAgICAgICAgIGZyZWUgYnVmZmVyIHRoYXQgcmVtYWlucyBvbiB0aGUgZnJlZSBsaXN0LCBvciAgd2hldGhlciAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSAgYnVmZmVyICBzaG91bGQgIGJlICByZW1vdmVkICBmcm9tIHRoZSBmcmVlIGxpc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIHRvIHRoZSBjYWxsZXIgaW4gaXRzIGVudGlyZXR5LiAgIFdlICBvbmx5ICBzcGxpdCAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpZiBlbm91Z2ggcm9vbSByZW1haW5zIGZvciBhIGhlYWRlciBwbHVzIHRoZSBtaW5pbXVtCisgICAgICAgICAgICAgICAgICAgICAgIHF1YW50dW0gb2YgYWxsb2NhdGlvbi4gKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoKGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemUpID4gKGJ1ZnNpemUpKFNpemVRICsgKHNpemVvZihiaGVhZF90KSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaGVhZF90ICpiYSwgKmJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBiYSA9IEJIKCgoY2hhciAqKSBiKSArIChiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBibiA9IEJIKCgoY2hhciAqKSBiYSkgKyBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChibi0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCBzaXplIGZyb20gbGVuZ3RoIG9mIGZyZWUgYmxvY2suICovCisgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSAoYnVmc2l6ZSkgc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluayBhbGxvY2F0ZWQgYnVmZmVyIHRvIHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQbHVnIG5lZ2F0aXZlIHNpemUgaW50byB1c2VyIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5ic2l6ZSA9IC1zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgVENXX1BUUihiYS0+YmIuYnRociwgdGgpOyAgIC8vIG5vdCBhbiBhbGxvY2F0ZWQgYWRkcmVzcyAoZG8gbm90IG1hcmsgaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIGJ1ZmZlciBhZnRlciB0aGlzIG9uZSBub3QgcHJlY2VkZWQgYnkgZnJlZSBibG9jay4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJuLT5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCwgYW5kIHJlaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBmcmVlbGlzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSAodm9pZCAqKSAoKCgoY2hhciAqKSBiYSkgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJoZWFkX3QgKmJhOworCisgICAgICAgICAgICAgICAgICAgICAgICBiYSA9IEJIKCgoY2hhciAqKSBiKSArIGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggdG8gc3BsaXQuICBHaXZlICB0aGUgIHdob2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGViYW5nIHRvIHRoZSBjYWxsZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3QpIGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZ2F0ZSBzaXplIHRvIG1hcmsgYnVmZmVyIGFsbG9jYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplID0gLShiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBUQ1dfUFRSKGJhLT5iYi5idGhyLCB0aCk7ICAgLy8gbm90IGFuIGFsbG9jYXRlZCBhZGRyZXNzIChkbyBub3QgbWFyayBpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFplcm8gdGhlIGJhY2sgcG9pbnRlciBpbiB0aGUgbmV4dCBidWZmZXIgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdXNlciBidWZmZXIgc3RhcnRpbmcgYXQgcXVldWUgbGlua3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSAgKHZvaWQgKikgJihiLT5xbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gYi0+cWwuYmxpbmsgOiBiLT5xbC5mbGluayApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZmFpbGVkIHRvIGZpbmQgYSBidWZmZXIuICBJZiB0aGVyZSdzIGEgY29tcGFjdCAgZnVuY3Rpb24KKyAgICAgICAgICAgZGVmaW5lZCwgIG5vdGlmeSAgaXQgIG9mIHRoZSBzaXplIHJlcXVlc3RlZC4gIElmIGl0IHJldHVybnMKKyAgICAgICAgICAgVFJVRSwgdHJ5IHRoZSBhbGxvY2F0aW9uIGFnYWluLiAqLworCisgICAgICAgIGlmICgodGhyLT5jb21wZmNuID09IDApIHx8ICghKCp0aHItPmNvbXBmY24pKHNpemUsICsrY29tcGFjdHNlcSkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIGJ1ZmZlciBhdmFpbGFibGUgd2l0aCByZXF1ZXN0ZWQgc2l6ZSBmcmVlLiAqLworCisgICAgLyogRG9uJ3QgZ2l2ZSB1cCB5ZXQgLS0gbG9vayBpbiB0aGUgcmVzZXJ2ZSBzdXBwbHkuICovCisKKyAgICBpZiAodGhyLT5hY3FmY24gIT0gMCkgeworICAgICAgICBpZiAoc2l6ZSA+IChidWZzaXplKSAodGhyLT5leHBfaW5jciAtIHNpemVvZihiaGVhZF90KSkpIHsKKworICAgICAgICAgICAgLyogUmVxdWVzdCAgaXMgIHRvbyAgbGFyZ2UgIHRvICBmaXQgaW4gYSBzaW5nbGUgZXhwYW5zaW9uCisgICAgICAgICAgICAgICBibG9jay4gIFRyeSB0byBzYXRpc3kgaXQgYnkgYSBkaXJlY3QgYnVmZmVyIGFjcXVpc2l0aW9uLiAqLworCisgICAgICAgICAgICBiZGhlYWRfdCAqYmRoOworCisgICAgICAgICAgICBzaXplICs9IHNpemVvZihiZGhlYWRfdCkgLSBzaXplb2YoYmhlYWRfdCk7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DKCAlZCApXG4iLCAoaW50KSBzaXplICkgKTsKKworICAgICAgICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgICAgICAgIGJkaCA9IEJESCgoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSkgc2l6ZSkpOworICAgICAgICAgICAgaWYgKGJkaCAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICAvKiAgTWFyayB0aGUgYnVmZmVyIHNwZWNpYWwgYnkgc2V0dGluZyB0aGUgc2l6ZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICBvZiBpdHMgaGVhZGVyIHRvIHplcm8uICAqLworICAgICAgICAgICAgICAgIGJkaC0+YmguYmIuYnNpemUgPSAwOworCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBUQ1dfUFRSKGJkaC0+YmguYmIuYnRociwgdGgpOyAgLy8gZG9uJ3QgbWFyayBidWZmZXIgYXMgYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGRpcmVjdCBidWZmZXIgbmV2ZXIgZ29lcyB0byBmcmVlIGxpc3QKKyAgICAgICAgICAgICAgICBiZGgtPmJoLmJiLnByZXZmcmVlID0gMDsKKyAgICAgICAgICAgICAgICBiZGgtPnRzaXplID0gc2l6ZTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgc2l6ZTsKKyAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyAgICAgICAgICAgICAgICB0aHItPm51bWRnZXQrKzsgICAgICAgLyogRGlyZWN0IGJnZXQoKSBjYWxsIGNvdW50ICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICBidWYgPSAgKHZvaWQgKikgKGJkaCArIDEpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLyogIFRyeSB0byBvYnRhaW4gYSBuZXcgZXhwYW5zaW9uIGJsb2NrICovCisKKyAgICAgICAgICAgIHZvaWQgKm5ld3Bvb2w7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DQiggJWQgKVxuIiwgKGludCkgdGhyLT5leHBfaW5jciApICk7CisKKyAgICAgICAgICAgIC8qIHJpY2hyeWFuICovCisgICAgICAgICAgICBuZXdwb29sID0gKCp0aHItPmFjcWZjbikoKGJ1ZnNpemUpIHRoci0+ZXhwX2luY3IpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpbmV3cG9vbCkgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgaWYgKG5ld3Bvb2wgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJwb29sKCB0aCwgbmV3cG9vbCwgdGhyLT5leHBfaW5jcik7CisgICAgICAgICAgICAgICAgYnVmID0gIGJnZXQoIHRoLCByZXF1ZXN0ZWRfc2l6ZSk7ICAvKiBUaGlzIGNhbid0LCBJIHNheSwgY2FuJ3QgZ2V0IGludG8gYSBsb29wLiAqLworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAgU3RpbGwgbm8gYnVmZmVyIGF2YWlsYWJsZSAqLworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qICBCR0VUWiAgLS0gIEFsbG9jYXRlIGEgYnVmZmVyIGFuZCBjbGVhciBpdHMgY29udGVudHMgdG8gemVyby4gIFdlIGNsZWFyCisgICAgICAgICAgICAgICB0aGUgIGVudGlyZSAgY29udGVudHMgIG9mICB0aGUgYnVmZmVyIHRvIHplcm8sIG5vdCBqdXN0IHRoZQorICAgICAgICAgICAgICAgcmVnaW9uIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLiAqLworCitzdGF0aWMgdm9pZCAqCitiZ2V0eiggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUgKQoreworICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIGJnZXQoIHRoLCBzaXplKTsKKworICAgIGlmIChidWYgIT0gTlVMTCkgeworICAgICAgICBiaGVhZF90ICpiOworICAgICAgICBidWZzaXplIHJzaXplOworCisgICAgICAgIGIgPSBCSChidWYgLSBzaXplb2YoYmhlYWRfdCkpOworICAgICAgICByc2l6ZSA9IC0oYi0+YmIuYnNpemUpOworICAgICAgICBpZiAocnNpemUgPT0gMCkgeworICAgICAgICAgICAgYmRoZWFkX3QgKmJkOworCisgICAgICAgICAgICBiZCA9IEJESChidWYgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgICAgIHJzaXplID0gYmQtPnRzaXplIC0gKGJ1ZnNpemUpIHNpemVvZihiZGhlYWRfdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByc2l6ZSAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHJzaXplID49IHNpemUpOworCisgICAgICAgICh2b2lkKSBtZW1zZXQoYnVmLCAwLCAoYnVmc2l6ZSkgcnNpemUpOworICAgIH0KKyAgICByZXR1cm4gKCh2b2lkICopIGJ1Zik7Cit9CisKKy8qICBCR0VUUiAgLS0gIFJlYWxsb2NhdGUgYSBidWZmZXIuICBUaGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgIHNpbXBseSBpbiB0ZXJtcyBvZiBicmVsKCkgIGFuZCAgYmdldCgpLiAgIEl0ICBjb3VsZCAgYmUKKyAgICAgICAgICAgICAgIGVuaGFuY2VkIHRvIGFsbG93IHRoZSBidWZmZXIgdG8gZ3JvdyBpbnRvIGFkamFjZW50IGZyZWUKKyAgICAgICAgICAgICAgIGJsb2NrcyBhbmQgdG8gYXZvaWQgbW92aW5nIGRhdGEgdW5uZWNlc3NhcmlseS4gICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXRyKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiwgYnVmc2l6ZSBzaXplKQoreworICAgIHZvaWQgKm5idWY7CisgICAgYnVmc2l6ZSBvc2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qIE9sZCBzaXplIG9mIGJ1ZmZlciAqLworICAgIGJoZWFkX3QgKmI7CisKKyAgICBuYnVmID0gYmdldCggdGgsIHNpemUgKTsKKyAgICBpZiAoIG5idWYgPT0gTlVMTCApIHsgLyogQWNxdWlyZSBuZXcgYnVmZmVyICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIGJ1ZiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gbmJ1ZjsKKyAgICB9CisgICAgYiA9IEJIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgICBvc2l6ZSA9IC1iLT5iYi5ic2l6ZTsKKyAgICBpZiAob3NpemUgPT0gMCkgeworICAgICAgICAvKiAgQnVmZmVyIGFjcXVpcmVkIGRpcmVjdGx5IHRocm91Z2ggYWNxZmNuLiAqLworICAgICAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICAgICAgYmQgPSBCREgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgb3NpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJkaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgICBvc2l6ZSAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgfTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQob3NpemUgPiAwKTsKKworICAgICh2b2lkKSBtZW1jcHkoKGNoYXIgKikgbmJ1ZiwgKGNoYXIgKikgYnVmLCAvKiBDb3B5IHRoZSBkYXRhICovCisgICAgICAgICAgICAgKHNpemVfdCkgKChzaXplIDwgb3NpemUpID8gc2l6ZSA6IG9zaXplKSk7CisgICAgYnJlbCggdGgsIGJ1ZiApOworCisgICAgcmV0dXJuIG5idWY7Cit9CisKKy8qICBCUkVMICAtLSAgUmVsZWFzZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCiticmVsKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiLCAqYm47CisgICAga21wX2luZm9fdCAqYnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA9PSAwKSB7ICAgICAgICAvKiBEaXJlY3RseS1hY3F1aXJlZCBidWZmZXI/ICovCisgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgYmRoID0gQkRIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgdGhyLT50b3RhbGxvYyAtPSAoc2l6ZV90KSBiZGgtPnRzaXplOworICAgICAgICB0aHItPm51bWRyZWwrKzsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAodm9pZCkgbWVtc2V0KChjaGFyICopIGJ1ZiwgMHg1NSwKKyAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJkaC0+dHNpemUgLSBzaXplb2YoYmRoZWFkX3QpKSk7CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGJkaCApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT5yZWxmY24gIT0gMCApOworICAgICAgICAoKnRoci0+cmVsZmNuKSgodm9pZCAqKSBiZGgpOyAgICAgIC8qIFJlbGVhc2UgaXQgZGlyZWN0bHkuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidGggPSAoa21wX2luZm9fdCAqKSggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsgYmVmb3JlIGNvbXBhcmlzb24KKyAgICBpZiAoIGJ0aCAhPSB0aCApIHsKKyAgICAgICAgLyogQWRkIHRoaXMgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgdGhyZWFkIGxhdGVyICovCisgICAgICAgIF9fa21wX2JnZXRfZW5xdWV1ZSggYnRoLCBidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApCisjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEJ1ZmZlciBzaXplIG11c3QgYmUgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgYWxsb2NhdGVkLiAqLworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID49IDApIHsKKyAgICAgICAgYm4gPSBOVUxMOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiAgQmFjayBwb2ludGVyIGluIG5leHQgYnVmZmVyIG11c3QgYmUgemVybywgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgc2FtZSB0aGluZzogKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiAtIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gMCk7CisKKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJyZWwoKSBjYWxscyAqLworICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBiYWNrIGxpbmsgaXMgbm9uemVybywgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgKi8KKworICAgIGlmIChiLT5iaC5iYi5wcmV2ZnJlZSAhPSAwKSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXMgZnJlZS4gIENvbnNvbGlkYXRlIHRoaXMgYnVmZmVyICB3aXRoICBpdAorICAgICAgICAgICBieSAgYWRkaW5nICB0aGUgIGxlbmd0aCAgb2YgIHRoaXMgIGJ1ZmZlciAgdG8gdGhlIHByZXZpb3VzIGZyZWUKKyAgICAgICAgICAgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIHN1YnRyYWN0IHRoZSBzaXplICBpbiAgdGhlICBidWZmZXIgIGJlaW5nCisgICAgICAgICAgIHJlbGVhc2VkLCAgc2luY2UgIGl0J3MgIG5lZ2F0aXZlIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcworICAgICAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICAgICAgcmVnaXN0ZXIgYnVmc2l6ZSBzaXplID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgYnVmZmVyIHRoZSBvbmUgd2UncmUgd29ya2luZyBvbi4gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIucHJldmZyZWUpLT5iYi5ic2l6ZSA9PSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpIC0gYi0+YmguYmIucHJldmZyZWUpOworICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSBzaXplOworCisgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgcHJldmlvdXMgYnVmZmVyIGlzbid0IGFsbG9jYXRlZC4gIE1hcmsgdGhpcyBidWZmZXIKKyAgICAgICAgICAgc2l6ZSBhcyBwb3NpdGl2ZSAoaS5lLiBmcmVlKSBhbmQgZmFsbCB0aHJvdWdodCB0byBwbGFjZQorICAgICAgICAgICB0aGUgYnVmZmVyIG9uIHRoZSBmcmVlIGxpc3QgYXMgYW4gaXNvbGF0ZWQgZnJlZSBibG9jay4gKi8KKworICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9IC1iLT5iaC5iYi5ic2l6ZTsKKyAgICB9CisKKyAgICAvKiBpbnNlcnQgYnVmZmVyIGJhY2sgb250byBhIG5ldyBmcmVlbGlzdCAqLworICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisKKyAgICAvKiBOb3cgd2UgbG9vayBhdCB0aGUgbmV4dCBidWZmZXIgaW4gbWVtb3J5LCBsb2NhdGVkIGJ5IGFkdmFuY2luZyBmcm9tCisgICAgICAgdGhlICBzdGFydCAgb2YgIHRoaXMgIGJ1ZmZlciAgYnkgaXRzIHNpemUsIHRvIHNlZSBpZiB0aGF0IGJ1ZmZlciBpcworICAgICAgIGZyZWUuICBJZiBpdCBpcywgd2UgY29tYmluZSAgdGhpcyAgYnVmZmVyICB3aXRoICB0aGUgIG5leHQgIG9uZSAgaW4KKyAgICAgICBtZW1vcnksIGRlY2hhaW5pbmcgdGhlIHNlY29uZCBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0LiAqLworCisgICAgYm4gPSAgQkZIKCgoY2hhciAqKSBiKSArIGItPmJoLmJiLmJzaXplKTsKKyAgICBpZiAoYm4tPmJoLmJiLmJzaXplID4gMCkgeworCisgICAgICAgIC8qIFRoZSBidWZmZXIgaXMgZnJlZS4gIFJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QgYW5kIGFkZAorICAgICAgICAgICBpdHMgc2l6ZSB0byB0aGF0IG9mIG91ciBidWZmZXIuICovCisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBibiArIGJuLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGJuLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYm4gKTsKKworICAgICAgICBiLT5iaC5iYi5ic2l6ZSArPSBibi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaXQgaW50byB0aGUgbmV3IGZyZWVsaXN0ICovCisKKyAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKworICAgICAgICAvKiBGaW5hbGx5LCAgYWR2YW5jZSAgdG8gICB0aGUgIGJ1ZmZlciAgdGhhdCAgIGZvbGxvd3MgIHRoZSAgbmV3bHkKKyAgICAgICAgICAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBtdXN0IHNldCBpdHMgIGJhY2twb2ludGVyICB0byAgdGhlCisgICAgICAgICAgIGhlYWQgIG9mICB0aGUgIGNvbnNvbGlkYXRlZCBmcmVlIGJsb2NrLiAgV2Uga25vdyB0aGUgbmV4dCBibG9jaworICAgICAgICAgICBtdXN0IGJlIGFuIGFsbG9jYXRlZCBibG9jayBiZWNhdXNlIHRoZSBwcm9jZXNzIG9mIHJlY29tYmluYXRpb24KKyAgICAgICAgICAgZ3VhcmFudGVlcyAgdGhhdCAgdHdvICBmcmVlICBibG9ja3Mgd2lsbCBuZXZlciBiZSBjb250aWd1b3VzIGluCisgICAgICAgICAgIG1lbW9yeS4gICovCisKKyAgICAgICAgYm4gPSBCRkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworICAgIH0KKyNpZmRlZiBGcmVlV2lwZQorICAgICh2b2lkKSBtZW1zZXQoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgIChzaXplX3QpIChiLT5iaC5iYi5ic2l6ZSAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoYm4tPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiBUaGUgbmV4dCBidWZmZXIgaXMgYWxsb2NhdGVkLiAgU2V0IHRoZSBiYWNrcG9pbnRlciBpbiBpdCAgdG8gIHBvaW50CisgICAgICAgdG8gdGhpcyBidWZmZXI7IHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlciBpbiBtZW1vcnkuICovCisKKyAgICBibi0+YmguYmIucHJldmZyZWUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgIC8qICBJZiAgYSAgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlcgorICAgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgICBpcyAgZGVmaW5lZCAgaW4gIHN1Y2ggYSB3YXkgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbAorICAgICAgICBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgICBpZiAodGhyLT5yZWxmY24gIT0gMCAmJgorICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9PSAoYnVmc2l6ZSkodGhyLT5wb29sX2xlbiAtIHNpemVvZihiaGVhZF90KSkpCisgICAgeworI2lmIEJ1ZlN0YXRzCisgICAgICAgIGlmICh0aHItPm51bXBibGsgIT0gMSkgeyAgICAgICAgLyogRG8gbm90IHJlbGVhc2UgdGhlIGxhc3QgYnVmZmVyIHVudGlsIGZpbmFsaXphdGlvbiB0aW1lICovCisjZW5kaWYKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgIC8qICBVbmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QgICovCisgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgRlJFRSggJXAgKVxuIiwgKHZvaWQgKikgYiApICk7CisKKyAgICAgICAgICAgICgqdGhyLT5yZWxmY24pKGIpOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgICAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5udW1wYmxrID09IHRoci0+bnVtcGdldCAtIHRoci0+bnVtcHJlbCk7CisKKyAgICAgICAgICAgIC8qIGF2b2lkIGxlYXZpbmcgc3RhbGUgbGFzdF9wb29sIHBvaW50ZXIgYXJvdW5kIGlmIGl0IGlzIGJlaW5nIGRlYWxsb2NlZCAqLworICAgICAgICAgICAgaWYgKHRoci0+bGFzdF9wb29sID09IGIpIHRoci0+bGFzdF9wb29sID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoci0+bGFzdF9wb29sID0gYjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisgICAgfQorfQorCisvKiAgQkVDVEwgIC0tICBFc3RhYmxpc2ggYXV0b21hdGljIHBvb2wgZXhwYW5zaW9uIGNvbnRyb2wgICovCisKK3N0YXRpYyB2b2lkCitiZWN0bCggIGttcF9pbmZvX3QgKnRoLCBiZ2V0X2NvbXBhY3RfdCBjb21wYWN0LCBiZ2V0X2FjcXVpcmVfdCBhY3F1aXJlLCBiZ2V0X3JlbGVhc2VfdCByZWxlYXNlLCBidWZzaXplIHBvb2xfaW5jcikKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICB0aHItPmNvbXBmY24gPSBjb21wYWN0OworICAgIHRoci0+YWNxZmNuID0gYWNxdWlyZTsKKyAgICB0aHItPnJlbGZjbiA9IHJlbGVhc2U7CisgICAgdGhyLT5leHBfaW5jciA9IHBvb2xfaW5jcjsKK30KKworLyogIEJQT09MICAtLSAgQWRkIGEgcmVnaW9uIG9mIG1lbW9yeSB0byB0aGUgYnVmZmVyIHBvb2wuICAqLworCitzdGF0aWMgdm9pZAorYnBvb2woICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIGxlbikKK3sKKy8qICAgIGludCBiaW4gPSAwOyAqLworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBiZmhlYWRfdCAqYiA9IEJGSChidWYpOworICAgIGJoZWFkX3QgKmJuOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyNpZmRlZiBTaXplUXVhbnQKKyAgICBsZW4gJj0gfihTaXplUXVhbnQgLSAxKTsKKyNlbmRpZgorICAgIGlmICh0aHItPnBvb2xfbGVuID09IDApIHsKKyAgICAgICAgdGhyLT5wb29sX2xlbiA9IGxlbjsKKyAgICB9IGVsc2UgaWYgKGxlbiAhPSB0aHItPnBvb2xfbGVuKSB7CisgICAgICAgIHRoci0+cG9vbF9sZW4gPSAtMTsKKyAgICB9CisjaWYgQnVmU3RhdHMKKyAgICB0aHItPm51bXBnZXQrKzsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrIGFjcXVpc2l0aW9ucyAqLworICAgIHRoci0+bnVtcGJsaysrOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIHRvdGFsICovCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogU2luY2UgdGhlIGJsb2NrIGlzIGluaXRpYWxseSBvY2N1cGllZCBieSBhIHNpbmdsZSBmcmVlICBidWZmZXIsCisgICAgICAgaXQgIGhhZCAgYmV0dGVyICBub3QgIGJlICAobXVjaCkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgYnVmZmVyCisgICAgICAgd2hvc2Ugc2l6ZSB3ZSBjYW4gc3RvcmUgaW4gYmhlYWQuYmIuYnNpemUuICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGxlbiAtIHNpemVvZihiaGVhZF90KSA8PSAtKChidWZzaXplKSBFU2VudCArIDEpKTsKKworICAgIC8qIENsZWFyICB0aGUgIGJhY2twb2ludGVyIGF0ICB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIHRvIGluZGljYXRlIHRoYXQKKyAgICAgICB0aGVyZSAgaXMgIG5vICBmcmVlICBibG9jayAgcHJpb3IgIHRvICB0aGlzICAgb25lLiAgICBUaGF0ICAgYmxvY2tzCisgICAgICAgcmVjb21iaW5hdGlvbiB3aGVuIHRoZSBmaXJzdCBibG9jayBpbiBtZW1vcnkgaXMgcmVsZWFzZWQuICovCisKKyAgICBiLT5iaC5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYSBkdW1teSBhbGxvY2F0ZWQgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBvb2wuICBUaGlzIGR1bW15CisgICAgICAgYnVmZmVyIGlzIHNlZW4gd2hlbiBhIGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBwb29sIGlzIHJlbGVhc2VkIGFuZAorICAgICAgIGJsb2NrcyAgcmVjb21iaW5hdGlvbiAgb2YgIHRoZSBsYXN0IGJ1ZmZlciB3aXRoIHRoZSBkdW1teSBidWZmZXIgYXQKKyAgICAgICB0aGUgZW5kLiAgVGhlIGxlbmd0aCBpbiB0aGUgZHVtbXkgYnVmZmVyICBpcyAgc2V0ICB0byAgdGhlICBsYXJnZXN0CisgICAgICAgbmVnYXRpdmUgIG51bWJlciAgdG8gIGRlbm90ZSAgdGhlICBlbmQgIG9mICB0aGUgcG9vbCBmb3IgZGlhZ25vc3RpYworICAgICAgIHJvdXRpbmVzICh0aGlzIHNwZWNpZmljIHZhbHVlIGlzICBub3QgIGNvdW50ZWQgIG9uICBieSAgdGhlICBhY3R1YWwKKyAgICAgICBhbGxvY2F0aW9uIGFuZCByZWxlYXNlIGZ1bmN0aW9ucykuICovCisKKyAgICBsZW4gLT0gc2l6ZW9mKGJoZWFkX3QpOworICAgIGItPmJoLmJiLmJzaXplID0gKGJ1ZnNpemUpIGxlbjsKKyAgICAvKiBTZXQgdGhlIG93bmVyIG9mIHRoaXMgYnVmZmVyICovCisgICAgVENXX1BUUiggYi0+YmguYmIuYnRociwgKGttcF9pbmZvX3QqKSgoa21wX3VpbnRwdHJfdCl0aCB8IDEpICk7IC8vIG1hcmsgdGhlIGJ1ZmZlciBhcyBhbGxvY2F0ZWQgYWRkcmVzcworCisgICAgLyogQ2hhaW4gdGhlIG5ldyBibG9jayB0byB0aGUgZnJlZSBsaXN0LiAqLworICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisjaWZkZWYgRnJlZVdpcGUKKyAgICAodm9pZCkgbWVtc2V0KCgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCksIDB4NTUsCisgICAgICAgICAgICAgKHNpemVfdCkgKGxlbiAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICAgIGJuID0gQkgoKChjaGFyICopIGIpICsgbGVuKTsKKyAgICBibi0+YmIucHJldmZyZWUgPSAoYnVmc2l6ZSkgbGVuOworICAgIC8qIERlZmluaXRpb24gb2YgRVNlbnQgYXNzdW1lcyB0d28ncyBjb21wbGVtZW50ISAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoICh+MCkgPT0gLTEgJiYgKGJuICE9IDApICk7CisKKyAgICBibi0+YmIuYnNpemUgPSBFU2VudDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBCRlJFRUQgIC0tICBEdW1wIHRoZSBmcmVlIGxpc3RzIGZvciB0aGlzIHRocmVhZC4gKi8KKworc3RhdGljIHZvaWQKK2JmcmVlZCggIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgYmluID0gMCwgY291bnQgPSAwOworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKTsKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyNpZiBCdWZTdGF0cworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgdG90YWw9JSIgS01QX1VJTlQ2NF9TUEVDICIgZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgcmVsPSUiIFwKKyAgICAgICAgICAgS01QX0lOVDY0X1NQRUMgIiBwYmxrPSUiIEtNUF9JTlQ2NF9TUEVDICIgcGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIHByZWw9JSIgS01QX0lOVDY0X1NQRUMgXAorICAgICAgICAgICAiIGRnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiBkcmVsPSUiIEtNUF9JTlQ2NF9TUEVDICJcbiIsCisgICAgICAgICAgIGd0aWQsIChrbXBfdWludDY0KSB0aHItPnRvdGFsbG9jLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bWdldCwgIChrbXBfaW50NjQpIHRoci0+bnVtcmVsLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bXBibGssCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtcGdldCwgKGttcF9pbnQ2NCkgdGhyLT5udW1wcmVsLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bWRnZXQsIChrbXBfaW50NjQpIHRoci0+bnVtZHJlbCApOworI2VuZGlmCisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiOworCisgICAgICAgIGZvciAoYiA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rOyBiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsgYiA9IGItPnFsLmZsaW5rKSB7CisgICAgICAgICAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmJsaW5rLT5xbC5mbGluayA9PSBiICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5xbC5mbGluay0+cWwuYmxpbmsgPT0gYiApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYnMgPiAwICk7CisKKyAgICAgICAgICAgIGNvdW50ICs9IDE7CisKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgRnJlZSBibG9jazogMHglcCBzaXplICU2bGQgYnl0ZXMuXG4iLCBndGlkLCBiLCAobG9uZykgYnMgKTsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKmxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8IChtZW1jbXAobGVyciwgbGVyciArIDEsIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJfX2ttcF9wcmludHBvb2w6IFQjJWQgICAgIChDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIsIGd0aWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiX19rbXBfcHJpbnRwb29sOiBUIyVkIE5vIGZyZWUgYmxvY2tzXG4iLCBndGlkICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX0RFQlVHCisKKyNpZiBCdWZTdGF0cworCisvKiAgQlNUQVRTICAtLSAgUmV0dXJuIGJ1ZmZlciBhbGxvY2F0aW9uIGZyZWUgc3BhY2Ugc3RhdGlzdGljcy4gICovCisKK3N0YXRpYyB2b2lkCitic3RhdHMoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqY3VyYWxsb2MsICBidWZzaXplICp0b3RmcmVlLCAgYnVmc2l6ZSAqbWF4ZnJlZSwgbG9uZyAqbmdldCwgbG9uZyAqbnJlbCkKK3sKKyAgICBpbnQgYmluID0gMDsKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICAqbmdldCA9IHRoci0+bnVtZ2V0OworICAgICpucmVsID0gdGhyLT5udW1yZWw7CisgICAgKmN1cmFsbG9jID0gKGJ1ZnNpemUpIHRoci0+dG90YWxsb2M7CisgICAgKnRvdGZyZWUgPSAwOworICAgICptYXhmcmVlID0gLTE7CisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7CisKKyAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplID4gMCk7CisgICAgICAgICAgICAqdG90ZnJlZSArPSBiLT5iaC5iYi5ic2l6ZTsKKyAgICAgICAgICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA+ICptYXhmcmVlKSB7CisgICAgICAgICAgICAgICAgKm1heGZyZWUgPSBiLT5iaC5iYi5ic2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgfQorICAgIH0KK30KKworLyogIEJTVEFUU0UgIC0tICBSZXR1cm4gZXh0ZW5kZWQgc3RhdGlzdGljcyAgKi8KKworc3RhdGljIHZvaWQKK2JzdGF0c2UoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqcG9vbF9pbmNyLCBsb25nICpucG9vbCwgbG9uZyAqbnBnZXQsIGxvbmcgKm5wcmVsLCBsb25nICpuZGdldCwgbG9uZyAqbmRyZWwpCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgKnBvb2xfaW5jciA9ICh0aHItPnBvb2xfbGVuIDwgMCkgPyAtdGhyLT5leHBfaW5jciA6IHRoci0+ZXhwX2luY3I7CisgICAgKm5wb29sID0gdGhyLT5udW1wYmxrOworICAgICpucGdldCA9IHRoci0+bnVtcGdldDsKKyAgICAqbnByZWwgPSB0aHItPm51bXByZWw7CisgICAgKm5kZ2V0ID0gdGhyLT5udW1kZ2V0OworICAgICpuZHJlbCA9IHRoci0+bnVtZHJlbDsKK30KKworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKy8qICBCVUZEVU1QICAtLSAgRHVtcCB0aGUgZGF0YSBpbiBhIGJ1ZmZlci4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlICB1c2VyCisgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRlciwgYW5kIGJhY2tzIHVwIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgSXQgd2lsbAorICAgICAgICAgICAgICAgICBkdW1wIGVpdGhlciBhIGZyZWUgYmxvY2sgb3IgYW4gYWxsb2NhdGVkIG9uZS4gICovCisKK3N0YXRpYyB2b2lkCitidWZkdW1wKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgYmZoZWFkX3QgKmI7CisgICAgdW5zaWduZWQgY2hhciAqYmR1bXA7CisgICAgYnVmc2l6ZSBiZGxlbjsKKworICAgIGIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgaWYgKGItPmJoLmJiLmJzaXplIDwgMCkgeworICAgICAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKyAgICAgICAgYmRsZW4gPSAoLWItPmJoLmJiLmJzaXplKSAtIChidWZzaXplKSBzaXplb2YoYmhlYWRfdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmR1bXAgPSAodW5zaWduZWQgY2hhciAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSk7CisgICAgICAgIGJkbGVuID0gYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICB9CisKKyAgICB3aGlsZSAoYmRsZW4gPiAwKSB7CisgICAgICAgIGludCBpLCBkdXBlcyA9IDA7CisgICAgICAgIGJ1ZnNpemUgbCA9IGJkbGVuOworICAgICAgICBjaGFyIGJoZXhbNTBdLCBiYXNjaWlbMjBdOworCisgICAgICAgIGlmIChsID4gMTYpIHsKKyAgICAgICAgICAgIGwgPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGJoZXggKyBpICogMywgIiUwMlggIiwgYmR1bXBbaV0pOworICAgICAgICAgICAgaWYgKGJkdW1wW2ldID4gMHgyMCAmJiBiZHVtcFtpXSA8IDB4N0YpCisgICAgICAgICAgICAgICAgYmFzY2lpWyBpIF0gPSBiZHVtcFsgaSBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJhc2NpaVsgaSBdID0gJyAnOworICAgICAgICB9CisgICAgICAgIGJhc2NpaVtpXSA9IDA7CisgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiJS00OHMgICAlc1xuIiwgYmhleCwgYmFzY2lpKTsKKyAgICAgICAgYmR1bXAgKz0gbDsKKyAgICAgICAgYmRsZW4gLT0gbDsKKyAgICAgICAgd2hpbGUgKChiZGxlbiA+IDE2KSAmJiAobWVtY21wKChjaGFyICopIChiZHVtcCAtIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGJkdW1wLCAxNikgPT0gMCkpIHsKKyAgICAgICAgICAgIGR1cGVzKys7CisgICAgICAgICAgICBiZHVtcCArPSAxNjsKKyAgICAgICAgICAgIGJkbGVuIC09IDE2OworICAgICAgICB9CisgICAgICAgIGlmIChkdXBlcyA+IDEpIHsKKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAiICAgICAoJWQgbGluZXMgWyVkIGJ5dGVzXSBpZGVudGljYWwgdG8gYWJvdmUgbGluZSBza2lwcGVkKVxuIiwKKyAgICAgICAgICAgICAgICBkdXBlcywgZHVwZXMgKiAxNik7CisgICAgICAgIH0gZWxzZSBpZiAoZHVwZXMgPT0gMSkgeworICAgICAgICAgICAgYmR1bXAgLT0gMTY7CisgICAgICAgICAgICBiZGxlbiArPSAxNjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogIEJQT09MRCAgLS0gIER1bXAgYSBidWZmZXIgcG9vbC4gIFRoZSBidWZmZXIgaGVhZGVycyBhcmUgYWx3YXlzIGxpc3RlZC4KKyAgICAgICAgICAgICAgICBJZiBEVU1QQUxMT0MgaXMgbm9uemVybywgdGhlIGNvbnRlbnRzIG9mIGFsbG9jYXRlZCBidWZmZXJzCisgICAgICAgICAgICAgICAgYXJlICBkdW1wZWQuICAgSWYgIERVTVBGUkVFICBpcyAgbm9uemVybywgIGZyZWUgYmxvY2tzIGFyZQorICAgICAgICAgICAgICAgIGR1bXBlZCBhcyB3ZWxsLiAgSWYgRnJlZVdpcGUgIGNoZWNraW5nICBpcyAgZW5hYmxlZCwgIGZyZWUKKyAgICAgICAgICAgICAgICBibG9ja3MgIHdoaWNoICBoYXZlICBiZWVuIGNsb2JiZXJlZCB3aWxsIGFsd2F5cyBiZSBkdW1wZWQuICovCisKK3N0YXRpYyB2b2lkCiticG9vbGQoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBpbnQgZHVtcGFsbG9jLCBpbnQgZHVtcGZyZWUpCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoIChjaGFyKilidWYgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgd2hpbGUgKGItPmJoLmJiLmJzaXplICE9IEVTZW50KSB7CisgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICBpZiAoYnMgPCAwKSB7CisgICAgICAgICAgICBicyA9IC1iczsKKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiQWxsb2NhdGVkIGJ1ZmZlcjogc2l6ZSAlNmxkIGJ5dGVzLlxuIiwgKGxvbmcpIGJzKTsKKyAgICAgICAgICAgIGlmIChkdW1wYWxsb2MpIHsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqbGVyciA9ICIiOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJzID4gMCk7CisgICAgICAgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICAgICAgICAgbGVyciA9ICIgIChCYWQgZnJlZSBsaXN0IGxpbmtzKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soIkZyZWUgYmxvY2s6ICAgICAgIHNpemUgJTZsZCBieXRlcy4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZykgYnMsIGxlcnIpOworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICBsZXJyID0gKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8CisgICAgICAgICAgICAgICAgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwKKyAgICAgICAgICAgICAgICAgIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgICAgICAgICAgICIoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iKTsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChkdW1wZnJlZSkgeworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYiA9IEJGSCgoKGNoYXIgKikgYikgKyBicyk7CisgICAgfQorfQorCisvKiAgQlBPT0xWICAtLSAgVmFsaWRhdGUgYSBidWZmZXIgcG9vbC4gKi8KKworc3RhdGljIGludAorYnBvb2x2KCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoYnVmKTsKKworICAgIHdoaWxlIChiLT5iaC5iYi5ic2l6ZSAhPSBFU2VudCkgeworICAgICAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgaWYgKGJzIDwgMCkgeworICAgICAgICAgICAgYnMgPSAtYnM7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGNoYXIgKmxlcnIgPSAiIjsKKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJzID4gMCk7CisgICAgICAgICAgICBpZiAoYnMgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChiLT5xbC5ibGluay0+cWwuZmxpbmsgIT0gYikgfHwgKGItPnFsLmZsaW5rLT5xbC5ibGluayAhPSBiKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogc2l6ZSAlNmxkIGJ5dGVzLiAgKEJhZCBmcmVlIGxpc3QgbGlua3MpXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGJzKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICBsZXJyID0gKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8CisgICAgICAgICAgICAgICAgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwKKyAgICAgICAgICAgICAgICAgIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgICAgICAgICAgICIoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iKTsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKyAgICAgICAgfQorICAgICAgICBiID0gQkZIKCgoY2hhciAqKSBiKSArIGJzKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2luaXRpYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIFNpemVRdWFudCA+PSBzaXplb2YoIHZvaWQgKiApICYmICh0aCAhPSAwKSApOworCisgICAgc2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgYmVjdGwoIHRoLCAoYmdldF9jb21wYWN0X3QpIDAsIChiZ2V0X2FjcXVpcmVfdCkgbWFsbG9jLCAoYmdldF9yZWxlYXNlX3QpIGZyZWUsCisgICAgICAgICAgIChidWZzaXplKSBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICk7Cit9CisKK3ZvaWQKK19fa21wX2ZpbmFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHI7CisgICAgYmZoZWFkX3QgKmI7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSAwICk7CisKKyNpZiBCdWZTdGF0cworICAgIHRociA9ICh0aHJfZGF0YV90ICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyICE9IE5VTEwgKTsKKyAgICBiID0gdGhyLT5sYXN0X3Bvb2w7CisKKyAgICAvKiAgSWYgIGEgIGJsb2NrLXJlbGVhc2UgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoaXMgZnJlZSBidWZmZXIKKyAgICAgICAgY29uc3RpdHV0ZXMgdGhlIGVudGlyZSBibG9jaywgcmVsZWFzZSBpdC4gIE5vdGUgdGhhdCAgcG9vbF9sZW4KKyAgICAgICAgaXMgIGRlZmluZWQgIGluICBzdWNoIGEgd2F5IHRoYXQgdGhlIHRlc3Qgd2lsbCBmYWlsIHVubGVzcyBhbGwKKyAgICAgICAgcG9vbCBibG9ja3MgYXJlIHRoZSBzYW1lIHNpemUuICAqLworCisgICAgLyogRGVhbGxvY2F0ZSB0aGUgbGFzdCBwb29sIGlmIG9uZSBleGlzdHMgYmVjYXVzZSB3ZSBubyBsb25nZXIgZG8gaXQgaW4gYnJlbCgpICovCisgICAgaWYgKHRoci0+cmVsZmNuICE9IDAgJiYgYiAhPSAwICYmIHRoci0+bnVtcGJsayAhPSAwICYmCisgICAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkKKyAgICB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAvKiAgVW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0ICAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKSBiICkgKTsKKworICAgICAgICAoKnRoci0+cmVsZmNuKShiKTsKKyAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgICAgICAgICAgLyogTnIgb2YgZXhwYW5zaW9uIGJsb2NrIHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKyAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAgIC8qIERlYWxsb2NhdGUgYmdldF9kYXRhICovCisgICAgaWYgKCB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgKTsKKyAgICAgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9IE5VTEw7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAora21wY19zZXRfcG9vbHNpemUoIHNpemVfdCBzaXplICkKK3sKKyAgICBiZWN0bCggX19rbXBfZ2V0X3RocmVhZCgpLCAoYmdldF9jb21wYWN0X3QpIDAsIChiZ2V0X2FjcXVpcmVfdCkgbWFsbG9jLAorICAgICAgICAgICAoYmdldF9yZWxlYXNlX3QpIGZyZWUsIChidWZzaXplKSBzaXplICk7Cit9CisKK3NpemVfdAora21wY19nZXRfcG9vbHNpemUoIHZvaWQgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBwID0gZ2V0X3Rocl9kYXRhKCBfX2ttcF9nZXRfdGhyZWFkKCkgKTsKKworICAgIHJldHVybiBwLT5leHBfaW5jcjsKK30KKwordm9pZAora21wY19zZXRfcG9vbG1vZGUoIGludCBtb2RlICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgaWYgKG1vZGUgPT0gYmdldF9tb2RlX2ZpZm8gfHwgbW9kZSA9PSBiZ2V0X21vZGVfbGlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworICAgICAgICBwLT5tb2RlID0gKGJnZXRfbW9kZV90KSBtb2RlOworICAgIH0KK30KKworaW50CitrbXBjX2dldF9wb29sbW9kZSggdm9pZCApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworCisgICAgcmV0dXJuIHAtPm1vZGU7Cit9CisKK3ZvaWQKK2ttcGNfZ2V0X3Bvb2xzdGF0KCBzaXplX3QgKm1heG1lbSwgc2l6ZV90ICphbGxtZW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworICAgIGJ1ZnNpemUgYSwgYjsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgICAgYmNoZWNrKCB0aCwgJmEsICZiICk7CisKKyAgICAqbWF4bWVtID0gYTsKKyAgICAqYWxsbWVtID0gYjsKK30KKwordm9pZAora21wY19wb29scHJpbnQoIHZvaWQgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBiZnJlZWQoIHRoICk7Cit9CisKKyNlbmRpZiAvLyAjaWYgS01QX1VTRV9CR0VUCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK2ttcGNfbWFsbG9jKCBzaXplX3Qgc2l6ZSApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICAgICAgcHRyID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKSBzaXplICk7CisKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK2ttcGNfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgICAgIHB0ciA9IGJnZXR6KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIChuZWxlbSAqIGVsc2l6ZSkgKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgora21wY19yZWFsbG9jKCB2b2lkICogcHRyLCBzaXplX3Qgc2l6ZSApCit7CisgICAgdm9pZCAqIHJlc3VsdCA9IE5VTEw7CisKKyAgICAgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIElmIHBvaW50ZXIgaXMgTlVMTCwgcmVhbGxvYyBiZWhhdmVzIGxpa2UgbWFsbG9jLgorICAgICAgICAgICAgcmVzdWx0ID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKSBzaXplICk7CisgICAgICAgIH0gZWxzZSBpZiAoIHNpemUgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIElmIHNpemUgaXMgMCwgcmVhbGxvYyBiZWhhdmVzIGxpa2UgZnJlZS4KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHRoZSBjYWxsIHRvIGttcGNfbWFsbG9jKCkgb3Iga21wY19jYWxsb2MoKSBiZWZvcmUuCisgICAgICAgICAgICAvLyBTbyBpdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIF9fa21wX2dldF90aHJlYWQoKSwgbm90IF9fa21wX2VudHJ5X3RocmVhZCgpLgorICAgICAgICAgICAgYnJlbCggX19rbXBfZ2V0X3RocmVhZCgpLCBwdHIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJnZXRyKCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgcHRyLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogTk9URTogdGhlIGxpYnJhcnkgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBieSBhIHByZXZpb3VzIGFsbG9jYXRlICovCisKK3ZvaWQKK2ttcGNfZnJlZSggdm9pZCAqIHB0ciApCit7CisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgICAgICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGJyZWwoIHRoLCBwdHIgKTsKKyAgICB9OworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK19fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9tYWxsb2MoICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0KCB0aCwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9tYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9jYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9jYWxsb2MoICVwLCAlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIChpbnQpIG5lbGVtLAorICAgICAgICAoaW50KSBlbHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gYmdldHooIHRoLCAoYnVmc2l6ZSkgKG5lbGVtICogZWxzaXplKSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX2NhbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX3JlYWxsb2MoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX3JlYWxsb2MoICVwLCAlcCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIHB0ciwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0ciggdGgsIHB0ciwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkCitfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfZnJlZSggJXAsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgICAgICAgICBicmVsKCB0aCwgcHRyICk7CisgICAgfQorICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX2ZyZWUoKVxuIiApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICAgIElmIExFQUtfTUVNT1JZIGlzIGRlZmluZWQsIF9fa21wX2ZyZWUoKSB3aWxsICpub3QqIGZyZWUgbWVtb3J5LiBJdCBjYXVzZXMgbWVtb3J5IGxlYWtzLCBidXQgaXQKKyAgICBtYXkgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWVtb3J5IGNvcnJ1cHRpb25zLCB1c2VkIGZyZWVkIHBvaW50ZXJzLCBldGMuCisqLworLyogI2RlZmluZSBMRUFLX01FTU9SWSAqLworCitzdHJ1Y3Qga21wX21lbV9kZXNjciB7ICAgICAgLy8gTWVtb3J5IGJsb2NrIGRlc2NyaXB0b3IuCisgICAgdm9pZCAqIHB0cl9hbGxvY2F0ZWQ7ICAgLy8gUG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKSwgc3ViamVjdCBmb3IgZnJlZSgpLgorICAgIHNpemVfdCBzaXplX2FsbG9jYXRlZDsgIC8vIFNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jay4KKyAgICB2b2lkICogcHRyX2FsaWduZWQ7ICAgICAvLyBQb2ludGVyIHRvIGFsaWduZWQgbWVtb3J5LCB0byBiZSB1c2VkIGJ5IGNsaWVudCBjb2RlLgorICAgIHNpemVfdCBzaXplX2FsaWduZWQ7ICAgIC8vIFNpemUgb2YgYWxpZ25lZCBtZW1vcnkgYmxvY2suCit9OwordHlwZWRlZiBzdHJ1Y3Qga21wX21lbV9kZXNjciBrbXBfbWVtX2Rlc2NyX3Q7CisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIHJlcXVlc3RlZCBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCitzdGF0aWMKK3ZvaWQgKgorX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICAvKgorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoKSBhbGxvY2F0ZXMgKGJ5IGNhbGwgdG8gbWFsbG9jKCkpIGJpZ2dlciBtZW1vcnkgYmxvY2sgdGhhbiByZXF1ZXN0ZWQgdG8KKyAgICAgICAgcmV0dXJuIHByb3Blcmx5IGFsaWduZWQgcG9pbnRlci4gT3JpZ2luYWwgcG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKSBhbmQgc2l6ZSBvZiBhbGxvY2F0ZWQKKyAgICAgICAgYmxvY2sgaXMgc2F2ZWQgaW4gZGVzY3JpcHRvciBqdXN0IGJlZm9yZSB0aGUgYWxpZ25lZCBwb2ludGVyLiBUaGlzIGluZm9ybWF0aW9uIHVzZWQgYnkKKyAgICAgICAgX19rbXBfZnJlZSgpIC0tIGl0IGhhcyB0byBwYXNzIHRvIGZyZWUoKSBvcmlnaW5hbCBwb2ludGVyLCBub3QgYWxpZ25lZCBvbmUuCisKKyAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgcGFkZGluZyB8IGRlc2NyaXB0b3IgfCAgICAgICAgICAgYWxpZ25lZCBibG9jayAgICAgICAgICAgfCBwYWRkaW5nIHwKKyAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICstIEFsaWduZWQgcG9pbnRlciByZXR1cm5lZCB0byBjYWxsZXIKKyAgICAgICAgICAgICstIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkKKworICAgICAgICBBbGlnbmVkIGJsb2NrIGlzIGZpbGxlZCB3aXRoIHplcm9zLCBwYWRkaW5ncyBhcmUgZmlsbGVkIHdpdGggMHhFRi4KKyAgICAqLworCisgICAga21wX21lbV9kZXNjcl90ICBkZXNjcjsKKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfYWxsb2NhdGVkOyAgICAgICAgLy8gQWRkcmVzcyByZXR1cm5lZCBieSBtYWxsb2MoKS4KKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfYWxpZ25lZDsgICAgICAgICAgLy8gQWxpZ25lZCBhZGRyZXNzIHRvIHJldHVybiB0byBjYWxsZXIuCisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2Rlc2NyOyAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgbWVtb3J5IGJsb2NrIGRlc2NyaXB0b3IuCisKKyAgICBLRV9UUkFDRSggMjUsICgKKyAgICAgICAgIi0+IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggJWQsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIChpbnQpIHNpemUsCisgICAgICAgIChpbnQpIGFsaWdubWVudAorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWxpZ25tZW50IDwgMzIgKiAxMDI0ICk7IC8vIEFsaWdubWVudCBzaG91bGQgbm90IGJlIHRvbworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZiggdm9pZCAqICkgPD0gc2l6ZW9mKCBrbXBfdWludHB0cl90ICkgKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGttcF91aW50cHRyX3QgaXMgZW5vdWdoIHRvIHN0b3JlIGFkZHJlc3Nlcy4KKworICAgIGRlc2NyLnNpemVfYWxpZ25lZCA9IHNpemU7CisgICAgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgPSBkZXNjci5zaXplX2FsaWduZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgYWxpZ25tZW50OworCisgICAgI2lmIEtNUF9ERUJVRworICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkID0gX21hbGxvY19zcmNfbG9jKCBkZXNjci5zaXplX2FsbG9jYXRlZCwgX2ZpbGVfLCBfbGluZV8gKTsKKyAgICAjZWxzZQorICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBtYWxsb2Nfc3JjX2xvYyggZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSApOworICAgICNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKAorICAgICAgICAiICAgbWFsbG9jKCAlZCApIHJldHVybmVkICVwXG4iLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZAorICAgICkgKTsKKyAgICBpZiAoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPT0gTlVMTCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKyAgICB9OworCisgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICBhZGRyX2FsaWduZWQgPQorICAgICAgICAoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudCApCisgICAgICAgICYgfiAoIGFsaWdubWVudCAtIDEgKTsKKyAgICBhZGRyX2Rlc2NyID0gYWRkcl9hbGlnbmVkIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKTsKKworICAgIGRlc2NyLnB0cl9hbGlnbmVkID0gKHZvaWQgKikgYWRkcl9hbGlnbmVkOworCisgICAgS0VfVFJBQ0UoIDI2LCAoCisgICAgICAgICIgICBfX19rbXBfYWxsb2NhdGVfYWxpZ246ICIKKyAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgPD0gYWRkcl9kZXNjciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfZGVzY3IgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApID09IGFkZHJfYWxpZ25lZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICUgYWxpZ25tZW50ID09IDAgKTsKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgbWVtc2V0KCBkZXNjci5wdHJfYWxsb2NhdGVkLCAweEVGLCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgLy8gRmlsbCBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHdpdGggMHhFRi4KKyAgICAjZW5kaWYKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGlnbmVkLCAweDAwLCBkZXNjci5zaXplX2FsaWduZWQgKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgYWxpZ25lZCBtZW1vcnkgYmxvY2sgKHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2luZyBieSBjYWxsZXIpIHdpdGggMHgwMC4gRG8gbm90CisgICAgICAgIC8vIHB1dCB0aGlzIGZpbGxpbmcgdW5kZXIgS01QX0RFQlVHIGNvbmRpdGlvbiEgTWFueSBjYWxsZXJzIGV4cGVjdCB6ZXJvZWQgbWVtb3J5LiAoUGFkZGluZworICAgICAgICAvLyBieXRlcyByZW1haW4gZmlsbGVkIHdpdGggMHhFRiBpbiBkZWJ1Z2dpbmcgbGlicmFyeS4pCisgICAgKiAoIChrbXBfbWVtX2Rlc2NyX3QgKikgYWRkcl9kZXNjciApID0gZGVzY3I7CisKKyAgICBLTVBfTUIoKTsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19fa21wX2FsbG9jYXRlX2FsaWduKCkgcmV0dXJucyAlcFxuIiwgZGVzY3IucHRyX2FsaWduZWQgKSApOworICAgIHJldHVybiBkZXNjci5wdHJfYWxpZ25lZDsKKworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbgorCisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIGNhY2hlIGxpbmUgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgRG8gbm90IGNhbGwgdGhpcyBmdW5jIGRpcmVjdGx5ISBVc2UgX19rbXBfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCit2b2lkICoKK19fX2ttcF9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfYWxsb2NhdGUoICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIChpbnQpIHNpemUgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgICAgIHB0ciA9IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZSwgX19rbXBfYWxpZ25fYWxsb2MgS01QX1NSQ19MT0NfUEFSTSApOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7CisKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGUKKworI2lmIChCVUlMRF9NRU1PUlk9PUZJUlNUX1RPVUNIKQordm9pZCAqCitfX2ttcF9mdF9wYWdlX2FsbG9jYXRlKHNpemVfdCBzaXplKQoreworICB2b2lkICphZHIsICphYWRyOworI2lmIEtNUF9PU19MSU5VWAorICAvKiBUT0RPOiBVc2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgcGFnZSBzaXplIGV2ZXJ5d2hlcmUgKi8KKyAgaW50IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisjZWxzZQorICAvKiBUT0RPOiBGaW5kIHdpbmRvd3MgZnVuY3Rpb24gdG8gZ2V0IHBhZ2Ugc2l6ZSBhbmQgdXNlIGl0IGV2ZXJ5d2hlcmUgKi8KKyAgaW50IHBhZ2Vfc2l6ZSA9IFBBR0VfU0laRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworICBhZHIgPSAodm9pZCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCBfX2ttcF9nZXRfdGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICsgcGFnZV9zaXplICsgS01QX1BUUl9TS0lQKTsKKyAgaWYgKCBhZHIgPT0gMCApCisgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKworICAvKiBjaGVjayB0byBzZWUgaWYgYWRyIGlzIG9uIGEgcGFnZSBib3VuZGFyeS4gKi8KKyAgaWYgKCAoIChrbXBfdWludHB0cl90KSBhZHIgJiAocGFnZV9zaXplIC0gMSkpID09IDApCisgICAgLyogbm90aGluZyB0byBkbyBpZiBhZHIgaXMgYWxyZWFkeSBvbiBhIHBhZ2UgYm91bmRhcnkuICovCisgICAgYWFkciA9IGFkcjsKKyAgZWxzZQorICAgIC8qIGVsc2Ugc2V0IGFhZHIgdG8gdGhlIGZpcnN0IHBhZ2UgYm91bmRhcnkgaW4gdGhlIGFsbG9jYXRlZCBtZW1vcnkuICovCisgICAgYWFkciA9ICh2b2lkICopICggKCAoa21wX3VpbnRwdHJfdCkgYWRyICsgcGFnZV9zaXplKSAmIH4ocGFnZV9zaXplIC0gMSkgKTsKKworICAvKiB0aGUgZmlyc3QgdG91Y2ggYnkgdGhlIG93bmVyIHRocmVhZC4gKi8KKyAgKigodm9pZCoqKWFhZHIpID0gYWRyOworCisgIC8qIHNraXAgdGhlIG1lbW9yeSBzcGFjZSB1c2VkIGZvciBzdG9yaW5nIGFkciBhYm92ZS4gKi8KKyAgcmV0dXJuICh2b2lkKikoKGNoYXIqKWFhZHIgKyBLTVBfUFRSX1NLSVApOworfQorI2VuZGlmCisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIHBhZ2UgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgRG9lcyBub3QgY2FsbCB0aGlzIGZ1bmMgZGlyZWN0bHkhIFVzZSBfX2ttcF9wYWdlX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLwordm9pZCAqCitfX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgaW50ICAgIHBhZ2Vfc2l6ZSA9IDggKiAxMDI0OworICAgIHZvaWQgKiBwdHI7CisKKyAgICBLRV9UUkFDRSggMjUsICgKKyAgICAgICAgIi0+IF9fa21wX3BhZ2VfYWxsb2NhdGUoICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplLCBwYWdlX3NpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSByZXR1cm5zICVwXG4iLCAoaW50KSBzaXplLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIF9fX2ttcF9wYWdlX2FsbG9jYXRlCisKKy8qCisgICAgRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IF9fa21wX2FsbG9jYXRlKCkgYW5kIF9fa21wX3BhZ2VfYWxsb2NhdGUoKS4KKyAgICBJbiBkZWJ1ZyBtb2RlLCBmaWxsIHRoZSBtZW1vcnkgYmxvY2sgd2l0aCAweEVGIGJlZm9yZSBjYWxsIHRvIGZyZWUoKS4KKyovCit2b2lkCitfX19rbXBfZnJlZSggdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKworICAgICAgICBrbXBfbWVtX2Rlc2NyX3QgZGVzY3I7CisgICAgICAgIGttcF91aW50cHRyX3QgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAgICAgIGttcF91aW50cHRyX3QgICBhZGRyX2FsaWduZWQ7ICAgICAgICAgIC8vIEFsaWduZWQgYWRkcmVzcyBwYXNzZWQgYnkgY2FsbGVyLgorCisgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZnJlZSggJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICBLTVBfQVNTRVJUKCBwdHIgIT0gTlVMTCApOworCisgICAgICAgIGRlc2NyID0gKiAoIGttcF9tZW1fZGVzY3JfdCAqKSAoIChrbXBfdWludHB0cl90KSBwdHIgLSBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICk7CisKKyAgICAgICAgS0VfVFJBQ0UoIDI2LCAoICIgICBfX2ttcF9mcmVlOiAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgInB0cl9hbGxvY2F0ZWQ9JXAsIHNpemVfYWxsb2NhdGVkPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHRyX2FsaWduZWQ9JXAsIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsaWduZWQsIChpbnQpIGRlc2NyLnNpemVfYWxpZ25lZCApKTsKKworICAgICAgICBhZGRyX2FsbG9jYXRlZCA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxsb2NhdGVkOworICAgICAgICBhZGRyX2FsaWduZWQgICA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxpZ25lZDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgJSBDQUNIRV9MSU5FID09IDAgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGVzY3IucHRyX2FsaWduZWQgPT0gcHRyICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSA8PSBhZGRyX2FsaWduZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGVzY3Iuc2l6ZV9hbGlnbmVkIDwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICsgZGVzY3Iuc2l6ZV9hbGlnbmVkIDw9IGFkZHJfYWxsb2NhdGVkICsgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAgICAgLy8gRmlsbCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLCBpdCBoZWxwcyBjYXRjaCB1c2luZyBmcmVlZCBtZW1vcnkuCisgICAgICAgICNlbmRpZgorCisgICAgICAgICNpZm5kZWYgTEVBS19NRU1PUlkKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiICAgZnJlZSggJXAgKVxuIiwgZGVzY3IucHRyX2FsbG9jYXRlZCApICk7CisgICAgICAgICAgICBmcmVlX3NyY19sb2MoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAgICAjZW5kaWYKKworICAgIEtNUF9NQigpOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mcmVlKCkgcmV0dXJuc1xuIiApICk7CisKK30gLy8gZnVuYyBfX19rbXBfZnJlZQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0ZBU1RfTUVNT1JZID09IDMKKy8vIEFsbG9jYXRlIGZhc3QgbWVtb3J5IGJ5IGZpcnN0IHNjYW5uaW5nIHRoZSB0aHJlYWQncyBmcmVlIGxpc3RzCisvLyBJZiBhIGNodW5rIHRoZSByaWdodCBzaXplIGV4aXN0cywgZ3JhYiBpdCBvZmYgdGhlIGZyZWUgbGlzdC4KKy8vIE90aGVyd2lzZSBhbGxvY2F0ZSBub3JtYWxseSB1c2luZyBrbXBfdGhyZWFkX21hbGxvYy4KKworLy8gQUM6IEhvdyB0byBjaG9vc2UgdGhlIGxpbWl0PyBKdXN0IGdldCAxNiBmb3Igbm93Li4uCitzdGF0aWMgaW50IGNvbnN0IF9fa21wX2ZyZWVfbGlzdF9saW1pdCA9IDE2OworCisvLyBBbHdheXMgdXNlIDEyOCBieXRlcyBmb3IgZGV0ZXJtaW5pbmcgYnVja2V0cyBmb3IgY2FjaGluZyBtZW1vcnkgYmxvY2tzCisjZGVmaW5lIERDQUNIRV9MSU5FICAxMjgKKwordm9pZCAqCitfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgICAgICAgICAgICAqIHB0cjsKKyAgICBpbnQgICAgICAgICAgICAgICBudW1fbGluZXM7CisgICAgaW50ICAgICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworICAgIHZvaWQgICAgICAgICAgICAqIGFsbG9jX3B0cjsKKyAgICBzaXplX3QgICAgICAgICAgICBhbGxvY19zaXplOworICAgIGttcF9tZW1fZGVzY3JfdCAqIGRlc2NyOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2FsbG9jYXRlKCBUIyVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIChpbnQpIHNpemUgS01QX1NSQ19MT0NfUEFSTSApICk7CisKKyAgICBudW1fbGluZXMgPSAoIHNpemUgKyBEQ0FDSEVfTElORSAtIDEgKSAvIERDQUNIRV9MSU5FOworICAgIGlkeCA9IG51bV9saW5lcyAtIDE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggaWR4ID49IDAgKTsKKyAgICBpZiAoIGlkeCA8IDIgKSB7CisgICAgICAgIGluZGV4ID0gMDsgICAgICAgLy8gaWR4IGlzIFsgMCwgMSBdLCB1c2UgZmlyc3QgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDI7ICAgLy8gMSwgMiBjYWNoZSBsaW5lcyBvciBsZXNzIHRoYW4gY2FjaGUgbGluZQorICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAxOyAgICAgICAvLyBpZHggaXMgWyAyLCAzIF0sIHVzZSBzZWNvbmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDQ7ICAgLy8gMywgNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyBpZHggaXMgWyA0LCAxNSBdLCB1c2UgdGhpcmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDE2OyAgLy8gNSwgNiwgLi4uLCAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyBpZHggaXMgWyAxNiwgNjMgXSwgdXNlIGZvdXJ0aCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gNjQ7ICAvLyAxNywgMTgsIC4uLiwgNjQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGFsbG9jX2NhbGw7IC8vIDY1IG9yIG1vcmUgY2FjaGUgbGluZXMgKCA+IDhLQiApLCBkb24ndCB1c2UgZnJlZSBsaXN0cworICAgIH0KKworICAgIHB0ciA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAvLyBwb3AgdGhlIGhlYWQgb2Ygbm8tc3luYyBmcmVlIGxpc3QKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PQorICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoIChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICkpLT5wdHJfYWxpZ25lZCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OworICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gbm8tc3luYyBmcmVlIGxpc3QgaXMgZW1wdHksIHVzZSBzeW5jIGZyZWUgbGlzdCAoZmlsbGVkIGluIGJ5IG90aGVyIHRocmVhZHMgb25seSkKKyAgICAgICAgLy8gcG9wIHRoZSBoZWFkIG9mIHRoZSBzeW5jIGZyZWUgbGlzdCwgcHVzaCBOVUxMIGluc3RlYWQKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAmdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLCBwdHIsIE5VTEwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcHVzaCB0aGUgcmVzdCBvZiBjaGFpbiBpbnRvIG5vLXN5bmMgZnJlZSBsaXN0IChjYW4gYmUgTlVMTCBpZiB0aGVyZSB3YXMgdGhlIG9ubHkgYmxvY2spCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9ICooKHZvaWQgKiopcHRyKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0KKyAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKCAoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApKS0+cHRyX2FsaWduZWQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgYWxsb2NfY2FsbDoKKyAgICAvLyBoYXZlbid0IGZvdW5kIGJsb2NrIGluIHRoZSBmcmVlIGxpc3RzLCB0aHVzIGFsbG9jYXRlIGl0CisgICAgc2l6ZSA9IG51bV9saW5lcyAqIERDQUNIRV9MSU5FOworCisgICAgYWxsb2Nfc2l6ZSA9IHNpemUgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgRENBQ0hFX0xJTkU7CisgICAgS0VfVFJBQ0UoIDI1LCAoICJfX2ttcF9mYXN0X2FsbG9jYXRlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX21hbGxvYyB3aXRoIGFsbG9jX3NpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgYWxsb2Nfc2l6ZSApICk7CisgICAgYWxsb2NfcHRyID0gYmdldCggdGhpc190aHIsIChidWZzaXplKSBhbGxvY19zaXplICk7CisKKyAgICAvLyBhbGlnbiBwdHIgdG8gRENBQ0hFX0xJTkUKKyAgICBwdHIgPSAodm9pZCAqKSgoICgoa21wX3VpbnRwdHJfdClhbGxvY19wdHIpICsgc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKyBEQ0FDSEVfTElORSApICYgfiggRENBQ0hFX0xJTkUgLSAxICkpOworICAgIGRlc2NyID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKChrbXBfdWludHB0cl90KXB0cikgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworCisgICAgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgPSBhbGxvY19wdHI7ICAgICAgICAvLyByZW1lbWJlciBhbGxvY2F0ZWQgcG9pbnRlcgorICAgIC8vIHdlIGRvbid0IG5lZWQgc2l6ZV9hbGxvY2F0ZWQKKyAgICBkZXNjci0+cHRyX2FsaWduZWQgICA9ICh2b2lkICopdGhpc190aHI7IC8vIHJlbWVtYmVyIGFsbG9jYXRpbmcgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoaXQgaXMgYWxyZWFkeSBzYXZlZCBpbiBiZ2V0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBtYXkgd2FudCB0byB1c2UgYW5vdGhlciBhbGxvY2F0b3IgaW4gZnV0dXJlKQorICAgIGRlc2NyLT5zaXplX2FsaWduZWQgID0gc2l6ZTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfYWxsb2NhdGUoIFQjJWQgKSByZXR1cm5zICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIGZ1bmMgX19rbXBfZmFzdF9hbGxvY2F0ZQorCisvLyBGcmVlIGZhc3QgbWVtb3J5IGFuZCBwbGFjZSBpdCBvbiB0aGUgdGhyZWFkJ3MgZnJlZSBsaXN0IGlmIGl0IGlzIG9mCisvLyB0aGUgY29ycmVjdCBzaXplLgordm9pZAorX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAga21wX21lbV9kZXNjcl90ICogZGVzY3I7CisgICAga21wX2luZm9fdCAgICAgICogYWxsb2NfdGhyOworICAgIHNpemVfdCAgICAgICAgICAgIHNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2ZyZWUoIFQjJWQsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICBkZXNjciA9IChrbXBfbWVtX2Rlc2NyX3QgKikoICgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKworICAgIEtFX1RSQUNFKDI2LCAoIiAgIF9fa21wX2Zhc3RfZnJlZTogICAgIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpIGRlc2NyLT5zaXplX2FsaWduZWQgKSApOworCisgICAgc2l6ZSA9IGRlc2NyLT5zaXplX2FsaWduZWQ7IC8vIDIsIDQsIDE2LCA2NCwgNjUsIDY2LCAuLi4gY2FjaGUgbGluZXMKKworICAgIGlkeCA9IERDQUNIRV9MSU5FICogMjsgLy8gMiBjYWNoZSBsaW5lcyBpcyBtaW5pbWFsIHNpemUgb2YgYmxvY2sKKyAgICBpZiAoIGlkeCA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDA7ICAgICAgIC8vIDIgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMSApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMTsgICAgICAgLy8gNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyA2NCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPiBEQ0FDSEVfTElORSAqIDY0ICk7CisgICAgICAgIGdvdG8gZnJlZV9jYWxsOyAgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICkKKyAgICB9CisKKyAgICBhbGxvY190aHIgPSAoa21wX2luZm9fdCAqKWRlc2NyLT5wdHJfYWxpZ25lZDsgLy8gZ2V0IHRocmVhZCBvd25pbmcgdGhlIGJsb2NrCisgICAgaWYgKCBhbGxvY190aHIgPT0gdGhpc190aHIgKSB7CisgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gc2VsZiBuby1zeW5jIGZyZWUgbGlzdCwgbGlua2luZyBwcmV2aW91cyBoZWFkIChMSUZPKQorICAgICAgICAqKCh2b2lkICoqKXB0cikgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGY7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9IHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICB2b2lkICogaGVhZCA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXI7CisgICAgICAgIGlmICggaGVhZCA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmcmVlIGxpc3QKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOyAgICAgICAgICAgICAvLyBtYXJrIHRoZSB0YWlsIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHRoZSBsaXN0IGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZXhpc3RlZCAib3RoZXIiIGxpc3QncyBvd25lciB0aHJlYWQgYW5kIHNpemUgb2YgcXVldWUKKyAgICAgICAgICAgIGttcF9tZW1fZGVzY3JfdCAqIGRzYyAgPSAoa21wX21lbV9kZXNjcl90ICopKCAoY2hhciopaGVhZCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgKiBxX3RoID0gKGttcF9pbmZvX3QgKikoZHNjLT5wdHJfYWxpZ25lZCk7IC8vIGFsbG9jYXRpbmcgdGhyZWFkLCBzYW1lIGZvciBhbGwgcXVldWUgbm9kZXMKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgIHFfc3ogPSBkc2MtPnNpemVfYWxsb2NhdGVkICsgMTsgICAgICAgICAgLy8gbmV3IHNpemUgaW4gY2FzZSB3ZSBhZGQgY3VycmVudCB0YXNrCisgICAgICAgICAgICBpZiAoIHFfdGggPT0gYWxsb2NfdGhyICYmIHFfc3ogPD0gX19rbXBfZnJlZV9saXN0X2xpbWl0ICkgeworICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBhZGQgY3VycmVudCB0YXNrIHRvICJvdGhlciIgbGlzdCwgbm8gc3luYyBuZWVkZWQKKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBoZWFkOworICAgICAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IHFfc3o7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZWl0aGVyIHF1ZXVlIGJsb2NrcyBvd25lciBpcyBjaGFuZ2luZyBvciBzaXplIGxpbWl0IGV4Y2VlZGVkCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZCBxdWV1ZSB0byBhbGxvY2F0aW5nIHRocmVhZCAocV90aCkgc3luY2hyb25lb3VzbHksCisgICAgICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IG5ldyBsaXN0IGZvciBhbGxvY190aHIncyB0YXNrcworICAgICAgICAgICAgICAgIHZvaWQgKiBvbGRfcHRyOworICAgICAgICAgICAgICAgIHZvaWQgKiB0YWlsID0gaGVhZDsKKyAgICAgICAgICAgICAgICB2b2lkICogbmV4dCA9ICooKHZvaWQgKiopaGVhZCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBuZXh0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBzaXplIHNob3VsZCBkZWNyZWFzZSBieSAxIGVhY2ggc3RlcCB0aHJvdWdoIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCopKChjaGFyKiluZXh0IC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpKS0+c2l6ZV9hbGxvY2F0ZWQgKyAxID09CisgICAgICAgICAgICAgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCopKChjaGFyKil0YWlsIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpKS0+c2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFpbCA9IG5leHQ7ICAgLy8gcmVtZW1iZXIgdGFpbCBub2RlCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSAqKCh2b2lkICoqKW5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxX3RoICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICAvLyBwdXNoIGJsb2NrIHRvIG93bmVyJ3Mgc3luYyBmcmVlIGxpc3QKKyAgICAgICAgICAgICAgICBvbGRfcHRyID0gVENSX1BUUiggcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGZyZWVfbGlzdCB0byBwdHIgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgICAgICAgICAgKigodm9pZCAqKil0YWlsKSA9IG9sZF9wdHI7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICAgICAgICAgJnFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLAorICAgICAgICAgICAgICAgICAgICBvbGRfcHRyLAorICAgICAgICAgICAgICAgICAgICBoZWFkICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICBvbGRfcHRyID0gVENSX1BUUiggcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgICAgICAgICAgICAgKigodm9pZCAqKil0YWlsKSA9IG9sZF9wdHI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RhcnQgbmV3IGxpc3Qgb2Ygbm90LXNlbHQgdGFza3MKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gKHNpemVfdCkxOyAgLy8gaGVhZCBvZiBxdWV1ZSBrZWVwcyBpdHMgbGVuZ3RoCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZ290byBlbmQ7CisKKyAgICBmcmVlX2NhbGw6CisgICAgS0VfVFJBQ0UoMjUsICggIl9fa21wX2Zhc3RfZnJlZTogVCMlZCBDYWxsaW5nIF9fa21wX3RocmVhZF9mcmVlIGZvciBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyKSwgc2l6ZSApICk7CisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aGlzX3RociApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgYnJlbCggdGhpc190aHIsIGRlc2NyLT5wdHJfYWxsb2NhdGVkICk7CisKKyAgICBlbmQ6CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mYXN0X2ZyZWUoKSByZXR1cm5zXG4iICkgKTsKKworfSAvLyBmdW5jIF9fa21wX2Zhc3RfZnJlZQorCisKKy8vIEluaXRpYWxpemUgdGhlIHRocmVhZCBmcmVlIGxpc3RzIHJlbGF0ZWQgdG8gZmFzdCBtZW1vcnkKKy8vIE9ubHkgZG8gdGhpcyB3aGVuIGEgdGhyZWFkIGlzIGluaXRpYWxseSBjcmVhdGVkLgordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIEtFX1RSQUNFKDEwLCAoICJfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5OiBDYWxsZWQgZnJvbSB0aCAlcFxuIiwgdGhpc190aHIgKSApOworCisgICAgbWVtc2V0ICggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHMsIDAsIE5VTV9MSVNUUyAqIHNpemVvZigga21wX2ZyZWVfbGlzdF90ICkgKTsKK30KKworLy8gRnJlZSB0aGUgbWVtb3J5IGluIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBiZWluZyByZWFwZWQgKGRlc3Ryb3llZCkuCit2b2lkCitfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgLy8gU3VwcG9zZSB3ZSB1c2UgQkdFVCB1bmRlcmx5aW5nIGFsbG9jYXRvciwgd2FsayB0aHJvdWdoIGl0cyBzdHJ1Y3R1cmVzLi4uCisgICAgaW50ICAgICAgICAgIGJpbjsKKyAgICB0aHJfZGF0YV90ICogdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIHZvaWQgICAgICAqKiBsc3QgPSBOVUxMOworCisgICAgS0VfVFJBQ0UoNSwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogQ2FsbGVkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLy8gUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMKKworICAgIC8vIERpZyB0aHJvdWdoIGZyZWUgbGlzdHMgYW5kIGV4dHJhY3QgYWxsIGFsbG9jYXRlZCBibG9ja3MKKyAgICBmb3IgKCBiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbiApIHsKKyAgICAgICAgYmZoZWFkX3QgKiBiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7CisgICAgICAgIHdoaWxlICggYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0gKSB7CisgICAgICAgICAgICBpZiAoIChrbXBfdWludHB0cl90KWItPmJoLmJiLmJ0aHIgJiAxICkgeyAgIC8vIGlmIHRoZSBidWZmZXIgaXMgYW4gYWxsb2NhdGVkIGFkZHJlc3M/CisgICAgICAgICAgICAgICAgKigodm9pZCoqKWIpID0gbHN0OyAgIC8vIGxpbmsgdGhlIGxpc3QgKG92ZXJyaWRlIGJ0aHIsIGJ1dCBrZWVwIGZsaW5rIHlldCkKKyAgICAgICAgICAgICAgICBsc3QgPSAodm9pZCoqKWI7ICAgICAgLy8gcHVzaCBiIGludG8gbHN0CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiID0gYi0+cWwuZmxpbms7ICAgICAgICAgIC8vIGdldCBuZXh0IGJ1ZmZlcgorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICggbHN0ICE9IE5VTEwgKSB7CisgICAgICAgIHZvaWQgKiBuZXh0ID0gKmxzdDsKKyAgICAgICAgS0VfVFJBQ0UoMTAsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IGZyZWVpbmcgJXAsIG5leHQ9JXAgdGggJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsc3QsIG5leHQsIHRoLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKyAgICAgICAgKCp0aHItPnJlbGZjbikobHN0KTsKKyAgICAgICAgI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAvLyBjb3VudCBibG9ja3MgdG8gcHJldmVudCBwcm9ibGVtcyBpbiBfX2ttcF9maW5hbGl6ZV9iZ2V0KCkKKyAgICAgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICAgICNlbmRpZgorICAgICAgICBsc3QgPSAodm9pZCoqKW5leHQ7CisgICAgfQorCisgICAgS0VfVFJBQ0UoNSwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogRnJlZWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworfQorCisjZW5kaWYgLy8gVVNFX0ZBU1RfTUVNT1JZCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2F0b21pYy5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTljODJmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYwpAQCAtMCwwICsxLDI5NjIgQEAKKy8qCisgKiBrbXBfYXRvbWljLmMgLS0gQVRPTUlDIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzCisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wLmgiICAgICAgICAgICAgICAgICAgLy8gVFJVRSwgYXNtIHJvdXRpbmVzIHByb3RvdHlwZXMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2hvcnQ7CisKKy8qIQorQGRlZmdyb3VwIEFUT01JQ19PUFMgQXRvbWljIE9wZXJhdGlvbnMKK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBtYW55IGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgYXRvbWljIG9wZXJhdGlvbnMuCisKK1RoZSBjb21waWxlciBpcyBhdCBsaWJlcnR5IHRvIGlubGluZSBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IGFyZSBuYXR1cmFsbHkgc3VwcG9ydGVkCitieSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gRm9yIGluc3RhbmNlIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbiBhdG9taWMgbGlrZSB0aGlzIGNhbiBiZSBpbmxpbmVkCitAY29kZQorc3RhdGljIGludCBzID0gMDsKKyNwcmFnbWEgb21wIGF0b21pYworICAgIHMrKzsKK0BlbmRjb2RlCit1c2luZyB0aGUgc2luZ2xlIGluc3RydWN0aW9uOiBgbG9jazsgaW5jbCBzYAorCitIb3dldmVyIHRoZSBydW50aW1lIGRvZXMgcHJvdmlkZSBlbnRyeXBvaW50cyBmb3IgdGhlc2Ugb3BlcmF0aW9ucyB0byBzdXBwb3J0IGNvbXBpbGVycyB0aGF0IGNob29zZQorbm90IHRvIGlubGluZSB0aGVtLiAoRm9yIGluc3RhbmNlLCBgX19rbXBjX2F0b21pY19maXhlZDRfYWRkYCBjb3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gdGhlCitpbmNyZW1lbnQgYWJvdmUuKQorCitUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgZW5jb2RlZCBieSB1c2luZyB0aGUgZGF0YSB0eXBlIG5hbWUgYW5kIHRoZSBvcGVyYXRpb24gbmFtZSwgYXMgaW4gdGhlc2UgdGFibGVzLgorCitEYXRhIFR5cGUgIHwgRGF0YSB0eXBlIGVuY29kaW5nCistLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0KK2ludDhfdCAgICAgfCBgZml4ZWQxYAordWludDhfdCAgICB8IGBmaXhlZDF1YAoraW50MTZfdCAgICB8IGBmaXhlZDJgCit1aW50MTZfdCAgIHwgYGZpeGVkMnVgCitpbnQzMl90ICAgIHwgYGZpeGVkNGAKK3VpbnQzMl90ICAgfCBgZml4ZWQ0dWAKK2ludDMyX3QgICAgfCBgZml4ZWQ4YAordWludDMyX3QgICB8IGBmaXhlZDh1YAorZmxvYXQgICAgICB8IGBmbG9hdDRgCitkb3VibGUgICAgIHwgYGZsb2F0OGAKK2Zsb2F0IDEwICg4MDg3IGVpZ2h0eSBiaXQgZmxvYXQpICB8IGBmbG9hdDEwYAorY29tcGxleDxmbG9hdD4gICB8ICBgY21wbHg0YAorY29tcGxleDxkb3VibGU+ICB8IGBjbXBseDhgCitjb21wbGV4PGZsb2F0MTA+IHwgYGNtcGx4MTBgCis8YnI+CisKK09wZXJhdGlvbiB8IE9wZXJhdGlvbiBlbmNvZGluZworLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCisrIHwgYWRkCistIHwgc3ViCitcKiB8IG11bAorLyB8IGRpdgorJiB8IGFuZGIKKzw8IHwgc2hsCitcPlw+IHwgc2hyCitcfCB8IG9yYgorXiAgfCB4b3IKKyYmIHwgYW5kbAorXHxcfCB8IG9ybAorbWF4aW11bSB8IG1heAorbWluaW11bSB8IG1pbgorLmVxdi4gICB8IGVxdgorLm5lcXYuICB8IG5lcXYKKworPGJyPgorRm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLCBgX3JldmAgY2FuIGFsc28gYmUgYWRkZWQgZm9yIHRoZSByZXZlcnNlZCBvcGVyYXRpb24uCitGb3IgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhcHR1cmUgdGhlIHJlc3VsdCwgdGhlIHN1ZmZpeCBgX2NwdGAgaXMgYWRkZWQuCisKK1VwZGF0ZSBGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYW4gYXRvbWljIGZ1bmN0aW9uIHRoYXQganVzdCBwZXJmb3JtcyBhbiB1cGRhdGUgKHdpdGhvdXQgYSBgY2FwdHVyZWApCitAY29kZQordm9pZCBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj4oIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICk7CitAZW5kY29kZQorQHBhcmFtIGlkZW50X3QgIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkICB0aGUgZ2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIGxocyAgIGEgcG9pbnRlciB0byB0aGUgbGVmdCBvcGVyYW5kCitAcGFyYW0gcmhzICAgdGhlIHJpZ2h0IG9wZXJhbmQKKworYGNhcHR1cmVgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PQorVGhlIGNhcHR1cmUgZnVuY3Rpb25zIHBlcmZvcm0gYW4gYXRvbWljIHVwZGF0ZSBhbmQgcmV0dXJuIGEgcmVzdWx0LCB3aGljaCBpcyBlaXRoZXIgdGhlIHZhbHVlCitiZWZvcmUgdGhlIGNhcHR1cmUsIG9yIHRoYXQgYWZ0ZXIuIFRoZXkgdGFrZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGRldGVybWluZSB3aGljaCByZXN1bHQgaXMgcmV0dXJuZWQuCitUaGVpciBnZW5lcmFsIGZvcm0gaXMgdGhlcmVmb3JlCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgaW50IGZsYWcgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorQHBhcmFtIGZsYWcgIG9uZSBpZiB0aGUgcmVzdWx0IGlzIHRvIGJlIGNhcHR1cmVkICphZnRlciogdGhlIG9wZXJhdGlvbiwgemVybyBpZiBjYXB0dXJlZCAqYmVmb3JlKi4KKworVGhlIG9uZSBzZXQgb2YgZXhjZXB0aW9ucyB0byB0aGlzIGlzIHRoZSBgY29tcGxleDxmbG9hdD5gIHR5cGUgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCwKK3JhdGhlciBhbiBleHRyYSBhcmd1bWVudCBwb2ludGVyIGlzIHBhc3NlZC4KKworVGhleSBsb29rIGxpa2UKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0XzxvcD5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnICk7CitAZW5kY29kZQorCitSZWFkIGFuZCBXcml0ZSBPcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgT3Blbk1QPHN1cD4qPC9zdXA+IHN0YW5kYXJkIG5vdyBzdXBwb3J0cyBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IHNpbXBseSBlbnN1cmUgdGhhdCB0aGUKK3ZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiBhdG9taWNhbGx5LCB3aXRoIG5vIG1vZGlmaWNhdGlvbgorcGVyZm9ybWVkLiBJbiBtYW55IGNhc2VzIG9uIElBLTMyIGFyY2hpdGVjdHVyZSB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBpbmxpbmVkIHNpbmNlCit0aGUgYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgdGhhdCBubyB0ZWFyaW5nIG9jY3VycyBvbiBhbGlnbmVkIG9iamVjdHMKK2FjY2Vzc2VkIHdpdGggYSBzaW5nbGUgbWVtb3J5IG9wZXJhdGlvbiBvZiB1cCB0byA2NCBiaXRzIGluIHNpemUuCisKK1RoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIHJlYWQgb3BlcmF0aW9ucyBpcworQGNvZGUKK1RZUEUgX19rbXBjX2F0b21pY188dHlwZT5fcmQgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICk7CitAZW5kY29kZQorCitGb3IgdGhlIHdyaXRlIG9wZXJhdGlvbnMgdGhlIGZvcm0gaXMKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPHR5cGU+X3dyICggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCisKK0Z1bGwgbGlzdCBvZiBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgbGVhZHMgdG8gdGhlIGdlbmVyYXRpb24gb2YgMzc2IGF0b21pYyBmdW5jdGlvbnMsIGFzIGZvbGxvd3MuCisKK0Z1bmN0b25zIGZvciBpbnRlZ2VycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgaW50ZWdlcnMgb2Ygc2l6ZSAxLDIsNCBhbmQgOCBieXRlcyBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgKHdoZXJlIHRoYXQgbWF0dGVycykuCitAY29kZQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2CitAZW5kY29kZQorCitGdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBvZiBzaXplIDQsIDgsIDEwIGFuZCAxNiBieXRlcy4KKyhUZW4gYnl0ZSBmbG9hdHMgYXJlIHVzZWQgYnkgWDg3LCBidXQgYXJlIG5vdyByYXJlKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgQ29tcGxleCB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdW5jdGlvbnMgZm9yIGNvbXBsZXggdHlwZXMgd2hvc2UgY29tcG9uZW50IGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlcyBhcmUgb2Ygc2l6ZSA0LDgsMTAgb3IgMTYgYnl0ZXMuCitUaGUgbmFtZXMgaGVyZSBhcmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCBmbG9hdCwgKm5vdCogdGhlIHNpemUgb2YgdGhlIGNvbXBsZXggdHlwZS4gU28KK2BfX2ttcGNfYXRvbWNfY21wbHg4X2FkZGAgaXMgYW4gb3BlcmF0aW9uIG9uIGEgYGNvbXBsZXg8ZG91YmxlPmAgb3IgYGNvbXBsZXgoa2luZD04KWAsICpub3QqIGBjb21wbGV4PGZsb2F0PmAuCisKK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorQGVuZGNvZGUKKyovCisKKy8qIQorQGluZ3JvdXAgQVRPTUlDX09QUworQHsKKyovCisKKy8qCisgKiBHbG9iYWwgdmFycworICovCisKKyNpZm5kZWYgS01QX0dPTVBfQ09NUEFUCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAxOyAgICAgIC8vIEludGVsIHBlcmYKKyNlbHNlCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAyOyAgICAgIC8vIEdPTVAgY29tcGF0aWJpbGl0eQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCitLTVBfQUxJR04oMTI4KQorCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMS1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzJpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMi1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWwzMiBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgOC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgY29tcGxleCBieXRlIGRhdGEgdHlwZSAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzEwcjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgZG91YmxlIGNvbXBsZXggZGF0YSB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzIwYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgY29tcGxleCB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworCisvKgorICAyMDA3LTAzLTAyOgorICBXaXRob3V0ICJ2b2xhdGlsZSIgc3BlY2lmaWVyIGluIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRyB3ZSBoYXZlIGEKKyAgYnVnIG9uICpfMzIgYW5kICpfMzJlLiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0uCisgIEl0IHNlZW1zIHRoZSByaWdodCBzb2x1dGlvbiBpcyB3cml0aW5nIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRworICByb3V0aW5lcyBpbiBhc3NlbWJsZXIgbGFuZ3VhZ2UuCisqLworI2RlZmluZSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHZvbGF0aWxlCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApICYmIEtNUF9IQVZFX1FVQUQKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA8ICggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPCByaHMucTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG9uZSByb3V0aW5lIGZvciBlYWNoIG9wZXJhdGlvbiBhbmQgb3BlcmFuZCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIEFsbCByb3V0aW5lcyBkZWNsYXJhdGlvbnMgbG9va3MgbGlrZQorLy8gdm9pZCBfX2ttcGNfYXRvbWljX1JUWVBFX09QKCBpZGVudF90KiwgaW50LCBUWVBFICpsaHMsIFRZUEUgcmhzICk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBLTVBfQ0hFQ0tfR1RJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBndGlkID09IEtNUF9HVElEX1VOS05PV04gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLy8gY2hlY2sgYW5kIGdldCBndGlkIHdoZW4gbmVlZGVkCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9jayB2YXJpYWJsZXMgdXNlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMgZm9yIHZhcmlvdXMgc2l6ZSBvcGVyYW5kcworI2RlZmluZSBBVE9NSUNfTE9DSzAgICBfX2ttcF9hdG9taWNfbG9jayAgICAgICAvLyBhbGwgdHlwZXMsIGZvciBHbnUgY29tcGF0CisjZGVmaW5lIEFUT01JQ19MT0NLMWkgIF9fa21wX2F0b21pY19sb2NrXzFpICAgIC8vIGNoYXIKKyNkZWZpbmUgQVRPTUlDX0xPQ0syaSAgX19rbXBfYXRvbWljX2xvY2tfMmkgICAgLy8gc2hvcnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0aSAgX19rbXBfYXRvbWljX2xvY2tfNGkgICAgLy8gbG9uZyBpbnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0ciAgX19rbXBfYXRvbWljX2xvY2tfNHIgICAgLy8gZmxvYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4aSAgX19rbXBfYXRvbWljX2xvY2tfOGkgICAgLy8gbG9uZyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzhyICBfX2ttcF9hdG9taWNfbG9ja184ciAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4YyAgX19rbXBfYXRvbWljX2xvY2tfOGMgICAgLy8gZmxvYXQgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzEwciBfX2ttcF9hdG9taWNfbG9ja18xMHIgICAvLyBsb25nIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzE2ciBfX2ttcF9hdG9taWNfbG9ja18xNnIgICAvLyBfUXVhZAorI2RlZmluZSBBVE9NSUNfTE9DSzE2YyBfX2ttcF9hdG9taWNfbG9ja18xNmMgICAvLyBkb3VibGUgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzIwYyBfX2ttcF9hdG9taWNfbG9ja18yMGMgICAvLyBsb25nIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMzJjIF9fa21wX2F0b21pY19sb2NrXzMyYyAgIC8vIF9RdWFkIGNvbXBsZXgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUwoT1AsTENLX0lEKSBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgT1AgKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yIEdOVSBjb21wYXRpYmlsaXR5LCB3ZSBtYXkgbmVlZCB0byB1c2UgYSBjcml0aWNhbCBzZWN0aW9uLAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBJU0EuCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbGwgYXRvbWljIG9wZXJhdGlvbnMgZXhjZXB0IGZvciBmaXhlZCA0IGJ5dGUgYWRkLAorLy8gc3ViLCBhbmQgYml0d2lzZSBsb2dpY2FsIG9wcywgYW5kIDEgJiAyIGJ5dGUgbG9naWNhbCBvcHMgdXNlIGEgY29tbW9uCisvLyBjcml0aWNhbCBzZWN0aW9uLiAgT24gSW50ZWwoUikgNjQsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBhcmUgZG9uZSB3aXRoIGZldGNoCisvLyBhbmQgYWRkIG9yIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgVGhlcmVmb3JlLCB0aGUgRkxBRyBwYXJhbWV0ZXIgdG8gdGhpcworLy8gbWFjcm8gaXMgZWl0aGVyIEtNUF9BUkNIX1g4NiBvciAwIChvciAxLCBmb3IgSW50ZWwtc3BlY2lmaWMgZXh0ZW5zaW9uIHdoaWNoCisvLyByZXF1aXJlIGEgY3JpdGljYWwgc2VjdGlvbiwgd2hlcmUgd2UgcHJlZGljdCB0aGF0IHRoZXkgd2lsbCBiZSBpbXBsZW1lbnRlZAorLy8gaW4gdGhlIEdudSBjb2RlZ2VuIGJ5IGNhbGxpbmcgR09NUF9hdG9taWNfc3RhcnQoKSAvIEdPTVBfYXRvbWljX2VuZCgpKS4KKy8vCisvLyBXaGVuIHRoZSBPUF9HT01QX0NSSVRJQ0FMIG1hY3JvIGlzIHVzZWQgaW4gYSAqQ1JJVElDQUwqIG1hY3JvIGNvbnN0cnVjdCwKKy8vIHRoZSBGTEFHIHBhcmFtZXRlciBzaG91bGQgYWx3YXlzIGJlIDEuICBJZiB3ZSBrbm93IHRoYXQgd2Ugd2lsbCBiZSB1c2luZworLy8gYSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgd2UgdXNlIHRoZSBnZW5lcmljCisvLyBsb2NrIF9fa21wX2F0b21pY19sb2NrIHRvIHByb3RlY3QgdGhlIGF0b21pYyB1cGRhdGUsIGFuZCBub3Qgb2Ygb2YgdGhlCisvLyBsb2NrcyB0aGF0IGFyZSBzcGVjaWFsaXplZCBiYXNlZCB1cG9uIHRoZSBzaXplIG9yIHR5cGUgb2YgdGhlIGRhdGEuCisvLworLy8gSWYgRkxBRyBpcyAwLCB0aGVuIHdlIGFyZSByZWx5aW5nIG9uIGRlYWQgY29kZSBlbGltaW5hdGlvbiBieSB0aGUgYnVpbGQKKy8vIGNvbXBpbGVyIHRvIGdldCByaWQgb2YgdGhlIHVzZWxlc3MgYmxvY2sgb2YgY29kZSwgYW5kIHNhdmUgYSBuZWVkbGVzcworLy8gYnJhbmNoIGF0IHJ1bnRpbWUuCisvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyMgZWxzZQorIyBkZWZpbmUgT1BfR09NUF9DUklUSUNBTChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisjaWYgS01QX01JQworIyBkZWZpbmUgS01QX0RPX1BBVVNFIF9tbV9kZWxheV8zMiggMzAgKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19QQVVTRSBLTVBfQ1BVX1BBVVNFKCkKKyNlbmRpZiAvKiBLTVBfTUlDICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAyMDA3LTA2LTI1OgorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorLy8gbGluXzMyLCBsaW5fMzJlLCB3aW5fMzIgYW5kIHdpbl8zMmUgYXJlIGFmZmVjdGVkIChJIHZlcmlmaWVkIHRoZSBhc20pCisvLyBDb21waWxlciBpZ25vcmVzIHRoZSB2b2xhdGlsZSBxdWFsaWZpZXIgb2YgdGhlIHRlbXBfdmFsIGluIHRoZSBPUF9DTVBYQ0hHIG1hY3JvLgorLy8gVGhpcyBpcyBhIHByb2JsZW0gb2YgdGhlIGNvbXBpbGVyLgorLy8gUmVsYXRlZCB0cmFja2VyIGlzIEM3NjAwNSwgdGFyZ2V0ZWQgdG8gMTEuMC4KKy8vIEkgdmVyaWZpZWQgdGhlIGFzbSBvZiB0aGUgd29ya2Fyb3VuZC4KKyNkZWZpbmUgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJY2hhciBhbm9ueW1bICggc2l6ZW9mKCBUWVBFICkgPT0gc2l6ZW9mKCBrbXBfaW50IyNCSVRTICkgKSA/ICggMSApIDogKCAwICkgXSA9IHsgMSB9OyBcCisJc3RydWN0IF9zc3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBUWVBFICAgICAgICAgICAgY21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAga21wX2ludCMjQklUUyAgICp2dnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgX3NzcyBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS52dnYgPSAoIGttcF9pbnQjI0JJVFMgKiApJm9sZF92YWx1ZS5jbXA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlLnZ2diA9ICgga21wX2ludCMjQklUUyAqICkmbmV3X3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgXAorICAgICAgICAqb2xkX3ZhbHVlLnZ2diA9ICogKCB2b2xhdGlsZSBrbXBfaW50IyNCSVRTICogKSBsaHM7ICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgb2xkX3ZhbHVlLnZ2diwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSBuZXdfdmFsdWUudnZ2ICkgKSAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKm9sZF92YWx1ZS52dnYgPSAqICggdm9sYXRpbGUga21wX2ludCMjQklUUyAqICkgbGhzOyAgICAgICAgICBcCisJICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorLy8gZW5kIG9mIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GTE9BVF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgS01QX1RFU1RfVEhFTl9BRERfUkVBTCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmCisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gIFwKKyAgICAgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZMT0FUX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA0LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIGFkZCwga21wX2ludDMyLCAgMzIsICssIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisKKyNpZiBLTVBfTUlDCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgYWRkLCBrbXBfcmVhbDMyLCAzMiwgKywgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgc3ViLCBrbXBfcmVhbDMyLCAzMiwgLSwgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisjZWxzZQorQVRPTUlDX0ZMT0FUX0FERCggZmxvYXQ0LCBhZGQsIGttcF9yZWFsMzIsIDMyLCArLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZAorQVRPTUlDX0ZMT0FUX0FERCggZmxvYXQ0LCBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YgorI2VuZGlmIC8vIEtNUF9NSUMKKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA4LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIGFkZCwga21wX2ludDY0LCAgNjQsICssIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIHN1Yiwga21wX2ludDY0LCAgNjQsIC0sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisKKyNpZiBLTVBfTUlDCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgYWRkLCBrbXBfcmVhbDY0LCA2NCwgKywgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisjZWxzZQorQVRPTUlDX0ZMT0FUX0FERCggZmxvYXQ4LCBhZGQsIGttcF9yZWFsNjQsIDY0LCArLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorQVRPTUlDX0ZMT0FUX0FERCggZmxvYXQ4LCBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YgorI2VuZGlmIC8vIEtNUF9NSUMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisvLyAgICAgTUFTSyAgICAtIHVzZWQgZm9yIGFsaWdubWVudCBjaGVjaworCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBhZGQsIGttcF9pbnQ4LCAgICA4LCArLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsIGFuZGIsIGttcF9pbnQ4LCAgICA4LCAmLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgZGl2LCBrbXBfaW50OCwgICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG11bCwga21wX2ludDgsICAgIDgsICosICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG9yYiwga21wX2ludDgsICAgIDgsIHwsICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNociwga21wX2ludDgsICAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICB4b3IsIGttcF9pbnQ4LCAgICA4LCBeLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBhZGQsIGttcF9pbnQxNiwgIDE2LCArLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsIGFuZGIsIGttcF9pbnQxNiwgIDE2LCAmLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG11bCwga21wX2ludDE2LCAgMTYsICosICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG9yYiwga21wX2ludDE2LCAgMTYsIHwsICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNobCwga21wX2ludDE2LCAgMTYsIDw8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzdWIsIGttcF9pbnQxNiwgIDE2LCAtLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICB4b3IsIGttcF9pbnQxNiwgIDE2LCBeLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsIGFuZGIsIGttcF9pbnQzMiwgIDMyLCAmLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgZGl2LCBrbXBfaW50MzIsICAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG11bCwga21wX2ludDMyLCAgMzIsICosICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG9yYiwga21wX2ludDMyLCAgMzIsIHwsICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNobCwga21wX2ludDMyLCAgMzIsIDw8LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNociwga21wX2ludDMyLCAgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICB4b3IsIGttcF9pbnQzMiwgIDMyLCBeLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsIGFuZGIsIGttcF9pbnQ2NCwgIDY0LCAmLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgZGl2LCBrbXBfaW50NjQsICA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG11bCwga21wX2ludDY0LCAgNjQsICosICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG9yYiwga21wX2ludDY0LCAgNjQsIHwsICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNociwga21wX2ludDY0LCAgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOHUsIHNociwga21wX3VpbnQ2NCwgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICB4b3IsIGttcF9pbnQ2NCwgIDY0LCBeLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBkaXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBtdWwsIGttcF9yZWFsMzIsIDMyLCAqLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBtdWwsIGttcF9yZWFsNjQsIDY0LCAqLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKy8vICAgVE9ETzogZWxpbWluYXRlIEFUT01JQ19DUklUX3tMLEVRVn0gbWFjcm9zIGFzIG5vdCB1c2VkCisjZGVmaW5lIEFUT01JQ19DUklUX0woVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoID0gKmxocyBPUCwgTENLX0lEICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCg9ICpsaHMgT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTCg9ICpsaHMgT1AsTENLX0lEKSAgLyogdW5hbGlnbmVkIC0gdXNlIGNyaXRpY2FsICovICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYX0woIGZpeGVkMSwgYW5kbCwgY2hhciwgICAgICAgOCwgJiYsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQxLCAgb3JsLCBjaGFyLCAgICAgICA4LCB8fCwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkMiwgYW5kbCwgc2hvcnQsICAgICAxNiwgJiYsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQyLCAgb3JsLCBzaG9ydCwgICAgIDE2LCB8fCwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkNCwgYW5kbCwga21wX2ludDMyLCAzMiwgJiYsIDRpLCAzLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ0LCAgb3JsLCBrbXBfaW50MzIsIDMyLCB8fCwgNGksIDMsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkOCwgYW5kbCwga21wX2ludDY0LCA2NCwgJiYsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ4LCAgb3JsLCBrbXBfaW50NjQsIDY0LCB8fCwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOiAgICAgICAgICAgICAgICAgICovCisvKiBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH0gICAgICAgICAgICovCisvKiBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn0gICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggRkxBRyApICYmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCBvbGRfdmFsdWUgT1AgcmhzICYmICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZyaHMgKSApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgLyogbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAvKiB1bmFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtYXgsIGNoYXIsICAgICAgICA4LCA8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtaW4sIGNoYXIsICAgICAgICA4LCA+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtYXgsIHNob3J0LCAgICAgIDE2LCA8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtaW4sIHNob3J0LCAgICAgIDE2LCA+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtYXgsIGttcF9pbnQzMiwgIDMyLCA8LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtaW4sIGttcF9pbnQzMiwgIDMyLCA+LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtYXgsIGttcF9pbnQ2NCwgIDY0LCA8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtaW4sIGttcF9pbnQ2NCwgIDY0LCA+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtYXgsIGttcF9yZWFsMzIsIDMyLCA8LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtaW4sIGttcF9yZWFsMzIsIDMyLCA+LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtYXgsIGttcF9yZWFsNjQsIDY0LCA8LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtaW4sIGttcF9yZWFsNjQsIDY0LCA+LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluCisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWF4LCAgICAgUVVBRF9MRUdBQ1ksICAgICAgPCwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKK01JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1pbiwgICAgIFFVQURfTEVHQUNZLCAgICAgID4sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIE1JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1heF9hMTYsIFF1YWRfYTE2X3QsICAgICA8LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYKKyAgICBNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtaW5fYTE2LCBRdWFkX2ExNl90LCAgICAgPiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgLkVRVi4gYmVjYXVzZSBvZiB0aGUgbmVlZCBvZiBjb21wbGVtZW50ICh+KQorLy8gT1AgaWdub3JlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMsIF49fiB1c2VkIGluc3RlYWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChePX4sTENLX0lEKSAgICAvKiBzZW5kIGFzc2lnbm1lbnQgYW5kIGNvbXBsZW1lbnQgKi8gICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKF49fixMQ0tfSUQpICAgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhDSEcoICBmaXhlZDEsIG5lcXYsIGttcF9pbnQ4LCAgIDgsICAgXiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQyLCBuZXF2LCBrbXBfaW50MTYsIDE2LCAgIF4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkNCwgbmVxdiwga21wX2ludDMyLCAzMiwgICBeLCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDgsIG5lcXYsIGttcF9pbnQ2NCwgNjQsICAgXiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQxLCBlcXYsICBrbXBfaW50OCwgICA4LCAgXn4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQyLCBlcXYsICBrbXBfaW50MTYsIDE2LCAgXn4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ0LCBlcXYsICBrbXBfaW50MzIsIDMyLCAgXn4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ4LCBlcXYsICBrbXBfaW50NjQsIDY0LCAgXn4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgYWRkLCBsb25nIGRvdWJsZSwgICAgICssIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBtdWwsIGxvbmcgZG91YmxlLCAgICAgKiwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgZGl2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkLCBRVUFEX0xFR0FDWSwgICAgICssIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIHN1YiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBtdWwsIFFVQURfTEVHQUNZLCAgICAgKiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkX2ExNiwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIG11bF9hMTYsIFF1YWRfYTE2X3QsICosIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBhZGQsIGttcF9jbXBseDMyLCA2NCwgKywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBzdWIsIGttcF9jbXBseDMyLCA2NCwgLSwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBtdWwsIGttcF9jbXBseDMyLCA2NCwgKiwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCA2NCwgLywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorLy8gZW5kIG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGFkZCwga21wX2NtcGx4MzIsICAgICArLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIG11bCwga21wX2NtcGx4MzIsICAgICAqLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGRpdiwga21wX2NtcGx4MzIsICAgICAvLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgYWRkLCBrbXBfY21wbHg2NCwgICAgICssIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgc3ViLCBrbXBfY21wbHg2NCwgICAgIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgbXVsLCBrbXBfY21wbHg2NCwgICAgICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgZGl2LCBrbXBfY21wbHg2NCwgICAgIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgYWRkLCBrbXBfY21wbHg4MCwgICAgICssIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIHN1Yiwga21wX2NtcGx4ODAsICAgICAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBtdWwsIGttcF9jbXBseDgwLCAgICAgKiwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGQsIENQTFgxMjhfTEVHLCAgICAgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgc3ViLCBDUExYMTI4X0xFRywgICAgIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIG11bCwgQ1BMWDEyOF9MRUcsICAgICAqLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXYsIENQTFgxMjhfTEVHLCAgICAgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGRfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgbXVsX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFVihPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFViggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI19yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfcmV2OiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgIEJJVFMsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBkaXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCAgIDgsIC8sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc2hyLCBrbXBfaW50OCwgICAgOCwgPj4sIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDF1LCBzaHIsIGttcF91aW50OCwgICA4LCA+PiwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzaGwsIGttcF9pbnQxNiwgIDE2LCA8PCwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQydSwgc2hyLCBrbXBfdWludDE2LCAxNiwgPj4sIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc3ViLCBrbXBfaW50MTYsICAxNiwgLSwgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIGRpdiwga21wX2ludDMyLCAgMzIsIC8sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc2hsLCBrbXBfaW50MzIsICAzMiwgPDwsIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzaHIsIGttcF9pbnQzMiwgIDMyLCA+PiwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBkaXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc2hyLCBrbXBfaW50NjQsICA2NCwgPj4sIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzdWIsIGttcF9pbnQ2NCwgIDY0LCAtLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ0LCAgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgIDRyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ4LCAgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgIDhyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICBCSVRTLE9QLExDS19JRCwgR09NUF9GTEFHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIGRpdiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg0LCAgZGl2LCBrbXBfY21wbHgzMiwgICAgIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDgsICBzdWIsIGttcF9jbXBseDY0LCAgICAgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4OCwgIGRpdiwga21wX2NtcGx4NjQsICAgICAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgc3ViLCBrbXBfY21wbHg4MCwgICAgIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsICAgICAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdiwgQ1BMWDEyOF9MRUcsICAgICAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gRW5kIG9mIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIG1peGVkIHR5cGVzIG9mIExIUyBhbmQgUkhTLCB3aGVuIFJIUyBpcyAibGFyZ2VyIiAgICAgICAgICAgICovCisvKiBOb3RlOiBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRvdGFsIG51bWJlciBvZiB0eXBlcyBjb21iaW5hdGlvbnMgICAgICAgICAgKi8KKy8qICAgICAgIGl0IGlzIHN1cHBvc2VkIHRoYXQgY29tcGlsZXIgY29udmVydHMgUkhTIHRvIGxvbmdlc3QgZmxvYXRpbmcgdHlwZSwqLworLyogICAgICAgdGhhdCBpcyBfUXVhZCwgYmVmb3JlIGNhbGwgdG8gYW55IG9mIHRoZXNlIHJvdXRpbmVzICAgICAgICAgICAgICAgICovCisvKiBDb252ZXJzaW9uIHRvIF9RdWFkIHdpbGwgYmUgZG9uZSBieSB0aGUgY29tcGlsZXIgZHVyaW5nIGNhbGN1bGF0aW9uLCAgICAgKi8KKy8qICAgIGNvbnZlcnNpb24gYmFjayB0byBUWVBFIC0gYmVmb3JlIHRoZSBhc3NpZ25tZW50LCBsaWtlOiAgICAgICAgICAgICAgICAqLworLyogICAgKmxocyA9IChUWVBFKSggKF9RdWFkKSgqbGhzKSBPUCByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtYW5jZSBwZW5hbHR5IGV4cGVjdGVkIGJlY2F1c2Ugb2YgU1cgZW11bGF0aW9uIHVzZSAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEIyNfIyNSVFlQRV9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgUlRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiXyIgI1JUWVBFX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0ZQKFRZUEVfSUQsVFlQRSxPUF9JRCxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSSFM9ZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsIGNoYXIsICAgICAgIGRpdiwgIDgsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgc2hvcnQsICAgICAgZGl2LCAxNiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCBrbXBfaW50MzIsICBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsIGttcF9pbnQ2NCwgIGRpdiwgNjQsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgYWRkLCAgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIHN1YiwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBtdWwsICA4LCAqLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIGRpdiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBhZGQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgc3ViLCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIG11bCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgbXVsLCAzMiwgKiwgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgYWRkLCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBtdWwsIDY0LCAqLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgYWRkLCArLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBzdWIsIC0sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIG11bCwgKiwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgZGl2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBhZGQsIDY0LCArLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgc3ViLCA2NCwgLSwgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIG11bCwgNjQsICosIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBkaXYsIDY0LCAvLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFJFQUQgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlX3JldCIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5CisvLyBSZXR1cm4gb2xkIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCBvZiAiY29tcGFyZSAmIHN3YXAjIG9wZXJhdGlvbgorCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuaW9uIGZfaV91bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFRZUEUgZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX2ludCMjQklUUyBpX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5pb24gZl9pX3VuaW9uIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS5mX3ZhbCA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLmlfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVCMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbG9jLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLmlfdmFsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUuaV92YWwgKTsgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUuZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSAoKmxvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVBRCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsb2MsIE9QIDAgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4IGZvciBjbXBseDQgcmVhZCAoQ1EyMjAzNjEpIG9uIFdpbmRvd3MqIE9TLiBSZWd1bGFyIHJvdXRpbmUgd2l0aCByZXR1cm4gdmFsdWUgZG9lc24ndCB3b3JrLgorLy8gTGV0J3MgcmV0dXJuIHRoZSByZWFkIHZhbHVlIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjaWYgKCBLTVBfT1NfV0lORE9XUyApCisKKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIFRZUEUgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICBPUCwgR09NUF9GTEFHCitBVE9NSUNfRklYRURfUkVBRCggZml4ZWQ0LCByZCwga21wX2ludDMyLCAgMzIsICssIDAgICAgICAgICAgICApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfcmQKK0FUT01JQ19GSVhFRF9SRUFEKCBmaXhlZDgsIHJkLCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZmxvYXQ0LCByZCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmbG9hdDgsIHJkLCBrbXBfcmVhbDY0LCA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKworLy8gISEhIFRPRE86IFJlbW92ZSBsb2NrIG9wZXJhdGlvbnMgZm9yICJjaGFyIiBzaW5jZSBpdCBjYW4ndCBiZSBub24tYXRvbWljCitBVE9NSUNfQ01QWENIR19SRUFEKCBmaXhlZDEsICByZCwga21wX2ludDgsICAgIDgsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZpeGVkMiwgIHJkLCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZAorCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxMCwgcmQsIGxvbmcgZG91YmxlLCArLCAxMHIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIHJkLCBRVUFEX0xFR0FDWSwgKywgMTZyLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRml4IGZvciBDUTIyMDM2MSBvbiBXaW5kb3dzKiBPUworI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyggY21wbHg0LCAgcmQsIGttcF9jbXBseDMyLCArLCAgOGMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZWxzZQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDQsICByZCwga21wX2NtcGx4MzIsICssICA4YywgMSApICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDgsICByZCwga21wX2NtcGx4NjQsICssIDE2YywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTAsIHJkLCBrbXBfY21wbHg4MCwgKywgMjBjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDE2LCByZCwgQ1BMWDEyOF9MRUcsICssIDMyYywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIGExNl9yZCwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTYsIGExNl9yZCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFdSSVRFIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfWENIR19XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9YQ0hHX0ZJWEVEIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWENIR19SRUFMIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QLExDS19JRCkgICAgICAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDEsICB3ciwga21wX2ludDgsICAgIDgsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDIsICB3ciwga21wX2ludDE2LCAgMTYsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDQsICB3ciwga21wX2ludDMyLCAgMzIsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbmRpZgorCitBVE9NSUNfWENIR19GTE9BVF9XUiggZmxvYXQ0LCB3ciwga21wX3JlYWwzMiwgMzIsID0sIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbmRpZgorCitBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTAsIHdyLCBsb25nIGRvdWJsZSwgPSwgMTByLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxNiwgd3IsIFFVQURfTEVHQUNZLCA9LCAxNnIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3dyCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg0LCAgd3IsIGttcF9jbXBseDMyLCA9LCAgOGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg4LCAgd3IsIGttcF9jbXBseDY0LCA9LCAxNmMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHgxMCwgd3IsIGttcF9jbXBseDgwLCA9LCAyMGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDE2LCB3ciwgQ1BMWDEyOF9MRUcsID0sIDMyYywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDE2LCBhMTZfd3IsIFF1YWRfYTE2X3QsICAgICAgICAgPSwgMTZyLCAxICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93cgorICAgIEFUT01JQ19DUklUSUNBTF9XUiggY21wbHgxNiwgYTE2X3dyLCBrbXBfY21wbHgxMjhfYTE2X3QsID0sIDMyYywgMSApIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IKKyNlbmRpZgorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgQ0FQVFVSRSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFJFVF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BRERfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GTE9BVF9BRERfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BRERfUkVBTCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDQsIGFkZF9jcHQsIGttcF9pbnQzMiwgIDMyLCArLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkNCwgc3ViX2NwdCwga21wX2ludDMyLCAgMzIsIC0sIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ4LCBhZGRfY3B0LCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDgsIHN1Yl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorCisjaWYgS01QX01JQworQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIGFkZF9jcHQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIHN1Yl9jcHQsIGttcF9yZWFsMzIsIDMyLCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIGFkZF9jcHQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIHN1Yl9jcHQsIGttcF9yZWFsNjQsIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorI2Vsc2UKK0FUT01JQ19GTE9BVF9BRERfQ1BUKCBmbG9hdDQsIGFkZF9jcHQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorQVRPTUlDX0ZMT0FUX0FERF9DUFQoIGZsb2F0NCwgc3ViX2NwdCwga21wX3JlYWwzMiwgMzIsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0CitBVE9NSUNfRkxPQVRfQUREX0NQVCggZmxvYXQ4LCBhZGRfY3B0LCBrbXBfcmVhbDY0LCA2NCwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKK0FUT01JQ19GTE9BVF9BRERfQ1BUKCBmbG9hdDgsIHN1Yl9jcHQsIGttcF9yZWFsNjQsIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorI2VuZGlmIC8vIEtNUF9NSUMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBhZGRfY3B0LCBrbXBfaW50OCwgICAgOCwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgYW5kYl9jcHQsIGttcF9pbnQ4LCAgICA4LCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIGRpdl9jcHQsIGttcF9pbnQ4LCAgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxdSwgZGl2X2NwdCwga21wX3VpbnQ4LCAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgbXVsX2NwdCwga21wX2ludDgsICAgIDgsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBvcmJfY3B0LCBrbXBfaW50OCwgICAgOCwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHNobF9jcHQsIGttcF9pbnQ4LCAgICA4LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc2hyX2NwdCwga21wX2ludDgsICAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDF1LCBzaHJfY3B0LCBrbXBfdWludDgsICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzdWJfY3B0LCBrbXBfaW50OCwgICAgOCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHhvcl9jcHQsIGttcF9pbnQ4LCAgICA4LCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgYWRkX2NwdCwga21wX2ludDE2LCAgMTYsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsIGFuZGJfY3B0LCBrbXBfaW50MTYsICAxNiwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBkaXZfY3B0LCBrbXBfaW50MTYsICAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMnUsIGRpdl9jcHQsIGttcF91aW50MTYsIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIG11bF9jcHQsIGttcF9pbnQxNiwgIDE2LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgb3JiX2NwdCwga21wX2ludDE2LCAgMTYsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzaGxfY3B0LCBrbXBfaW50MTYsICAxNiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHNocl9jcHQsIGttcF9pbnQxNiwgIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQydSwgc2hyX2NwdCwga21wX3VpbnQxNiwgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc3ViX2NwdCwga21wX2ludDE2LCAgMTYsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICB4b3JfY3B0LCBrbXBfaW50MTYsICAxNiwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgYW5kYl9jcHQsIGttcF9pbnQzMiwgIDMyLCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIGRpdl9jcHQsIGttcF9pbnQzMiwgIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0dSwgZGl2X2NwdCwga21wX3VpbnQzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbXVsX2NwdCwga21wX2ludDMyLCAgMzIsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBvcmJfY3B0LCBrbXBfaW50MzIsICAzMiwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHNobF9jcHQsIGttcF9pbnQzMiwgIDMyLCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgc2hyX2NwdCwga21wX2ludDMyLCAgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDR1LCBzaHJfY3B0LCBrbXBfdWludDMyLCAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICB4b3JfY3B0LCBrbXBfaW50MzIsICAzMiwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgYW5kYl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAmLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIGRpdl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4dSwgZGl2X2NwdCwga21wX3VpbnQ2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbXVsX2NwdCwga21wX2ludDY0LCAgNjQsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBvcmJfY3B0LCBrbXBfaW50NjQsICA2NCwgfCwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHNobF9jcHQsIGttcF9pbnQ2NCwgIDY0LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgc2hyX2NwdCwga21wX2ludDY0LCAgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDh1LCBzaHJfY3B0LCBrbXBfdWludDY0LCA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICB4b3JfY3B0LCBrbXBfaW50NjQsICA2NCwgXiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgIGRpdl9jcHQsIGttcF9yZWFsMzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbXVsX2NwdCwga21wX3JlYWwzMiwgMzIsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsICBkaXZfY3B0LCBrbXBfcmVhbDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgIG11bF9jcHQsIGttcF9yZWFsNjQsIDY0LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHQKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9MX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9MX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKyNkZWZpbmUgQVRPTUlDX0NNUFhfTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDEsIGFuZGxfY3B0LCBjaGFyLCAgICAgICA4LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQxLCAgb3JsX2NwdCwgY2hhciwgICAgICAgOCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQyLCBhbmRsX2NwdCwgc2hvcnQsICAgICAxNiwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMiwgIG9ybF9jcHQsIHNob3J0LCAgICAgMTYsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkNCwgYW5kbF9jcHQsIGttcF9pbnQzMiwgMzIsICYmLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDQsICBvcmxfY3B0LCBrbXBfaW50MzIsIDMyLCB8fCwgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDgsIGFuZGxfY3B0LCBrbXBfaW50NjQsIDY0LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ4LCAgb3JsX2NwdCwga21wX2ludDY0LCA2NCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEZvcnRyYW4gb3BlcmF0b3JzIHRoYXQgbWF0Y2hlZCBubyBvbmUgaW4gQzoKKy8vIE1BWCwgTUlOLCAuRVFWLiwgLk5FUVYuCisvLyBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH1fY3B0CisvLyBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn1fY3B0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGZsYWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoIEZMQUcgKSAmJiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSU5fTUFYX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKlRZUEUgb2xkX3ZhbHVlOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoIG9sZF92YWx1ZSBPUCByaHMgJiYgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJnJocyApICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMX0NQVChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlLCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEdfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWUsIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMSwgIG1heF9jcHQsIGNoYXIsICAgICAgICA4LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQxLCAgbWluX2NwdCwgY2hhciwgICAgICAgIDgsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDIsICBtYXhfY3B0LCBzaG9ydCwgICAgICAxNiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMiwgIG1pbl9jcHQsIHNob3J0LCAgICAgIDE2LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbWF4X2NwdCwga21wX2ludDMyLCAgMzIsIDwsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDQsICBtaW5fY3B0LCBrbXBfaW50MzIsICAzMiwgPiwgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkOCwgIG1heF9jcHQsIGttcF9pbnQ2NCwgIDY0LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbWluX2NwdCwga21wX2ludDY0LCAgNjQsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDQsICBtYXhfY3B0LCBrbXBfcmVhbDMyLCAzMiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0NCwgIG1pbl9jcHQsIGttcF9yZWFsMzIsIDMyLCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbWF4X2NwdCwga21wX3JlYWw2NCwgNjQsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDgsICBtaW5fY3B0LCBrbXBfcmVhbDY0LCA2NCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtYXhfY3B0LCBRVUFEX0xFR0FDWSwgICAgPCwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fY3B0LCBRVUFEX0xFR0FDWSwgICAgPiwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1heF9hMTZfY3B0LCBRdWFkX2ExNl90LCA8LCAxNnIsICAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2X2NwdAorICAgIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fYTE2X2NwdCwgUXVhZF9hMTZfdCwgPiwgMTZyLCAgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWl4X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDEsIG5lcXZfY3B0LCBrbXBfaW50OCwgICA4LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDIsIG5lcXZfY3B0LCBrbXBfaW50MTYsIDE2LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDQsIG5lcXZfY3B0LCBrbXBfaW50MzIsIDMyLCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDgsIG5lcXZfY3B0LCBrbXBfaW50NjQsIDY0LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDEsIGVxdl9jcHQsICBrbXBfaW50OCwgICA4LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkMiwgZXF2X2NwdCwgIGttcF9pbnQxNiwgMTYsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQ0LCBlcXZfY3B0LCAga21wX2ludDMyLCAzMiwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDgsIGVxdl9jcHQsICBrbXBfaW50NjQsIDY0LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QIyM9LExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgVFlQRSAqIG91dCwgaW50IGZsYWcgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AjIz0sTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgYWRkX2NwdCwgbG9uZyBkb3VibGUsICAgICArLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIHN1Yl9jcHQsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBtdWxfY3B0LCBsb25nIGRvdWJsZSwgICAgICosIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgZGl2X2NwdCwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2NwdCwgUVVBRF9MRUdBQ1ksICAgICArLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIHN1Yl9jcHQsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtdWxfY3B0LCBRVUFEX0xFR0FDWSwgICAgICosIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2NwdCwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2ExNl9jcHQsIFF1YWRfYTE2X3QsICssIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBzdWJfYTE2X2NwdCwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG11bF9hMTZfY3B0LCBRdWFkX2ExNl90LCAqLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2ExNl9jcHQsIFF1YWRfYTE2X3QsIC8sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGFkZF9jcHQsIGttcF9jbXBseDMyLCArLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIHN1Yl9jcHQsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIG11bF9jcHQsIGttcF9jbXBseDMyLCAqLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGRpdl9jcHQsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBhZGRfY3B0LCBrbXBfY21wbHg2NCwgKywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIHN1Yl9jcHQsIGttcF9jbXBseDY0LCAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgbXVsX2NwdCwga21wX2NtcGx4NjQsICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBkaXZfY3B0LCBrbXBfY21wbHg2NCwgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGFkZF9jcHQsIGttcF9jbXBseDgwLCArLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIHN1Yl9jcHQsIGttcF9jbXBseDgwLCAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIG11bF9jcHQsIGttcF9jbXBseDgwLCAqLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGRpdl9jcHQsIGttcF9jbXBseDgwLCAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBhZGRfY3B0LCBDUExYMTI4X0xFRywgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfY3B0LCBDUExYMTI4X0xFRywgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBtdWxfY3B0LCBDUExYMTI4X0xFRywgKiwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBkaXZfY3B0LCBDUExYMTI4X0xFRywgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGFkZF9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgbXVsX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgKiwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGRpdl9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB2ID0geCA9IGV4cHIgYmlub3AgeDsgeyB2ID0geDsgeCA9IGV4cHIgYmlub3AgeDsgfSB7IHggPSBleHByIGJpbm9wIHg7IHYgPSB4OyB9ICBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qdGVtcF92YWwgPSAoKmxocyk7Ki9cCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTtcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVYoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFRfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDF1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ4LCAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzaGxfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHNocl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxdSwgc2hyX2NwdF9yZXYsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBkaXZfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMnUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHNobF9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc2hyX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDJ1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzdWJfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIGRpdl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0dSwgZGl2X2NwdF9yZXYsIGttcF91aW50MzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc2hsX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzaHJfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDh1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzaGxfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHNocl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4dSwgc2hyX2NwdF9yZXYsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDQsICBkaXZfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0NCwgIHN1Yl9jcHRfcmV2LCBrbXBfcmVhbDMyLCAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ4LCAgZGl2X2NwdF9yZXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDgsICBzdWJfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qcHJpbnRmKCJfX2ttcF9hdG9taWNfbW9kZSA9ICVkXG4iLCBfX2ttcF9hdG9taWNfbW9kZSk7Ki9cCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDEwLCBzdWJfY3B0X3JldiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxMCwgZGl2X2NwdF9yZXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgc3ViX2NwdF9yZXYsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIGRpdl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIHN1Yl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgZGl2X2ExNl9jcHRfcmV2LCBRdWFkX2ExNl90LCAvLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgc3ViX2NwdF9yZXYsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKworQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4OCwgIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHg4LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDY0LCAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBzdWJfY3B0X3Jldiwga21wX2NtcGx4ODAsIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBkaXZfY3B0X3Jldiwga21wX2NtcGx4ODAsIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgc3ViX2NwdF9yZXYsIENQTFgxMjhfTEVHLCAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2NwdF9yZXYsIENQTFgxMjhfTEVHLCAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBzdWJfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2ExNl9jcHRfcmV2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyAgIE9wZW5NUCA0LjAgQ2FwdHVyZS13cml0ZSAoc3dhcCk6IHt2ID0geDsgeCA9IGV4cHI7fQorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfc3dwOiBUIyVkXG4iLCBndGlkICkpOworCisjZGVmaW5lIENSSVRJQ0FMX1NXUChMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUxfU1dQKCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQKEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworI2RlZmluZSBBVE9NSUNfWENIR19TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1hDSEdfRklYRUQjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19YQ0hHX0ZMT0FUX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfWENIR19SRUFMIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBDTVBYQ0hHX1NXUChUWVBFLEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ01QWENIR19TV1AoVFlQRSxCSVRTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDEsIGttcF9pbnQ4LCAgICA4LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3dwCitBVE9NSUNfWENIR19TV1AoIGZpeGVkMiwga21wX2ludDE2LCAgMTYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQ0LCBrbXBfaW50MzIsICAzMiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorCitBVE9NSUNfWENIR19GTE9BVF9TV1AoIGZsb2F0NCwga21wX3JlYWwzMiwgMzIsIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfU1dQKCBmaXhlZDgsIGttcF9pbnQ2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgQVRPTUlDX0NNUFhDSEdfU1dQKCBmbG9hdDgsIGttcF9yZWFsNjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX1NXUCggICAgICAgZml4ZWQ4LCBrbXBfaW50NjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIEFUT01JQ19YQ0hHX0ZMT0FUX1NXUCggZmxvYXQ4LCBrbXBfcmVhbDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfU1dQKFRZUEVfSUQsVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSSVRJQ0FMX1NXUChMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHZvaWQgZm9yIGNtcGx4NCByb3V0aW5lcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1NXUF9XUksoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI19zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBUWVBFICogb3V0ICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQgKSk7CisKKworI2RlZmluZSBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcCA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dCkgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUF9XUksoRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTF9TV1BfV1JLKCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1BfV1JLKEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfU1dQX1dSSyhUWVBFX0lELCBUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQX1dSSyhUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JJVElDQUxfU1dQX1dSSyhMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKworQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsIDEwciwgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDE2LCBRVUFEX0xFR0FDWSwgMTZyLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorI2VuZGlmCisvLyBjbXBseDQgcm91dGluZSB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX1NXUF9XUksoIGNtcGx4NCwga21wX2NtcGx4MzIsICA4YywgICAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorCisvL0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4NCwga21wX2NtcGx4MzIsICA4YywgICAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorCisKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4OCwgIGttcF9jbXBseDY0LCAxNmMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTAsIGttcF9jbXBseDgwLCAyMGMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxNiwgQ1BMWDEyOF9MRUcsIDMyYywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxNl9hMTYsIFF1YWRfYTE2X3QsICAgICAgICAgMTZyLCAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfc3dwCisgICAgQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxNl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgMzJjLCAxICkgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIEVuZCBvZiBPcGVuTVAgNC4wIENhcHR1cmUKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisKKyN1bmRlZiBPUF9DUklUSUNBTAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdlbmVyaWMgYXRvbWljIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wY19hdG9taWNfMSggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKAorI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbHNlCisgICAgICAgIFRSVUUKKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQ4ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4ICggKGttcF9pbnQ4ICopIGxocywKKwkJICAgIAkJKihrbXBfaW50OCAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQ4ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50OCAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbCAxLWJ5dGUgZGF0YSBpcyBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMWksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMWksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBpZiAoCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4MSkJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDItYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQxNiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDE2ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNiAoIChrbXBfaW50MTYgKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQxNiAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQxNiAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDE2ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsIDItYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yaSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yaSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY180KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGdjYyB1c2VzIGNtcHhjaGcgb25seSBmb3IgNC1ieXRlIGludHMuCisgICAgICAgIC8vIEdvbXAgY29tcGF0aWJpbGl0eSBpcyBicm9rZW4gaWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZmxvYXRzLgorICAgICAgICAvLworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDMpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyA0LWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQzMiAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIgKCAoa21wX2ludDMyICopIGxocywKKwkJICAgIAkJKihrbXBfaW50MzIgKikgJm9sZF92YWx1ZSwgKihrbXBfaW50MzIgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQzMiAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja180aSBmb3IgYWxsIDQtYnl0ZSBkYXRhLAorICAgICAgICAvLyBldmVuIGlmIGl0IGlzbid0IG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY184KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgaWYgKAorCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4NykJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDgtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDY0ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQgKCAoa21wX2ludDY0ICopIGxocywKKwkJCQkJICAgICAgICooa21wX2ludDY0ICopICZvbGRfdmFsdWUsCisJCQkJCSAgICAgICAqKGttcF9pbnQ2NCAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDY0ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja184aSBmb3IgYWxsIDgtYnl0ZSBkYXRhLAorICAgICAgICAvLyBldmVuIGlmIGl0IGlzbid0IG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184aSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184aSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY18xMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciwgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciwgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZjLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMjAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yMGMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yMGMsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18zMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzMyYywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzMyYywgZ3RpZCApOworfQorCisvLyBBQzogc2FtZSB0d28gcm91dGluZXMgYXMgR09NUF9hdG9taWNfc3RhcnQvZW5kLCBidXQgd2lsbCBiZSBjYWxsZWQgYnkgb3VyIGNvbXBpbGVyCisvLyAgICAgZHVwbGljYXRlZCBpbiBvcmRlciB0byBub3QgdXNlIDMtcGFydHkgbmFtZXMgaW4gcHVyZSBJbnRlbCBjb2RlCisvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgR1RJRCBwYXJhbWV0ZXIgYWZ0ZXIgY29uc3VsdGF0aW9uIHdpdGggRXJuZXN0by9YaW5taW4uCit2b2lkCitfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCitfX2ttcGNfYXRvbWljX2VuZCh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIQorQH0KKyovCisKKy8vIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2F0b21pYy5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFkY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaApAQCAtMCwwICsxLDEwMTMgQEAKKy8qCisgKiBrbXBfYXRvbWljLmggLSBBVE9NSUMgaGVhZGVyIGZpbGUKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfQVRPTUlDX0gKKyNkZWZpbmUgS01QX0FUT01JQ19ICisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorCisvLyBDKysgYnVpbGQgcG9ydC4KKy8vIEludGVsIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgX0NvbXBsZXggZGF0YXR5cGUgb24gd2luLgorLy8gSW50ZWwgY29tcGlsZXIgc3VwcG9ydHMgX0NvbXBsZXggZGF0YXR5cGUgb24gbGluIGFuZCBtYWMuCisvLyBPbiB0aGUgb3RoZXIgc2lkZSwgdGhlcmUgaXMgYSBwcm9ibGVtIG9mIHN0YWNrIGFsaWdubWVudCBvbiBsaW5fMzIgYW5kIG1hY18zMgorLy8gaWYgdGhlIHJocyBpcyBjbXBseDgwIG9yIGNtcGx4MTI4IHR5cGVkZWYnZWQgZGF0YXR5cGUuCisvLyBUaGUgZGVjaXNpb24gaXM6IHRvIHVzZSBjb21waWxlciBzdXBwb3J0ZWQgX0NvbXBsZXggdHlwZSBvbiBsaW4gYW5kIG1hYywKKy8vICAgICAgICAgICAgICAgICAgdG8gdXNlIHR5cGVkZWYnZWQgdHlwZXMgb24gd2luLgorLy8gQ29uZGl0aW9uIGZvciBXSU42NCB3YXMgbW9kaWZpZWQgaW4gYW50aWNpcGF0aW9uIG9mIDEwLjEgYnVpbGQgY29tcGlsZXIuCisKKyNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApICYmICggS01QX09TX1dJTkRPV1MgKQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisKKyAgICAjaWZkZWYgX0RFQlVHCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtIG9mIF9EZWJ1Z0hlYXBUYWcgdW5yZXNvbHZlZCBleHRlcm5hbC4KKyAgICAgICAgLy8gVGhpcyBwcm9ibGVtIHByZXZlbnRlZCB0byB1c2Ugb3VyIHN0YXRpYyBkZWJ1ZyBsaWJyYXJ5IGZvciBDIHRlc3RzCisgICAgICAgIC8vIGNvbXBpbGVkIHdpdGggL01EZCBvcHRpb24gKHRoZSBsaWJyYXJ5IGl0c2VsZiBidWlsdCB3aXRoIC9NVGQpLAorICAgICAgICAjdW5kZWYgX0RFQlVHCisgICAgICAgICNkZWZpbmUgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICNlbmRpZgorCisgICAgI2luY2x1ZGUgPGNvbXBsZXg+CisKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgdHlwZV9saHMsIHR5cGVuYW1lIHR5cGVfcmhzID4KKyAgICBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4gX19rbXBfbGhzX2Rpdl9yaHMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+JiBsaHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX3JocyA+JiByaHMgKSB7CisgICAgdHlwZV9saHMgYSA9IGxocy5yZWFsKCk7CisgICAgdHlwZV9saHMgYiA9IGxocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgYyA9IHJocy5yZWFsKCk7CisgICAgdHlwZV9yaHMgZCA9IHJocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgZGVuID0gYypjICsgZCpkOworICAgIHR5cGVfcmhzIHIgPSAoIGEqYyArIGIqZCApOworICAgIHR5cGVfcmhzIGkgPSAoIGIqYyAtIGEqZCApOworICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiByZXQoIHIvZGVuLCBpL2RlbiApOworICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gY29tcGxleDgKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHg2NF90IDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiB7CisKKyAgICBfX2ttcF9jbXBseDY0X3QoKSA6IHN0ZDo6Y29tcGxleDwgZG91YmxlID4gKCkge30KKworICAgIF9fa21wX2NtcGx4NjRfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBkb3VibGUgPiYgY2QgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoIGNkICkge30KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDY0X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDY0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDY0X3Qga21wX2NtcGx4NjQ7CisKKyAgICAvLyBjb21wbGV4NAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDMyX3QgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4geworCisgICAgX19rbXBfY21wbHgzMl90KCkgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCkge30KKworICAgIF9fa21wX2NtcGx4MzJfdCggY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgY2YgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBmbG9hdCA+ICggY2YgKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICsgKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyArIHJocyApOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzIC0gcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAqICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKyBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSAtIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApICogYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgzMl90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDMyX3Qga21wX2NtcGx4MzI7CisKKyAgICAvLyBjb21wbGV4MTAKKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApICBfX2ttcF9jbXBseDgwX3QgOiBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoKSA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoIGNvbnN0IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiYgY2xkICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoIGNsZCApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDgwX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIEtNUF9ET19BTElHTiggMTYgKSAgc3RydWN0IF9fa21wX2NtcGx4ODBfdCBrbXBfY21wbHg4MDsKKworICAgIC8vIGNvbXBsZXgxNgorICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgc3RydWN0IF9fa21wX2NtcGx4MTI4X3QgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCkgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCkge30KKworICAgICAgICAgICAgX19rbXBfY21wbHgxMjhfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBfUXVhZCA+JiBjcSApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCBjcSApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MTI4X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBfUXVhZCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfY21wbHgxMjhfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDEyOF90IGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYgLyogS01QX0hBVkVfUVVBRCAqLworCisgICAgI2lmZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgI3VuZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgLy8gU2V0IGl0IGJhY2sgbm93CisgICAgICAgICNkZWZpbmUgX0RFQlVHIDEKKyAgICAjZW5kaWYKKworI2Vsc2UKKyAgICAvLyBjcmVhdGUgc2hvcnRjdXRzIGZvciBjOTkgY29tcGxleCB0eXBlcworICAgIHR5cGVkZWYgZmxvYXQgX0NvbXBsZXggICAgICAga21wX2NtcGx4MzI7CisgICAgdHlwZWRlZiBkb3VibGUgX0NvbXBsZXggICAgICBrbXBfY21wbHg2NDsKKyAgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9Db21wbGV4IGttcF9jbXBseDgwOworICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgdHlwZWRlZiBfUXVhZCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgxMjg7CisgICAgI2VuZGlmCisjZW5kaWYKKworLy8gQ29tcGlsZXIgMTIuMCBjaGFuZ2VkIGFsaWdubWVudCBvZiAxNiBhbmQgMzItYnl0ZSBhcmd1bWVudHMgKGxpa2UgX1F1YWQKKy8vIGFuZCBrbXBfY21wbHgxMjgpIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gVGhlIGZvbGxvd2luZyBhbGlnbmVkIHN0cnVjdHVyZXMKKy8vIGFyZSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHRoZSBvbGQgYWxpZ25tZW50IGluIDEwLjEsIDExLjAsIDExLjEgYW5kIAorLy8gaW50cm9kdWNlIHRoZSBuZXcgYWxpZ25tZW50IGluIDEyLjAuIFNlZSBDUTg4NDA1LgorI2lmIEtNUF9BUkNIX1g4NiAmJiBLTVBfSEFWRV9RVUFECisKKyAgICAvLyA0LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisgICAgI3ByYWdtYSBwYWNrKCBwdXNoLCA0ICkKKworICAgIAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBRdWFkX2E0X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTRfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2E0X3QoIGNvbnN0IF9RdWFkICYgY3EgKSA6IHEgKCBjcSApIHt9CisKKyAgICAgICAgUXVhZF9hNF90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyArIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgUXVhZF9hNF90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBrbXBfY21wbHgxMjhfYTRfdCB7CisgICAgICAgIGttcF9jbXBseDEyOCBxOworCisgICAga21wX2NtcGx4MTI4X2E0X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hNF90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgICNwcmFnbWEgcGFjayggcG9wICkKKworICAgIC8vIE5ldyAxNi1ieXRlIGFsaWduZWQgc3RydWN0dXJlcyBmb3IgMTIuMCBjb21waWxlci4KKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApIFF1YWRfYTE2X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTE2X3QoICApIDogcSggICkge30KKyAgICAgICAgUXVhZF9hMTZfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkga21wX2NtcGx4MTI4X2ExNl90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCggY29uc3Qga21wX2NtcGx4MTI4ICYgYzEyOCApIDogcSAoIGMxMjggKSB7fQorCisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworI2VuZGlmCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBRdWFkX2E0X3QKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOF9hNF90CisjZWxzZQorICAgICNkZWZpbmUgUVVBRF9MRUdBQ1kgX1F1YWQKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgX19rbXBfYXRvbWljX21vZGU7CisKKy8vCisvLyBBdG9taWMgbG9ja3MgY2FuIGVhc2lseSBiZWNvbWUgY29udGVuZGVkLCBzbyB3ZSB1c2UgcXVldWluZyBsb2NrcyBmb3IgdGhlbS4KKy8vCisKK3R5cGVkZWYga21wX3F1ZXVpbmdfbG9ja190IGttcF9hdG9taWNfbG9ja190OworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKy8vIEdsb2JhbCBMb2NrcworCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2s7ICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184YzsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFVQREFURSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKKy8vIDItYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyA0LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA4LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA0LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKKy8vIDgtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworLy8gMS0sIDItLCA0LSwgOC1ieXRlIGxvZ2ljYWwgKCYmLCB8fCkKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gTUlOIC8gTUFYCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeTsgSUEtMzIgYXJjaGl0ZWN0dXJlIG9ubHkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gbG9uZyBkb3VibGUgdHlwZQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisvLyBfUXVhZCB0eXBlCisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKy8vIHJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcworCisvLyBSSFM9ZmxvYXQ4Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworCisvLyBSSFM9ZmxvYXQxNiAoZGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7CisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBSSFM9Y21wbHg4Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKKworLy8gZ2VuZXJpYyBhdG9taWMgcm91dGluZXMKK3ZvaWQgX19rbXBjX2F0b21pY18xKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY184KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOworCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFJFQUQgYXJlIGxpc3RlZAorLy8KKworY2hhciAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsb2MgKTsKK3Nob3J0ICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbG9jICk7CitrbXBfaW50MzIgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxvYyApOwora21wX2ludDY0ICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsb2MgKTsKK2ttcF9yZWFsMzIgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgICogbG9jICk7CitrbXBfcmVhbDY0ICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICAqIGxvYyApOworbG9uZyBkb3VibGUgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxvYyApOworI2VuZGlmCisvLyBGaXggZm9yIENRMjIwMzYxOiBjbXBseDQgUkVBRCB3aWxsIHJldHVybiB2b2lkIG9uIFdpbmRvd3MqIE9TOyByZWFkIHZhbHVlIHdpbGwgYmUKKy8vIHJldHVybmVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICB2b2lkICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGttcF9jbXBseDMyICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2Vsc2UKKyAgICBrbXBfY21wbHgzMiAgX19rbXBjX2F0b21pY19jbXBseDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2VuZGlmCitrbXBfY21wbHg2NCAgX19rbXBjX2F0b21pY19jbXBseDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxvYyApOwora21wX2NtcGx4ODAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxvYyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIFF1YWRfYTE2X3QgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbG9jICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsb2MgKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFdSSVRFIGFyZSBsaXN0ZWQKKy8vCisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxocywga21wX2ludDY0ICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsaHMsIGttcF9yZWFsMzIgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbGhzLCBrbXBfcmVhbDY0ICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbGhzLCBRdWFkX2ExNl90ICAgICAgICAgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgQ0FQVFVSRSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworLy8gMi1ieXRlCitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGZsb2F0CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBNSU4gLyBNQVgKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDY0ICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gbG9uZyBkb3VibGUgdHlwZQorbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECisvLyBfUXVhZCB0eXBlCitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7CisKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworI2VuZGlmCisjZW5kaWYKKwordm9pZCBfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpOwordm9pZCBfX2ttcGNfYXRvbWljX2VuZCh2b2lkKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworY2hhcgkgICAgICAgCV9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICwgaW50IGZsYWcpOworY2hhcgkJX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIGNoYXIgCV9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgCV9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0ICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSAJCV9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgCV9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CisjZW5kaWYKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NCByb3V0aW5lcyAtIHJldHVybiB2b2lkOyBjYXB0dXJlZCB2YWx1ZSBpcyByZXR1cm5lZCB2aWEgdGhlIGFyZ3VtZW50Cit2b2lkICAgICAJX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK3ZvaWQgCSAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg2NCAJX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDgwIAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgIAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnICk7CitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdCAJCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIGttcF9jbXBseDEyOF9hMTZfdCAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CitjaGFyIAkJX19rbXBjX2F0b21pY19maXhlZDFfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsaHMsIGNoYXIgICAgICAgIHJocyApOworc2hvcnQgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbGhzLCBzaG9ydCAgICAgICByaHMgKTsKK2ttcF9pbnQzMiAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxocywga21wX2ludDMyICAgcmhzICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgICAgICAgKiBsaHMsIGZsb2F0ICByaHMgKTsKK2RvdWJsZQkJX19rbXBjX2F0b21pY19mbG9hdDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICAgICAgKiBsaHMsIGRvdWJsZSAgcmhzICk7Citsb25nIGRvdWJsZQlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgICAgCV9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgorLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgYSB3b3JrYXJvdW5kIGhlcmUKK3ZvaWQgICAgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCApOworLy9rbXBfY21wbHgzMiAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7CisKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7CitrbXBfY21wbHg4MAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgCV9fa21wY19hdG9taWNfY21wbHgxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdAkJX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBjYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9BVE9NSUNfSCAqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTc2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSBleGVjdXRpb24gdGhyZWFkCituZWVkcyB0byBwcm9jZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNhbmNlbGVkIHJlZ2lvbi4KKworUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGJpbmRpbmcgT3Blbk1QIHJlZ2lvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiX19rbXBjX2NhbmNlbDogdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3Q9JWQgQCAlcFxuIiwgCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCAmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsgCisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFzayApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBvbGQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJih0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSwgY2FuY2VsX25vcmVxLCBjbmNsX2tpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkID09IGNhbmNlbF9ub3JlcSB8fCBvbGQgPT0gY25jbF9raW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGluIHRoaXMgdGFza2dyb3VwIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVxdWVzdCAtPiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgbmVlZHMgdG8gaGFwcGVuIGhlcmU/CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGVjaWZpY2F0aW9uIGRpc2FsbG93cyBjYW5jZWxsYXRpb24gdy9vIHRhc2tncm91cHMKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbWlnaHQgZG8gYW55dGhpbmcgaGVyZSwgbGV0J3MgYWJvcnQgZm9yIG5vdworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSUNWIE9NUF9DQU5DRUxMQVRJT049ZmFsc2UsIHNvIHdlIGlnbm9yZWQgdGhpcyBjYW5jZWwgcmVxdWVzdAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUgCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitDYW5jZWxsYXRpb24gcG9pbnQgZm9yIHRoZSBlbmNvdW50ZXJpbmcgdGhyZWFkLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpIHsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50OiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwgY25jbF9raW5kLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgIT0gY2FuY2VsX25vcmVxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8IAorICAgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF9zZWN0aW9ucyB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX3Rhc2tncm91cCk7IAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoY25jbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgcGFyYWxsZWwgYW5kIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRlYW0gc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RlYW0pOworICAgICAgICAgICAgICAgIGlmICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY25jbF9raW5kID09IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHBvaW50IHNvIHdlIGNhbiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHBlbmRpbmcsIHNvIHdlIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgY2FuY2VsbGF0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsgCisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFzayApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgIC8vIHRhc2tncm91cAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBjYW5jZWxsYXRpb24gcG9pbnQgaXMgZW5jb3VudGVyZWQgYnkgYSB0YXNrCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGEgdGFza2dyb3VwLCBpdCBpcyBPSworICAgICAgICAgICAgICAgICAgICAvLyB0byBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJQ1YgT01QX0NBTkNFTExBVElPTj1mYWxzZSwgc28gd2UgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcG9pbnQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUgCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitCYXJyaWVyIHdpdGggY2FuY2VsbGF0aW9uIHBvaW50IHRvIHNlbmQgdGhyZWFkcyBmcm9tIHRoZSBiYXJyaWVyIHRvIHRoZQorZW5kIG9mIHRoZSBwYXJhbGxlbCByZWdpb24uICBOZWVkcyBhIHNwZWNpYWwgY29kZSBwYXR0ZXJuIGFzIGRvY3VtZW50ZWQgCitpbiB0aGUgZGVzaWduIGRvY3VtZW50IGZvciB0aGUgY2FuY2VsbGF0aW9uIGZlYXR1cmUuCisqLwora21wX2ludDMyCitfX2ttcGNfY2FuY2VsX2JhcnJpZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCkgeworICAgIGludCByZXQgPSAwIC8qIGZhbHNlICovOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIC8vIGNhbGwgaW50byB0aGUgc3RhbmRhcmQgYmFycmllcgorICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisKKyAgICAvLyBpZiBjYW5jZWxsYXRpb24gaXMgYWN0aXZlLCBjaGVjayBjYW5jZWxsYXRpb24gZmxhZworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGljaCBjb25zdHJ1Y3QgdG8gY2FuY2VsLCBjaGVjayB0aGUgZmxhZyBhbmQKKyAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcKKyAgICAgICAgc3dpdGNoICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgICAgICAgLy8gdGhlIG5leHQgYmFycmllciBpcyB0aGUgZm9yay9qb2luIGJhcnJpZXIsIHdoaWNoCisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZXMgdGhlIHRocmVhZHMgbGVhdmluZyBoZXJlICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgICAgICAgLy8gc3luY2hyb25pemUgdGhlIHRocmVhZHMgYWdhaW4gdG8gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAvLyBkbyBub3QgaGF2ZSBhbnkgcnVuLWF3YXkgdGhyZWFkcyB0aGF0IGNhdXNlIGEgcmFjZQorICAgICAgICAgICAgLy8gb24gdGhlIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgbm90IG9jY3VyCisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfbm9yZXE6CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK1F1ZXJ5IGZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMuCitDYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgorIAoraWYgKGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhrbXBfY2FuY2VsX3BhcmFsbGVsKSkgeworICAgIHBlcmZvcm1fY2xlYW51cCgpOworICAgICNwcmFnbWEgb21wIGNhbmNlbGxhdGlvbiBwb2ludCBwYXJhbGxlbCAgICAgIAorfQorKi8KK2ludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpIHsKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChjYW5jZWxfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9raW5kOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjZjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMKQEAgLTAsMCArMSwyMzY4IEBACisvKgorICoga21wX2NzdXBwb3J0LmMgLS0ga2Zyb250IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0MjgyNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0yMCAwMzozOTo0NSAtMDYwMCAoV2VkLCAyMCBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib21wLmgiICAgICAgICAvKiBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBvZiB1c2VyLXZpc2libGUgcm91dGluZXMgKi8KKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIGZsYWdzIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUsIGUuZy4sIHRvIGltcGxlbWVudCAqLworLyogIG9wZW5tcF9zdHJpY3QgbGlicmFyeSByZXN0cmljdGlvbnMgICAgICAgICAgICAgICAqLworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2MgICBpbiAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICogQHBhcmFtIGZsYWdzIGluICAgZm9yIGZ1dHVyZSB1c2UgKGN1cnJlbnRseSBpZ25vcmVkKQorICoKKyAqIEluaXRpYWxpemUgdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBjYWxsIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBub3QgbWFkZSB0aGVuCisgKiBpdCB3aWxsIGJlIGltcGxpY2lsdHkgY2FsbGVkIGJ5IGF0dGVtcHRzIHRvIHVzZSBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAqCisgKi8KK3ZvaWQKK19fa21wY19iZWdpbihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBmbGFncykKK3sKKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wX2lnbm9yZV9tcHBiZWcoKSByZXR1cm5zIFRSVUUuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBiZWcoKSA9PSBGQUxTRSkgeworICAgICAgICBfX2ttcF9pbnRlcm5hbF9iZWdpbigpOworCisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmVnaW46IGNhbGxlZFxuIiApICk7CisgICAgfQorfQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKgorICogU2h1dGRvd24gdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBpcyBhbHNvIG9wdGlvbmFsLCBhbmQgZXZlbiBpZiBjYWxsZWQgd2lsbCBub3QKKyAqIGRvIGFueXRoaW5nIHVubGVzcyB0aGUgYEtNUF9JR05PUkVfTVBQRU5EYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gemVyby4KKyAgKi8KK3ZvaWQKK19fa21wY19lbmQoaWRlbnRfdCAqbG9jKQoreworICAgIC8vIEJ5IGRlZmF1bHQsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIFRSVUUgd2hpY2ggbWFrZXMgX19rbXBjX2VuZCgpIGNhbGwgbm8tb3AuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIEtNUF9JR05PUkVfTVBQRU5EIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIC8vIElmIEtNUF9JR05PUkVfTVBQRU5EIGlzIDAsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIEZBTFNFIGFuZCBfX2ttcGNfZW5kKCkKKyAgICAvLyB3aWxsIHVucmVnaXN0ZXIgdGhpcyByb290IChpdCBjYW4gY2F1c2UgbGlicmFyeSBzaHV0IGRvd24pLgorICAgIGlmIChfX2ttcF9pZ25vcmVfbXBwZW5kKCkgPT0gRkFMU0UpIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmQ6IGNhbGxlZFxuIiApICk7CisgICAgICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcGNfZW5kXG4iICkpOworCisgICAgICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIC0xICk7CisgICAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgZ2xvYmFsIHRocmVhZCBpbmRleCBvZiB0aGUgYWN0aXZlIHRocmVhZC4KKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorCitJZiB0aGUgcnVudGltZSBoYXMgb255IGJlZW4gZW50ZXJlZCBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIGZyb20gYQorc2luZ2xlIChuZWNlc3NhcmlseSBub24tT3Blbk1QPHN1cD4qPC9zdXA+KSB0aHJlYWQsIHRoZW4gdGhlIHRocmVhZCBudW1iZXIgaXMgdGhhdAord2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkgQHJlZiBvbXBfZ2V0X3RocmVhZF9udW0oKSBpbiB0aGUgb3V0ZXJtb3N0CithY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LiAoT3IgemVybyBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcGFyYWxsZWwKK2NvbnN0cnVjdCwgc2luY2UgdGhlIG1hc3RlciB0aHJlYWQgaXMgbmVjZXNzYXJpbHkgdGhyZWFkIHplcm8pLgorCitJZiBtdWx0aXBsZSBub24tT3Blbk1QIHRocmVhZHMgYWxsIGVudGVyIGFuIE9wZW5NUCBjb25zdHJ1Y3QgdGhlbiB0aGlzCit3aWxsIGJlIGEgdW5pcXVlIHRocmVhZCBpZGVudGlmaWVyIGFtb25nIGFsbCB0aGUgdGhyZWFkcyBjcmVhdGVkIGJ5Cit0aGUgT3Blbk1QIHJ1bnRpbWUgKGJ1dCB0aGUgdmFsdWUgY2Fubm90ZSBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCitPcGVuTVAgdGhyZWFkIGlkcyByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSkuCisKKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtOiBUIyVkXG4iLCBndGlkICkgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgY29udHJvbCBvZiB0aGUgT3Blbk1QPHN1cD4qPC9zdXA+IHJ1bnRpbWUKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorSXQgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE9wZW5NUCBydW50aW1lLiBUaGF0IGlzCitub3QgYSBudW1iZXIgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBhbnkgT3Blbk1QIHN0YW5kYXJkIGNhbGxzLCBzaW5jZSB0aGUgbGlicmFyeSBtYXkgYmUKK2NhbGxlZCBmcm9tIG1vcmUgdGhhbiBvbmUgbm9uLU9wZW5NUCB0aHJlYWQsIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSB0b3RhbCBvdmVyIGFsbCBzdWNoIGNhbGxzLgorU2ltaWxhcmx5IHRoZSBydW50aW1lIG1haW50YWlucyB1bmRlcmx5aW5nIHRocmVhZHMgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBhY3RpdmUgKHNpbmNlIHRoZSBjb3N0CitvZiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBPUyB0aHJlYWRzIGlzIGhpZ2gpLCB0aGlzIGNhbGwgY291bnRzIGFsbCBzdWNoIHRocmVhZHMgZXZlbiBpZiB0aGV5IGFyZSBub3QKK3dhaXRpbmcgZm9yIHdvcmsuCisqLwora21wX2ludDMyCitfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkczogbnVtX3RocmVhZHMgPSAlZFxuIiwgX19rbXBfbnRoICkgKTsKKworICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIgKSApOworICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF9udW1fdGhyZWFkczogY2FsbGVkXG4iICkgKTsKKworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKK30KKworLyohCisgKiBAaW5ncm91cCBERVBSRUNBVEVECisgKiBAcGFyYW0gbG9jIGxvY2F0aW9uIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBjYWxsZWQuIEl0IGFsd2F5cyByZXR1cm5zIFRSVUUuCisgKi8KK2ttcF9pbnQzMgorX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqbG9jKQoreworI2lmbmRlZiBLTVBfREVCVUcKKworICAgIHJldHVybiBUUlVFOworCisjZWxzZQorCisgICAgY29uc3QgY2hhciAqc2VtaTI7CisgICAgY29uc3QgY2hhciAqc2VtaTM7CisgICAgaW50IGxpbmVfbm87CisKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlID09IDApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gbG9jLT5wc291cmNlOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzZW1pMiAtIDE7CisgICAgICAgIHdoaWxlICgobmFtZSA+IGxvYy0+cHNvdXJjZSkgJiYgKCpuYW1lICE9ICcvJykgJiYgKCpuYW1lICE9ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpuYW1lID09ICcvJykgfHwgKCpuYW1lID09ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIHNlbWkzID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbMF0pIHsKKyAgICAgICAgaWYgKChzZW1pMyAhPSBOVUxMKSAmJiAoc2VtaTMgPiBzZW1pMikKKyAgICAgICAgICAmJiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwgc2VtaTIgKyAxLCBzZW1pMyAtIHNlbWkyIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3NjYW5mKHNlbWkzICsgMSwgIiVkIiwgJmxpbmVfbm8pID09IDEpIHsKKyAgICAgICAgaWYgKChsaW5lX25vID49IF9fa21wX3Bhcl9yYW5nZV9sYikgJiYgKGxpbmVfbm8gPD0gX19rbXBfcGFyX3JhbmdlX3ViKSkgeworICAgICAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA+IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA8IDA7CisgICAgfQorICAgIHJldHVybiBUUlVFOworCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBpcyBleGVjdXRpbmcgaW5zaWRlIGFuIGFjdGl2ZSBwYXJhbGxlbCByZWdpb24sIHplcm8gaWYgbm90LgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2luX3BhcmFsbGVsKCBpZGVudF90ICpsb2MgKQoreworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmU7Cit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV90aHJlYWRzIG51bWJlciBvZiB0aHJlYWRzIHJlcXVlc3RlZCBmb3IgdGhpcyBwYXJhbGxlbCBjb25zdHJ1Y3QKKworU2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBuZXh0IGZvcmsgc3Bhd25lZCBieSB0aGlzIHRocmVhZC4KK1RoaXMgY2FsbCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QgaGFzIGEgYG51bV90aHJlYWRzYCBjbGF1c2UuCisqLwordm9pZAorX19rbXBjX3B1c2hfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfbnVtX3RocmVhZHM6IGVudGVyIFQjJWQgbnVtX3RocmVhZHM9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBudW1fdGhyZWFkcyApICk7CisKKyAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCBsb2MsIGdsb2JhbF90aWQsIG51bV90aHJlYWRzICk7Cit9CisKK3ZvaWQKK19fa21wY19wb3BfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wb3BfbnVtX3RocmVhZHM6IGVudGVyXG4iICkgKTsKKworICAgIC8qIHRoZSBudW1fdGhyZWFkcyBhcmUgYXV0b21hdGljYWxseSBwb3BwZWQgKi8KK30KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKwordm9pZAorX19rbXBjX3B1c2hfcHJvY19iaW5kKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBwcm9jX2JpbmQgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcHVzaF9wcm9jX2JpbmQ6IGVudGVyIFQjJWQgcHJvY19iaW5kPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgcHJvY19iaW5kICkgKTsKKworICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCBsb2MsIGdsb2JhbF90aWQsIChrbXBfcHJvY19iaW5kX3QpcHJvY19iaW5kICk7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGFyZ2MgIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGVsbGlwc2lzCitAcGFyYW0gbWljcm90YXNrICBwb2ludGVyIHRvIGNhbGxiYWNrIHJvdXRpbmUgY29uc2lzdGluZyBvZiBvdXRsaW5lZCBwYXJhbGxlbCBjb25zdHJ1Y3QKK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgZ2xvYmFsCisKK0RvIHRoZSBhY3R1YWwgZm9yayBhbmQgY2FsbCB0aGUgbWljcm90YXNrIGluIHRoZSByZWxldmFudCBudW1iZXIgb2YgdGhyZWFkcy4KKyovCit2b2lkCitfX2ttcGNfZm9ya19jYWxsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pCit7CisgIGludCAgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIC8vIG1heWJlIHRvIHNhdmUgdGhyX3N0YXRlIGlzIGVub3VnaCBoZXJlCisgIHsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgVFJVRSwKKyAgICAgICAgICAgIGFyZ2MsCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKG1pY3JvdGFza190KSBtaWNyb3Rhc2ssCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSAgICBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgJmFwCisjZWxzZQorICAgICAgICAgICAgYXAKKyNlbmRpZgorICAgICAgICAgICAgKTsKKyAgICBfX2ttcF9qb2luX2NhbGwoIGxvYywgZ3RpZCApOworCisgICAgdmFfZW5kKCBhcCApOworICB9Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3RlYW1zIG51bWJlciBvZiB0ZWFtcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKworU2V0IHRoZSBudW1iZXIgb2YgdGVhbXMgdG8gYmUgdXNlZCBieSB0aGUgdGVhbXMgY29uc3RydWN0LgorVGhpcyBjYWxsIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIHRlYW1zIGNvbnN0cnVjdCBoYXMgYSBgbnVtX3RlYW1zYCBjbGF1c2UKK29yIGEgYHRocmVhZF9saW1pdGAgY2xhdXNlIChvciBib3RoKS4KKyovCit2b2lkCitfX2ttcGNfcHVzaF9udW1fdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfbnVtX3RlYW1zOiBlbnRlciBUIyVkIG51bV90ZWFtcz0lZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGVhbXMoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3RlYW1zLCBudW1fdGhyZWFkcyApOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikKK3sKKyAgICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworICAgIC8vIHJlbWVtYmVyIHRlYW1zIGVudHJ5IHBvaW50IGFuZCBuZXN0aW5nIGxldmVsCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWljcm90YXNrID0gbWljcm90YXNrOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19sZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7IC8vIEFDOiBjYW4gYmUgPjAgb24gaG9zdAorCisgICAgLy8gY2hlY2sgaWYgX19rbXBjX3B1c2hfbnVtX3RlYW1zIGNhbGxlZCwgc2V0IGRlZmF1bHQgbnVtYmVyIG9mIHRlYW1zIG90aGVyd2lzZQorICAgIGlmICggdGhpc190aHItPnRoLnRoX3NldF9udGhfdGVhbXMgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcHVzaF9udW1fdGVhbXMoIGxvYywgZ3RpZCwgMCwgMCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF9zZXRfbnByb2MgPj0gMSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfc2V0X250aF90ZWFtcyA+PSAxKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBUUlVFLAorICAgICAgICAgICAgYXJnYywKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIF9fa21wX3RlYW1zX21hc3RlciwKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgJmFwCisjZWxzZQorICAgICAgICAgICAgYXAKKyNlbmRpZgorICAgICAgICAgICAgKTsKKyAgICBfX2ttcF9qb2luX2NhbGwoIGxvYywgZ3RpZCApOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX21pY3JvdGFzayA9IE5VTEw7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID0gMDsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8vCisvLyBJIGRvbid0IHRoaW5rIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkLgorLy8gVGhlIF9fa21wY18gcHJlZml4IHdhcyBtaXNhcHBsaWVkLiAgSSdtIGZhaXJseSBjZXJ0YWluIHRoYXQgbm8gZ2VuZXJhdGVkCisvLyBvcGVubXAgY29kZSBldmVyIGNhbGxlZCBpdCwgYnV0IGl0J3MgYmVlbiBleHBvcnRlZCBmcm9tIHRoZSBSVEwgZm9yIHNvCisvLyBsb25nIHRoYXQgSSdtIGFmcmFpZCB0byByZW1vdmUgdGhlIGRlZmluaXRpb24uCisvLworaW50CitfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9pbnZva2VfdGFza19mdW5jKCBndGlkICk7Cit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK0VudGVyIGEgc2VyaWFsaXplZCBwYXJhbGxlbCBjb25zdHJ1Y3QuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIGEKK2NvbmRpdGlvbmFsIHBhcmFsbGVsIHJlZ2lvbiwgbGlrZSB0aGlzLAorQGNvZGUKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChjb25kaXRpb24pCitAZW5kY29kZQord2hlbiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorKi8KK3ZvaWQKK19fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHI7CisgICAga21wX3RlYW1fdCAqc2VyaWFsX3RlYW07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IGNhbGxlZCBieSBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8qIFNraXAgYWxsIHRoaXMgY29kZSBmb3IgYXV0b3BhciBzZXJpYWxpemVkIGxvb3BzIHNpbmNlIGl0IHJlc3VsdHMgaW4KKyAgICAgICB1bmFjY2VwdGFibGUgb3ZlcmhlYWQgKi8KKyAgICBpZiggbG9jICE9IE5VTEwgJiYgKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQVVUT1BBUiApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIHRoaXNfdGhyICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBzZXJpYWxfdGVhbSAgPSB0aGlzX3RociAtPiB0aC50aF9zZXJpYWxfdGVhbTsKKworICAgIC8qIHV0aWxpemUgdGhlIHNlcmlhbGl6ZWQgdGVhbSBoZWxkIGJ5IHRoaXMgdGhyZWFkICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfTUIoKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtID09IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2tfdGVhbSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGFza190ZWFtID09IE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBwdXNoaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXAsIG5ldyB0YXNrX3RlYW0gPSBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtLCB0aGlzX3RociAtPiB0aC50aF90ZWFtICkgKTsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kOworICAgIGlmICggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPT0gcHJvY19iaW5kX2ZhbHNlICkgeworICAgICAgICBwcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKCBwcm9jX2JpbmQgPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vIHByb2NfYmluZCBjbGF1c2Ugd2FzIHNwZWNpZmllZCwgc28gdXNlIHRoZSBjdXJyZW50IHZhbHVlCisgICAgICAgIC8vIG9mIHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAvLworICAgICAgICBwcm9jX2JpbmQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZDsKKyAgICB9CisgICAgLy8KKyAgICAvLyBSZXNldCBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAgICAvLworICAgIHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjZW5kaWYgLyogT01QXzNfRU5BQkxFRCAqLworCisgICAgaWYoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gIT0gc2VyaWFsX3RlYW0gKSB7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgICAgICBpbnQgbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOworI2VuZGlmCisgICAgICAgIGlmKCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgICAgICogVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICAgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKyAgICAgICAgICAgIGludCB0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAgICAgICAgIG5ld190ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSh0aGlzX3Roci0+dGgudGhfcm9vdCwgMSwgMSwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NldF9ucHJvY1t0aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X2R5bmFtaWNbdGlkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NldF9uZXN0ZWRbdGlkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbdGlkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbdGlkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NldF9idF9zZXRbdGlkXSwKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIG5ld190ZWFtICk7CisKKyAgICAgICAgICAgIC8qIHNldHVwIG5ldyBzZXJpYWxpemVkIHRlYW0gYW5kIGluc3RhbGwgaXQgKi8KKyAgICAgICAgICAgIG5ld190ZWFtIC0+IHQudF90aHJlYWRzWzBdID0gdGhpc190aHI7CisgICAgICAgICAgICBuZXdfdGVhbSAtPiB0LnRfcGFyZW50ID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICAgICAgICAgIHNlcmlhbF90ZWFtID0gbmV3X3RlYW07CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGFsbG9jYXRlZCBuZXcgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworCisKKyAgICAgICAgICAgIC8qIFRPRE8gdGhlIGFib3ZlIGJyZWFrcyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBpZiB3ZSBydW4gb3V0IG9mCisgICAgICAgICAgICAgKiByZXNvdXJjZXMsIHRoZW4gd2UgY2FuIHN0aWxsIGd1YXJhbnRlZSB0aGF0IHNlcmlhbGl6ZWQgdGVhbXMKKyAgICAgICAgICAgICAqIGFyZSBvaywgc2luY2Ugd2UgbWF5IG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHJldXNpbmcgY2FjaGVkIHNlcmlhbCB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHNlcmlhbCB0ZWFtICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gIT0gc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2lkZW50ICAgICAgICAgPSBsb2M7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICAgID0gMTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X25wcm9jICAgICAgICAgPSAxOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50ICAgICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zY2hlZCAgICAgICAgID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9zY2hlZDsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtICAgICAgICAgICA9IHNlcmlhbF90ZWFtOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfbWFzdGVyX3RpZCAgICA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjZCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3Rociwgc2VyaWFsX3RlYW0sIDAgKTsKKworICAgICAgICAvKiBUT0RPOiBHRUg6IGRvIHRoZSBJQ1ZzIHdvcmsgZm9yIG5lc3RlZCBzZXJpYWxpemVkIHRlYW1zPyAgRG9uJ3Qgd2UgbmVlZCBhbiBpbXBsaWNpdCB0YXNrIGZvcgorICAgICAgICAgICBlYWNoIHNlcmlhbGl6ZWQgdGFzayByZXByZXNlbnRlZCBieSB0ZWFtLT50LnRfc2VyaWFsaXplZD8gKi8KKyAgICAgICAgY29weV9pY3ZzKAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgICAgICAvLyBUaHJlYWQgdmFsdWUgZXhpc3RzIGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZm9yIHRoZSBuZXh0IG5lc3RlZCBsZXZlbAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyA9IF9fa21wX25lc3RlZF9udGgubnRoWyBsZXZlbCArIDEgXTsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kCisgICAgICAgICAgICAgICAgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbIGxldmVsICsgMSBdOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2Vsc2UgLyogcHJlLTMuMCBpY3YncyAqLworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X25wcm9jWzBdICA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT4KKyAgICAgICAgICAgIHQudF9zZXRfbnByb2Nbc2VyaWFsX3RlYW0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRfbWFzdGVyX3RpZF07CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfZHluYW1pY1swXSA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT4KKyAgICAgICAgICAgIHQudF9zZXRfZHluYW1pY1tzZXJpYWxfdGVhbS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50X21hc3Rlcl90aWRdOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X25lc3RlZFswXSA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT4KKyAgICAgICAgICAgIHQudF9zZXRfbmVzdGVkW3NlcmlhbF90ZWFtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudF9tYXN0ZXJfdGlkXTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NldF9ibG9ja3RpbWVbMF0gID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPgorICAgICAgICAgICAgdC50X3NldF9ibG9ja3RpbWVbc2VyaWFsX3RlYW0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50X21hc3Rlcl90aWRdOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1swXSA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT4KKyAgICAgICAgICAgIHQudF9zZXRfYnRfaW50ZXJ2YWxzW3NlcmlhbF90ZWFtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudF9tYXN0ZXJfdGlkXTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NldF9idF9zZXRbMF0gPSBzZXJpYWxfdGVhbS0+dC50X3BhcmVudC0+CisgICAgICAgICAgICB0LnRfc2V0X2J0X3NldFtzZXJpYWxfdGVhbS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRfbWFzdGVyX3RpZF07CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aWQgPSAwOworCisgICAgICAgIC8qIHNldCB0aHJlYWQgY2FjaGUgdmFsdWVzICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2MgICAgID0gMTsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9tYXN0ZXIgICAgPSB0aGlzX3RocjsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9zZXJpYWxpemVkID0gMTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9sZXZlbCAgICAgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF9sZXZlbCArIDE7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9hY3RpdmVfbGV2ZWwgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF9hY3RpdmVfbGV2ZWw7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKSB7CisgICAgICAgICAgICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCggJnNlcmlhbF90ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgICAgIF9fa21wX3N0b3JlX214Y3NyKCAmc2VyaWFsX3RlYW0tPnQudF9teGNzciApOworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9teGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgICAgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gYWxsb2NhdGUgZGlzcGF0Y2ggYnVmZmVycyBzdGFjayAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgICAgICBpZiAoICFzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciApIHsKKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICopCisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKSApOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworICAgICAgICBLTVBfTUIoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgc2VyaWFsaXplZCB0ZWFtIGlzIGFscmVhZHkgYmVpbmcgdXNlZCwKKyAgICAgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyICk7CisgICAgICAgICsrIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICAgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQgbGV2ZWwKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsKys7CisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgaW5jcmVhc2luZyBuZXN0aW5nIGxldmVsIG9mIHNlcmlhbCB0ZWFtICVwIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0sIHNlcmlhbF90ZWFtIC0+IHQudF9sZXZlbCApICk7CisjZWxzZQorICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHJldXNpbmcgdGVhbSAlcCBmb3IgbmVzdGVkIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAgLyogYWxsb2NhdGUvcHVzaCBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICogZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgICAgICBkaXNwX2J1ZmZlci0+bmV4dCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyOworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSBkaXNwX2J1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICB0aGlzX3RociAtPiB0aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKKy8vIHRfbGV2ZWwgaXMgbm90IGF2YWlsYWJsZSBpbiAyLjUgYnVpbGQsIHNvIGNoZWNrIGZvciBPTVBfMzBfRU5BQkxFRAorI2lmIFVTRV9JVFRfQlVJTEQgJiYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBNYXJrIHRoZSBzdGFydCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICB7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggZ2xvYmFsX3RpZCwgMSApOworICAgIH0KKyAgICBpZiggKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSAmJiBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICYmIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICkKKyAgICB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWwgPT0gMSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lX3NlcmlhbGl6ZWQgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworTGVhdmUgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICp0b3A7CisgICAga21wX2luZm9fdCAqdGhpc190aHI7CisgICAga21wX3RlYW1fdCAqc2VyaWFsX3RlYW07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBza2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE5vdCBhdXRvcGFyIGNvZGUKKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGhpc190aHIgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW07CisKKyAgICBLTVBfTUIoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfdGVhbSA9PSBzZXJpYWxfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtICE9IHRoaXNfdGhyLT50aC50aF9yb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworCisgICAgLyogSWYgbmVjZXNzYXJ5LCBwb3AgdGhlIGludGVybmFsIGNvbnRyb2wgc3RhY2sgdmFsdWVzIGFuZCByZXBsYWNlIHRoZSB0ZWFtIHZhbHVlcyAqLworICAgIHRvcCA9IHNlcmlhbF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcDsKKyAgICBpZiAoIHRvcCAmJiB0b3AgLT4gc2VyaWFsX25lc3RpbmdfbGV2ZWwgPT0gc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgY29weV9pY3ZzKAorICAgICAgICAgICAgICAgICAgJnNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgdG9wICk7CisjZWxzZQorICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X25wcm9jWzBdICAgPSB0b3AgLT4gbnByb2M7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfZHluYW1pY1swXSA9IHRvcCAtPiBkeW5hbWljOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X25lc3RlZFswXSAgPSB0b3AgLT4gbmVzdGVkOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2Jsb2NrdGltZVswXSAgID0gdG9wIC0+IGJsb2NrdGltZTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NldF9idF9pbnRlcnZhbHNbMF0gPSB0b3AgLT4gYnRfaW50ZXJ2YWxzOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2J0X3NldFswXSAgPSB0b3AgLT4gYnRfc2V0OworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcCA9IHRvcCAtPiBuZXh0OworICAgICAgICBfX2ttcF9mcmVlKHRvcCk7CisgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvL2lmKCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA+IDEgKQorICAgIHNlcmlhbF90ZWFtIC0+IHQudF9sZXZlbC0tOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAvKiBwb3AgZGlzcGF0Y2ggYnVmZmVycyBzdGFjayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpOworICAgIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlci0+bmV4dDsKKyAgICAgICAgX19rbXBfZnJlZSggZGlzcF9idWZmZXIgKTsKKyAgICB9CisKKyAgICAtLSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICBpZiAoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID09IDAgKSB7CisKKyAgICAgICAgLyogcmV0dXJuIHRvIHRoZSBwYXJhbGxlbCBzZWN0aW9uICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmIHNlcmlhbF90ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZzZXJpYWxfdGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgICAgICAgICBfX2ttcF9sb2FkX214Y3NyKCAmc2VyaWFsX3RlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gICAgICAgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudDsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aWQgPSBzZXJpYWxfdGVhbSAtPiB0LnRfbWFzdGVyX3RpZDsKKworICAgICAgICAvKiByZXN0b3JlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jICAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X25wcm9jOyAgICAgICAgICAvKiAgSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbWFzdGVyICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfdGhyZWFkc1swXTsgICAgIC8qIEpQSCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8qIFRPRE8gdGhlIGJlbG93IHNob3VsZG4ndCBuZWVkIHRvIGJlIGFkanVzdGVkIGZvciBzZXJpYWxpemVkIHRlYW1zICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+CisgICAgICAgICAgICB0LnRfZGlzcGF0Y2hbIHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkIF07CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCB0aGlzX3RociApOworCisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBuZXcgY2hpbGQgLyBvbGQgcGFyZW50IHRlYW0KKyAgICAgICAgICAgIC8vIHRvIHRoZSB0aHJlYWQuICBJZiBub24tTlVMTCwgY29weSB0aGUgc3RhdGUgZmxhZyBhbHNvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0gPSB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrX3RlYW0gKSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfc3RhdGUgPSB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0gLT4gdHQudHRfc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCByZXN0b3JpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gKSApOworICAgICAgICB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIH0KKyAgICBlbHNlIHsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBkZWNyZWFzaW5nIG5lc3RpbmcgZGVwdGggb2Ygc2VyaWFsIHRlYW0gJXAgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0sIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICB9CisKKy8vIHRfbGV2ZWwgaXMgbm90IGF2YWlsYWJsZSBpbiAyLjUgYnVpbGQsIHNvIGNoZWNrIGZvciBPTVBfMzBfRU5BQkxFRAorI2lmIFVTRV9JVFRfQlVJTEQgJiYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBNYXJrIHRoZSBlbmQgb2YgdGhlICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudC4KKyAgICBpZiAoICggX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgJiYgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApIHx8IEtNUF9JVFRfREVCVUcgKQorICAgIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2lkZW50ID0gbG9jOworICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggZ2xvYmFsX3RpZCwgMSApOworICAgIH0KKyAgICBpZiggKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSAmJiBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICkgeworICAgICAgICBpZiggdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbCA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWVfc2VyaWFsaXplZCwgX19pdHRfdGltZXN0YW1wX25vbmUsIDAsIGxvYyApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gLi4uICBwb2ludGVycyB0byB0aGUgdmFyaWFibGVzIHRvIGJlIHN5bmNocm9uaXplZC4KKworRXhlY3V0ZSA8dHQ+Zmx1c2g8L3R0Pi4gVGhlIHBvaW50ZXJzIHRvIHRoZSB2YXJpYWJsZXMgdG8gYmUgZmx1c2hlZAorbmVlZCBub3QgYWN0dWFsbHkgYmUgcGFzc2VkLCAoaW5kZWVkIHVubGVzcyB0aGlzIGlzIGEgemVybyB0ZXJtaW5hdGVkCitsaXN0IHRoZXkgY2FuJ3QgYmUgc2luY2UgdGhlcmUncyBubyBjb3VudCBoZXJlIHNvIHdlIGRvbid0IGtub3cgaG93CittYW55IHRoZXJlIGFyZSEpLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bGwgbWVtb3J5IGZlbmNlLiAoVGhvdWdoCitkZXBlbmRpbmcgb24gdGhlIG1lbW9yeSBvcmRlcmluZyBjb252ZW50aW9uIG9iZXllZCBieSB0aGUgY29tcGlsZXIKK2V2ZW4gdGhhdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSkuCisqLwordm9pZAorX19rbXBjX2ZsdXNoKGlkZW50X3QgKmxvYywgLi4uKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZmx1c2g6IGNhbGxlZFxuIiApICk7CisKKyAgICAvKiBuZWVkIGV4cGxpY2l0IF9fbWYoKSBoZXJlIHNpbmNlIHVzZSB2b2xhdGlsZSBpbnN0ZWFkIGluIGxpYnJhcnkgKi8KKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8vIFRoaXMgaXMgbm90IGFuIE9NUCAzLjAgZmVhdHVyZS4KKyAgICAvLyBUaGlzIG1hY3JvIGlzIHVzZWQgaGVyZSBqdXN0IG5vdCB0byBsZXQgdGhlIGNoYW5nZSBnbyB0byAxMC4xLgorICAgIC8vIFRoaXMgY2hhbmdlIHdpbGwgZ28gdG8gdGhlIG1haW5saW5lIGZpcnN0LgorICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgICAgICNpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgLy8gZmVuY2Utc3R5bGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBleGlzdCwgYnV0IGxvY2s7IHhhZGRsICQwLCglcnNwKSBjYW4gYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBpdCwgdGhvdWdoLCBzaW5jZSB0aGUgQUJJIHJ1bGVzIHJlcXVpcmUgdGhhdAorICAgICAgICAgICAgICAgIC8vICogSWYgdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyBOR08gc3RvcmVzIGl0IGFsc28gZ2VuZXJhdGVzIHRoZSBmZW5jZQorICAgICAgICAgICAgICAgIC8vICogSWYgdXNlcnMgaGFuZC1jb2RlIE5HTyBzdG9yZXMgdGhleSBzaG91bGQgaW5zZXJ0IHRoZSBmZW5jZQorICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBubyBpbmNvbXBsZXRlIHVub3JkZXJlZCBzdG9yZXMgc2hvdWxkIGJlIHZpc2libGUuCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIC8vIEM3NDQwNAorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYWRkcmVzcyBub24tdGVtcG9yYWwgc3RvcmUgaW5zdHJ1Y3Rpb25zIChzZmVuY2UgbmVlZGVkKS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xmbHVzaCBpbnN0cnVjdGlvbiBpcyBhZGRyZXNzZWQgZWl0aGVyIChtZmVuY2UgbmVlZGVkKS4KKyAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgbm9uLXRlbXBvcmFsIGxvYWQgbW9udnRkcWEgaW5zdHJ1Y3Rpb24gc2hvdWxkIGFsc28gYmUgYWRkcmVzc2VkLgorICAgICAgICAgICAgICAgIC8vIG1mZW5jZSBpcyBhIFNTRTIgaW5zdHJ1Y3Rpb24uIERvIG5vdCBleGVjdXRlIGl0IGlmIENQVSBpcyBub3QgU1NFMi4KKyAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uc3NlMiApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ1BVIGNhbm5vdCBleGVjdXRlIFNTRTIgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICAgICAgICAgICAgIF9tbV9tZmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfTUlDCisgICAgICAgICNlbGlmIEtNUF9BUkNIX0FSTQorICAgICAgICAgICAgLy8gTm90aGluZyB5ZXQKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KKworRXhlY3V0ZSBhIGJhcnJpZXIuCisqLwordm9pZAorX19rbXBjX2JhcnJpZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBpbnQgZXhwbGljaXRfYmFycmllcl9mbGFnOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworICAgIH0KKworICAgIF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXS0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgLy8gVE9ETzogZXhwbGljaXQgYmFycmllcl93YWl0X2lkOgorICAgIC8vICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAnYmFycmllcicgZGlyZWN0aXZlIGlzIHByZXNlbnQgb3IKKyAgICAvLyAgIGltcGxpY2l0IGJhcnJpZXIgYXQgdGhlIGVuZCBvZiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLyAxKSBiZXR0ZXIgdG8gYWRkIGEgcGVyLXRocmVhZCBiYXJyaWVyIGNvdW50ZXIgdG8gYSB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUKKyAgICAvLyAyKSBzZXQgdG8gMCB3aGVuIGEgbmV3IHRlYW0gaXMgY3JlYXRlZAorICAgIC8vIDQpIG5vIHN5bmMgaXMgcmVxdWlyZWQKKworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIE1BU1RFUiBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGJsb2NrLCAwIG90aGVyd2lzZS4KKyovCitrbXBfaW50MzIKK19fa21wY19tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYoIEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKQorICAgICAgICBzdGF0dXMgPSAxOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jLCBOVUxMICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jLCBOVUxMICk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5tYXN0ZXI8L3R0PiByZWdpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSB0aHJlYWQKK3RoYXQgZXhlY3V0ZXMgdGhlIDx0dD5tYXN0ZXI8L3R0PiByZWdpb24uCisqLwordm9pZAorX19rbXBjX2VuZF9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggZ2xvYmFsX3RpZCA8IDAgKQorICAgICAgICAgICAgS01QX1dBUk5JTkcoIFRocmVhZElkZW50SW52YWxpZCApOworCisgICAgICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYyApOworICAgIH0KK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBndGlkICBnbG9iYWwgdGhyZWFkIG51bWJlci4KKworU3RhcnQgZXhlY3V0aW9uIG9mIGFuIDx0dD5vcmRlcmVkPC90dD4gY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19vcmRlcmVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IGNpZCA9IDA7CisgICAga21wX2luZm9fdCAqdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfb3JkZXJlZDogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoIGd0aWQgKTsKKyAgICAvLyBUT0RPOiBvcmRlcmVkX3dhaXRfaWQKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiAhPSAwICkKKyAgICAgICAgKCp0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24pKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKyAgICBlbHNlCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2RlbyggJiBndGlkLCAmIGNpZCwgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK0VuZCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9vcmRlcmVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IGNpZCA9IDA7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCApICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9keG8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworfQorCitpbmxpbmUgdm9pZAorX19rbXBfc3RhdGljX3lpZWxkKCBpbnQgYXJnICkgeyAvLyBBQzogbmVlZGVkIGluIG1hY3JvIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCitzdGF0aWMga21wX3VzZXJfbG9ja19wCitfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgaWRlbnRfdCBjb25zdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91c2VyX2xvY2tfcCAqbGNrX3BwID0gKGttcF91c2VyX2xvY2tfcCAqKWNyaXQ7CisKKyAgICAvLworICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGRvdWJsZS1jaGVjaywgdGhlIGZvbGxvd2luZyBsb2FkCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHZvbGF0aWxlLgorICAgIC8vCisgICAga21wX3VzZXJfbG9ja19wIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApVENSX1BUUiggKmxja19wcCApOworCisgICAgaWYgKCBsY2sgPT0gTlVMTCApIHsKKyAgICAgICAgdm9pZCAqIGlkeDsKKworICAgICAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGxvY2suCisgICAgICAgIC8vIFJlbWVtYmVyIGFsbG9jYXRlZCBsb2NrcyBpbiB0YWJsZSBpbiBvcmRlciB0byBmcmVlIHRoZW0gaW4gX19rbXBfY2xlYW51cCgpCisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggJmlkeCwgZ3RpZCwga21wX2xmX2NyaXRpY2FsX3NlY3Rpb24gKTsKKyAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjayApOworICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCBsY2sgKTsKKyAgICAgICAgICAgIC8vIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZygpIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IHVzYWdlIG9mIHVuZGVybHlpbmcKKyAgICAgICAgICAgIC8vIGxvY2suIEl0IGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGNhbiBndWFyYW50ZWUgaXQuIFRoZXJlIGFyZSBjaGFuY2VzIHRoZSBsb2NrIHdpbGwKKyAgICAgICAgICAgIC8vIGRlc3Ryb3llZCB3aXRoIG5vIHVzYWdlLCBidXQgaXQgaXMgbm90IGEgcHJvYmxlbSwgYmVjYXVzZSB0aGlzIGlzIG5vdCByZWFsIGV2ZW50IHNlZW4KKyAgICAgICAgICAgIC8vIGJ5IHVzZXIgYnV0IHJhdGhlciBzZXR0aW5nIG5hbWUgZm9yIG9iamVjdCAobG9jaykuIFNlZSBtb3JlIGRldGFpbHMgaW4ga21wX2l0dC5oLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLworICAgICAgICAvLyBVc2UgYSBjbXB4Y2hnIGluc3RydWN0aW9uIHRvIHNsYW0gdGhlIHN0YXJ0IG9mIHRoZSBjcml0aWNhbAorICAgICAgICAvLyBzZWN0aW9uIHdpdGggdGhlIGxvY2sgcG9pbnRlci4gIElmIGFub3RoZXIgdGhyZWFkIGJlYXQgdXMKKyAgICAgICAgLy8gdG8gaXQsIGRlYWxsb2NhdGUgdGhlIGxvY2ssIGFuZCB1c2UgdGhlIGxvY2sgdGhhdCB0aGUgb3RoZXIKKyAgICAgICAgLy8gdGhyZWFkIGFsbG9jYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgaW50IHN0YXR1cyA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoIGxja19wcCwgMCwgbGNrICk7CisKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGxvY2sgYW5kIHJlbG9hZCB0aGUgdmFsdWUuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCggbGNrICk7CisgICAgICAgICAgICAgICAgLy8gTGV0IElUVCBrbm93IHRoZSBsb2NrIGlzIGRlc3Ryb3llZCBhbmQgdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uIG1heSBiZSByZXVzZWQgZm9yCisgICAgICAgICAgICAgICAgLy8gYW5vdGhlciBwdXJwb3NlLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2sgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCAmaWR4LCBndGlkLCBsY2sgKTsKKyAgICAgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApVENSX1BUUiggKmxja19wcCApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbGNrICE9IE5VTEwgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGNrOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3QuCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24uCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkgeworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY3JpdGljYWw6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8vVE9ETzogYWRkIFRIUl9PVkhEX1NUQVRFCisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgLyogc2luY2UgdGhlIGNyaXRpY2FsIGRpcmVjdGl2ZSBiaW5kcyB0byBhbGwgdGhyZWFkcywgbm90IGp1c3QKKyAgICAgKiB0aGUgY3VycmVudCB0ZWFtIHdlIGhhdmUgdG8gY2hlY2sgdGhpcyBldmVuIGlmIHdlIGFyZSBpbiBhCisgICAgICogc2VyaWFsaXplZCB0ZWFtICovCisgICAgLyogYWxzbywgZXZlbiBpZiB3ZSBhcmUgdGhlIHViZXIgdGhyZWFkLCB3ZSBzdGlsbCBoYXZlIHRvIGNvbmR1Y3QgdGhlIGxvY2ssCisgICAgICogYXMgd2UgaGF2ZSB0byBjb250ZW5kIHdpdGggc2libGluZyB0aHJlYWRzICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBkaXJlY3RpdmUuCisKKyAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9IC8vIF9fa21wY19jcml0aWNhbAorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0xlYXZlIGEgY3JpdGljYWwgc2VjdGlvbiwgcmVsZWFzaW5nIGFueSBsb2NrIHRoYXQgd2FzIGhlbGQgZHVyaW5nIGl0cyBleGVjdXRpb24uCisqLwordm9pZAorX19rbXBjX2VuZF9jcml0aWNhbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqY3JpdCkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfY3JpdGljYWw6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeyAvLyB0aWNrZXQsIHF1ZXVpbmcgb3IgZHJkcGEKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgVENSX1BUUigqKChrbXBfdXNlcl9sb2NrX3AgKiljcml0KSk7CisgICAgfQorCisgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBkaXJlY3RpdmUuCisKKyAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2VuZF9jcml0aWNhbDogZG9uZSBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KK0ByZXR1cm4gb25lIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIG1hc3RlciBibG9jaywgemVybyBvdGhlcndpc2UKKworU3RhcnQgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGUgYmFycmllciBpcyBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4KKyovCitrbXBfaW50MzIKK19fa21wY19iYXJyaWVyX21hc3RlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXJfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKworICAgIHN0YXR1cyA9IF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldHVybiAoc3RhdHVzICE9IDApID8gMCA6IDE7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitDb21wbGV0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIDx0dD5tYXN0ZXI8L3R0PiBjb2RlLiBPdGhlciB0aHJlYWRzIHdpbGwKK3N0aWxsIGJlIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIgYW5kIHRoaXMgY2FsbCByZWxlYXNlcyB0aGVtLgorKi8KK3ZvaWQKK19fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlcihub3dhaXQpIGNvbnN0cnVjdC4KK1RoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCAiZW5kIiBmdW5jdGlvbiwgc2luY2UgdGhlCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyIHJldDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0OiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgcmV0ID0gX19rbXBjX21hc3RlciAobG9jLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAvKiAgdGhlcmUncyBubyBfX2ttcGNfZW5kX21hc3RlciBjYWxsZWQ7IHNvIHRoZSAoc3RhdHMpICovCisgICAgICAgIC8qICBhY3Rpb25zIG9mIF9fa21wY19lbmRfbWFzdGVyIGFyZSBkb25lIGhlcmUgICAgICAgICAgKi8KKworICAgICAgICBpZiAoIGdsb2JhbF90aWQgPCAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFRocmVhZElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIC8qIG9ubHkgb25lIHRocmVhZCBzaG91bGQgZG8gdGhlIHBvcCBzaW5jZSBvbmx5ICovCisgICAgICAgICAgICAvKiBvbmUgZGlkIHRoZSBwdXNoIChzZWUgX19rbXBjX21hc3RlcigpKSAgICAgICAqLworCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAocmV0KTsKK30KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcmV0dXJuIE9uZSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgc2luZ2xlIGNvbnN0cnVjdCwgemVybyBvdGhlcndpc2UuCisKK1Rlc3Qgd2hldGhlciB0byBleGVjdXRlIGEgPHR0PnNpbmdsZTwvdHQ+IGNvbnN0cnVjdC4KK1RoZXJlIGFyZSBubyBpbXBsaWNpdCBiYXJyaWVycyBpbiB0aGUgdHdvICJzaW5nbGUiIGNhbGxzLCByYXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZAoraW50cm9kdWNlIGFuIGV4cGxpY2l0IGJhcnJpZXIgaWYgaXQgaXMgcmVxdWlyZWQuCisqLworCitrbXBfaW50MzIKK19fa21wY19zaW5nbGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBfaW50MzIgcmMgPSBfX2ttcF9lbnRlcl9zaW5nbGUoIGdsb2JhbF90aWQsIGxvYywgVFJVRSApOworICAgIHJldHVybiByYzsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVkIHRoZSBibG9jayBvZiBjb2RlIHByb3RlY3RlZAorYnkgdGhlIGBzaW5nbGVgIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX2V4aXRfc2luZ2xlKCBnbG9iYWxfdGlkICk7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgR2xvYmFsIHRocmVhZCBpZAorCitNYXJrIHRoZSBlbmQgb2YgYSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wLgorKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2ZpbmkoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19maW5pIGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3BkbywgbG9jICk7Cit9CisKKy8qCisgKiBVc2VyIHJvdXRpbmVzIHdoaWNoIHRha2UgQy1zdHlsZSBhcmd1bWVudHMgKGNhbGwgYnkgdmFsdWUpCisgKiBkaWZmZXJlbnQgZnJvbSB0aGUgRm9ydHJhbiBlcXVpdmFsZW50IHJvdXRpbmVzCisgKi8KKwordm9pZAorb21wY19zZXRfbnVtX3RocmVhZHMoIGludCBhcmcgKQoreworLy8gISEhISEgVE9ETzogY2hlY2sgdGhlIHBlci10YXNrIGJpbmRpbmcKKyAgICBfX2ttcF9zZXRfbnVtX3RocmVhZHMoIGFyZywgX19rbXBfZW50cnlfZ3RpZCgpICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X2R5bmFtaWMoIGludCBmbGFnICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX2R5bmFtaWMoIHRocmVhZCwgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworfQorCit2b2lkCitvbXBjX3NldF9uZXN0ZWQoIGludCBmbGFnICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGludGVybmFsIGNvbnRyb2xzIGltcGxlbWVudGF0aW9uICovCisgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbmVzdGVkKCB0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKK30KKworI2lmIE9NUF8zMF9FTkFCTEVECisKK3ZvaWQKK29tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIC8qIFRPIERPICovCisgICAgLyogd2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKworICAgIC8qIEZvciB0aGUgcGVyLXRocmVhZCBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBtYXhfYWN0aXZlX2xldmVscyApOworfQorCit2b2lkCitvbXBjX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksICgga21wX3NjaGVkX3QgKSBraW5kLCBtb2RpZmllciApOworfQorCitpbnQKK29tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBsZXZlbCApCit7CisgICAgcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK2ludAorb21wY19nZXRfdGVhbV9zaXplKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemUoIGludCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkKK3sKKyAgICBpbnQgZ3RpZCwgdGlkOworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIGFyZywgdGhyZWFkLCB0aWQgKTsKK30KKwordm9pZAora21wY19zZXRfbGlicmFyeSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCAoZW51bSBsaWJyYXJ5X3R5cGUpYXJnICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkKK3sKKyAgICAvLyBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoIHN0ciwgc3RybGVuKCBzdHIgKSApOworfQorCisjaWZkZWYgT01QXzMwX0VOQUJMRUQKKworaW50CitrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggcHJvYywgbWFzayApOworI2VuZGlmCit9CisKK2ludAora21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggcHJvYywgbWFzayApOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAcGFyYW0gbG9jICAgICAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIGNweV9zaXplICBzaXplIG9mIHRoZSBjcHlfZGF0YSBidWZmZXIKK0BwYXJhbSBjcHlfZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNvcGllZAorQHBhcmFtIGNweV9mdW5jICBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBmb3IgY29weWluZyBkYXRhCitAcGFyYW0gZGlkaXQgICAgIGZsYWcgdmFyaWFibGU6IDE9c2luZ2xlIHRocmVhZDsgMD1ub3Qgc2luZ2xlIHRocmVhZAorCitfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcHJpdmF0ZSBkYXRhIGJyb2FkY2FzdCBuZWVkZWQgZm9yCit0aGUgY29weXByaXZhdGUgY2xhdXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSByZWdpb24gaW4gYW4gT3Blbk1QPHN1cD4qPC9zdXA+IHByb2dyYW0gKGJvdGggQyBhbmQgRm9ydHJhbikuCitBbGwgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBwYXJhbGxlbCByZWdpb24gY2FsbCB0aGlzIHJvdXRpbmUuCitPbmUgb2YgdGhlIHRocmVhZHMgKGNhbGxlZCB0aGUgc2luZ2xlIHRocmVhZCkgc2hvdWxkIGhhdmUgdGhlIDx0dD5kaWRpdDwvdHQ+IHZhcmlhYmxlIHNldCB0byAxCithbmQgYWxsIG90aGVyIHRocmVhZHMgc2hvdWxkIGhhdmUgdGhhdCB2YXJpYWJsZSBzZXQgdG8gMC4KK0FsbCB0aHJlYWRzIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgKGNweV9kYXRhKSB0aGF0IHRoZXkgaGF2ZSBidWlsdC4KKworVGhlIE9wZW5NUCBzcGVjaWZpY2F0aW9uIGZvcmJpZHMgdGhlIHVzZSBvZiBub3dhaXQgb24gdGhlIHNpbmdsZSByZWdpb24gd2hlbiBhIGNvcHlwcml2YXRlCitjbGF1c2UgaXMgcHJlc2VudC4gSG93ZXZlciwgQHJlZiBfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyBhIGJhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZAorcmFjZSBjb25kaXRpb25zLCBzbyB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIKK2FmdGVyIHRoZSBjYWxsIHRvIEByZWYgX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IgYWRkcmVzcyAoY3B5X2RhdGEpCit0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2ggY2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQordGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlIGNvcHkgYnkgY29weWluZyB0aGUgZGF0YSB1c2luZyB0aGUgY3B5X2RhdGEgYnVmZmVyLgorCitUaGUgY3B5X2Z1bmMgcm91dGluZSB1c2VkIGZvciB0aGUgY29weSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFyZWEgZGVmaW5lZCBieSBjcHlfZGF0YQorYW5kIGNweV9zaXplIG1heSBiZSBidWlsdCBpbiBhbnkgZmFzaGlvbiB0aGF0IHdpbGwgYWxsb3cgdGhlIGNvcHkgdG8gYmUgZG9uZS4gRm9yIGluc3RhbmNlLAordGhlIGNweV9kYXRhIGJ1ZmZlciBjYW4gaG9sZCB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgY29waWVkIG9yIGl0IG1heSBob2xkIGEgbGlzdCBvZiBwb2ludGVycwordG8gdGhlIGRhdGEuIFRoZSBjcHlfZnVuYyByb3V0aW5lIG11c3QgaW50ZXJwcmV0IHRoZSBjcHlfZGF0YSBidWZmZXIgYXBwcm9wcmlhdGVseS4KKworVGhlIGludGVyZmFjZSB0byBjcHlfZnVuYyBpcyBhcyBmb2xsb3dzOgorQGNvZGUKK3ZvaWQgY3B5X2Z1bmMoIHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UgKQorQGVuZGNvZGUKK3doZXJlIHZvaWQgKmRlc3RpbmF0aW9uIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCB0bworYW5kIHZvaWQgKnNvdXJjZSBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgZnJvbS4KKyovCit2b2lkCitfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApCit7CisgICAgdm9pZCAqKmRhdGFfcHRyOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jb3B5cHJpdmF0ZTogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIGRhdGFfcHRyID0gJiBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApLT50LnRfY29weXByaXZfZGF0YTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVG9EbzogT3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gYmFycmllcnMgaW50byBzb21lIGtpbmQgb2Ygc3BsaXQgYmFycmllciAqLworCisgICAgaWYgKGRpZGl0KSAqZGF0YV9wdHIgPSBjcHlfZGF0YTsKKworICAgIC8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFICwgMCwgTlVMTCwgTlVMTCApOworCisgICAgaWYgKCEgZGlkaXQpICgqY3B5X2Z1bmMpKCBjcHlfZGF0YSwgKmRhdGFfcHRyICk7CisKKyAgICAvKiBDb25zaWRlciBuZXh0IGJhcnJpZXIgdGhlIHVzZXItdmlzaWJsZSBiYXJyaWVyIGZvciBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyaWVzICovCisgICAgLyogTmVzdGluZyBjaGVja3MgYXJlIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgc2luZ2xlIGNvbnN0cnVjdCBjaGVja3MgKi8KKworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFICwgMCwgTlVMTCwgTlVMTCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIElOSVRfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgSU5JVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX0xPQ0tfVElNRUQgICAgICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzX3RpbWVkCisjZGVmaW5lIEFDUVVJUkVfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTkVTVEVEX0xPQ0tfVElNRUQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzX3RpbWVkCisjZGVmaW5lIFJFTEVBU0VfTE9DSyAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgUkVMRUFTRV9ORVNURURfTE9DSyAgICAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9MT0NLICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBURVNUX05FU1RFRF9MT0NLICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIERFU1RST1lfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisKKworLyoKKyAqIFRPRE86IE1ha2UgY2hlY2sgYWJvcnQgbWVzc2FnZXMgdXNlIGxvY2F0aW9uIGluZm8gJiBwYXNzIGl0CisgKiBpbnRvIHdpdGhfY2hlY2tzIHJvdXRpbmVzCisgKi8KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsICB2b2lkICoqIHVzZXJfbG9jayApIHsKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbG9jayI7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHVzZXJfbG9jaywgZ3RpZCwgMCApOworICAgIH0KKyAgICBJTklUX0xPQ0soIGxjayApOworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30gLy8gX19rbXBjX2luaXRfbG9jaworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfaW5pdF9uZXN0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbmVzdF9sb2NrIjsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHVzZXJfbG9jaywgZ3RpZCwgMCApOworICAgIH0KKworICAgIElOSVRfTkVTVEVEX0xPQ0soIGxjayApOworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30gLy8gX19rbXBjX2luaXRfbmVzdF9sb2NrCisKK3ZvaWQKK19fa21wY19kZXN0cm95X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9kZXN0cm95X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIERFU1RST1lfTE9DSyggbGNrICk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHVzZXJfbG9jaywgZ3RpZCwgbGNrICk7CisgICAgfQorfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9kZXN0cm95X25lc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBERVNUUk9ZX05FU1RFRF9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggdXNlcl9sb2NrLCBndGlkLCBsY2sgKTsKKyAgICB9Cit9IC8vIF9fa21wY19kZXN0cm95X25lc3RfbG9jaworCit2b2lkCitfX2ttcGNfc2V0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfc2V0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9MT0NLKCBsY2ssIGd0aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisKK3ZvaWQKK19fa21wY19zZXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9zZXRfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEFDUVVJUkVfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQKK19fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgICAgICAvLyAiZmFzdCIgcGF0aCBpbXBsZW1lbnRlZCB0byBmaXggY3VzdG9tZXIgcGVyZm9ybWFuY2UgaXNzdWUKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIFRDV180KCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayktPnRhcy5say5wb2xsLCAwKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybjsKKyNlbHNlCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworI2VuZGlmCisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Vuc2V0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgUkVMRUFTRV9MT0NLKCBsY2ssIGd0aWQgKTsKK30KKworLyogcmVsZWFzZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgICAgICAvLyAiZmFzdCIgcGF0aCBpbXBsZW1lbnRlZCB0byBmaXggY3VzdG9tZXIgcGVyZm9ybWFuY2UgaXNzdWUKKyAgICAgICAga21wX3Rhc19sb2NrX3QgKnRsID0gKGttcF90YXNfbG9ja190Kil1c2VyX2xvY2s7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBpZiAoIC0tKHRsLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgICAgICBUQ1dfNCh0bC0+bGsucG9sbCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybjsKKyNlbHNlCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworI2VuZGlmCisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgUkVMRUFTRV9ORVNURURfTE9DSyggbGNrLCBndGlkICk7Cit9CisKKy8qIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCitpbnQKK19fa21wY190ZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgaW50ICAgICAgICAgIHJjOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gKCByYyA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCit9CisKKy8qIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCitpbnQKK19fa21wY190ZXN0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpbnQgICAgICAgICAgcmM7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgcmMgPSBURVNUX05FU1RFRF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gcmM7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKKy8vIGtlZXAgdGhlIHNlbGVjdGVkIG1ldGhvZCBpbiBhIHRocmVhZCBsb2NhbCBzdHJ1Y3R1cmUgZm9yIGNyb3NzLWZ1bmN0aW9uIHVzYWdlOiB3aWxsIGJlIHVzZWQgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uczsKKy8vIGFub3RoZXIgc29sdXRpb246IHRvIHJlLWRldGVybWluZSB0aGUgbWV0aG9kIG9uZSBtb3JlIHRpbWUgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9ucyAobmV3IHByb3RvdHlwZSByZXF1aXJlZCB0aGVuKQorLy8gQVQ6IHdoaWNoIHNvbHV0aW9uIGlzIGJldHRlcj8KKyNkZWZpbmUgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoZ3RpZCxybWV0aG9kKSBcCisgICAgICAgICAgICAgICAgICAgKCAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA9ICggcm1ldGhvZCApICkKKworI2RlZmluZSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRChndGlkKSBcCisgICAgICAgICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlOiBsb29rIGF0IHRoZSBtYWNyb3MgaW4ga21wLmgKKworCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkgeworCisgICAgLy8gdGhpcyBsb2NrIHdhcyB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWQgcHJvZmlsZXIgYXMgYSBzZXJpYWwgb3ZlcmhlYWQgc3BhbgorICAgIC8vICAgICAgICAgICAgKGFsdGhvdWdoIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSBvbmx5KQorICAgIC8vICAgICAgICAgICAgd2h5IHdhcyBpdCB2aXNpYmxlIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uPworICAgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycworICAgIC8vIHdpdGggMzIgYnl0ZSBjcml0aWNhbCBzZWN0aW9ucy4gSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLCB0aGVuIHdlCisgICAgLy8gaGF2ZSB0byB1c2UgYSBwb2ludGVyLgorICAgIGlmICggX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA8PSBJTlRFTF9DUklUSUNBTF9TSVpFICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworfQorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycyB3aXRoIDMyIGJ5dGUgY3JpdGljYWwKKyAgICAvLyBzZWN0aW9ucy4gSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLCB0aGVuIHdlIGhhdmUgdG8gdXNlIGEgcG9pbnRlci4KKyAgICBpZiAoIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPiAzMiApIHsKKyAgICAgICAgbGNrID0gKiggKGttcF91c2VyX2xvY2tfcCAqKSBjcml0ICk7CisgICAgICAgIEtNUF9BU1NFUlQoIGxjayAhPSBOVUxMICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgY3JpdDsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKK30gLy8gX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrCisKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworVGhlIG5vd2FpdCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGEgcmVkdWNlIGNsYXVzZSB3aXRoIHRoZSBub3dhaXQgYXJndW1lbnQuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlX25vd2FpdCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBpbnQgcmV0dmFsOworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2Vfbm93YWl0KCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8vIHdoeSBkbyB3ZSBuZWVkIHRoaXMgaW5pdGlhbGl6YXRpb24gaGVyZSBhdCBhbGw/CisgICAgLy8gUmVkdWN0aW9uIGNsYXVzZSBjYW4gbm90IGJlIHVzZWQgYXMgYSBzdGFuZC1hbG9uZSBkaXJlY3RpdmUuCisKKyAgICAvLyBkbyBub3QgY2FsbCBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpLCBpdCB3aWxsIGJlIGNhbGxlZCBieSBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCkgaWYgbmVlZGVkCisgICAgLy8gcG9zc2libGUgZGV0ZWN0aW9uIG9mIGZhbHNlLXBvc2l0aXZlIHJhY2UgYnkgdGhlIHRocmVhZGNoZWNrZXIgPz8/CisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vIGNoZWNrIGNvcnJlY3RuZXNzIG9mIHJlZHVjZSBibG9jayBuZXN0aW5nCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMICk7CisKKyAgICAvLyBpdCdzIGJldHRlciB0byBjaGVjayBhbiBhc3NlcnRpb24gQVNTRVJUKCB0aHJfc3RhdGUgPT0gVEhSX1dPUktfU1RBVEUgKQorCisgICAgLy8gcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFsdWUgd2lsbCBiZSByZXVzZWQgYnkgX19rbXBfZW5kX3JlZHVjZSogZnVuY3Rpb24sIHRoZSB2YWx1ZSBzaG91bGQgYmUga2VwdCBpbiBhIHZhcmlhYmxlCisgICAgLy8gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBlaXRoZXIgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljIHByb3BlcnR5LCBub3QgYSB0ZWFtIHNwZWNpZmljIHByb3BlcnR5CisgICAgLy8gICAgIChhIHRocmVhZCBjYW4gcmVhY2ggdGhlIG5leHQgcmVkdWNlIGJsb2NrIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCwgcmVkdWNlIG1ldGhvZCBtYXkgZGlmZmVyIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCkKKyAgICAvLyBhbiBpZGVudF90ICJsb2MiIHBhcmFtZXRlciBjb3VsZCBiZSB1c2VkIGFzIGEgY29uc3RydWN0LXNwZWNpZmljIHByb3BlcnR5ICh3aGF0IGlmIGxvYyA9PSAwPykKKyAgICAvLyAgICAgKGlmIGJvdGggY29uc3RydWN0LXNwZWNpZmljIGFuZCB0ZWFtLXNwZWNpZmljIHZhcmlhYmxlcyB3ZXJlIHNoYXJlZCwgdGhlbiB1bm5lc3MgZXh0cmEgc3luY3Mgc2hvdWxkIGJlIG5lZWRlZCkKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyB2YXJpYWJsZSBpcyBiZXR0ZXIgcmVnYXJkaW5nIHR3byBpc3N1ZXMgYWJvdmUgKG5leHQgY29uc3RydWN0IGFuZCBleHRyYSBzeW5jcykKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyAidGhfbG9jYWwucmVkdWN0aW9uX21ldGhvZCIgdmFyaWFibGUgaXMgdXNlZCBjdXJyZW50bHkKKyAgICAvLyBlYWNoIHRocmVhZCBleGVjdXRlcyAnZGV0ZXJtaW5lJyBhbmQgJ3NldCcgbGluZXMgKG5vIG5lZWQgdG8gZXhlY3V0ZSBieSBvbmUgdGhyZWFkLCB0byBhdm9pZCB1bm5lc3MgZXh0cmEgc3luY3MpCisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2sgKTsKKyAgICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICByZXR2YWwgPSAyOworCisgICAgICAgIC8vIGFsbCB0aHJlYWRzIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlIChiZWNhdXNlIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIHdvbid0IGJlIGNhbGxlZCBieSB0aGUgY29kZSBnZW4pCisgICAgICAgIC8vICAgICAoaXQncyBub3QgcXVpdGUgZ29vZCwgYmVjYXVzZSB0aGUgY2hlY2tpbmcgYmxvY2sgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoaXMgJ3BvcCcsCisgICAgICAgIC8vICAgICAgYnV0IGF0b21pYyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldCwgd2lsbCBiZSBleGVjdXRlZCBzbGlnaHRseSBsYXRlciwgbGl0ZXJhbGx5IG9uIG5leHQgaW5zdHJ1Y3Rpb24pCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vQVQ6IHBlcmZvcm1hbmNlIGlzc3VlOiBhIHJlYWwgYmFycmllciBoZXJlCisgICAgICAgIC8vQVQ6ICAgICAoaWYgbWFzdGVyIGdvZXMgc2xvdywgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlIHdhaXRpbmcgZm9yIHRoZSBtYXN0ZXIgdG8gY29tZSBhbmQgcmVsZWFzZSB0aGVtKQorICAgICAgICAvL0FUOiAgICAgKGl0J3Mgbm90IHdoYXQgYSBjdXN0b21lciBtaWdodCBleHBlY3Qgc3BlY2lmeWluZyBOT1dBSVQgY2xhdXNlKQorICAgICAgICAvL0FUOiAgICAgKHNwZWNpZnlpbmcgTk9XQUlUIHdvbid0IHJlc3VsdCBpbiBpbXByb3ZlbWVudCBvZiBwZXJmb3JtYW5jZSwgaXQnbGwgYmUgY29uZnVzaW5nIHRvIGEgY3VzdG9tZXIpCisgICAgICAgIC8vQVQ6IGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgKmJhcnJpZXJfZ2F0aGVyKm5vd2FpdCgpIChvciBzb21lIG90aGVyIGRlc2lnbikgbWlnaHQgZ28gZmFzdGVyCisgICAgICAgIC8vICAgICAgICBhbmQgYmUgbW9yZSBpbiBsaW5lIHdpdGggc2Vuc2Ugb2YgTk9XQUlUCisgICAgICAgIC8vQVQ6IFRPIERPOiBkbyBlcGNjIHRlc3QgYW5kIGNvbXBhcmUgdGltZXMKKworICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIGludmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkIHByb2ZpbGVyCisgICAgICAgIC8vICAgICAgICAgICAgICAoaXQncyBuZWl0aGVyIGEgdGVybWluYXRpbmcgYmFycmllciBub3IgY3VzdG9tZXIncyBjb2RlLCBpdCdzIHVzZWQgZm9yIGFuIGludGVybmFsIHB1cnBvc2UpCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgRkFMU0UsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMgKTsKKyAgICAgICAgcmV0dmFsID0gKCByZXR2YWwgIT0gMCApID8gKCAwICkgOiAoIDEgKTsKKworICAgICAgICAvLyBhbGwgb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlCisgICAgICAgIC8vICAgICAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyB3aWxsIGdldCB0byBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSApCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYoIHJldHZhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlX25vd2FpdCgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eCwgcmV0dXJucyAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgcmV0dmFsICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBpZC4KK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKKworRmluaXNoIHRoZSBleGVjdXRpb24gb2YgYSByZWR1Y2Ugbm93YWl0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggb24gSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIG5laXRoZXIgbWFzdGVyIG5vciBvdGhlciB3b3JrZXJzIHNob3VsZCBnZXQgaGVyZQorICAgICAgICAvLyAgICAgKGNvZGUgZ2VuIGRvZXMgbm90IGdlbmVyYXRlIHRoaXMgY2FsbCBpbiBjYXNlIDI6IGF0b21pYyByZWR1Y2UgYmxvY2spCisgICAgICAgIC8vIGFjdHVhbGx5IGl0J3MgYmV0dGVyIHRvIHJlbW92ZSB0aGlzIGVsc2VpZiBhdCBhbGw7CisgICAgICAgIC8vIGFmdGVyIHJlbW92YWwgdGhpcyB2YWx1ZSB3aWxsIGNoZWNrZWQgYnkgdGhlICdlbHNlJyBhbmQgd2lsbCBhc3NlcnQKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvLyBvbmx5IG1hc3RlciBnZXRzIGhlcmUKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKKworICAgIHJldHVybjsKK30KKworLyogMi5hLmlpLiBSZWR1Y2UgQmxvY2sgd2l0aCBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgKi8KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworQSBibG9ja2luZyByZWR1Y2UgdGhhdCBpbmNsdWRlcyBhbiBpbXBsaWNpdCBiYXJyaWVyLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX3JlZHVjZSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwKKyAgICB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApCit7CisgICAgaW50IHJldHZhbDsKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8vIHdoeSBkbyB3ZSBuZWVkIHRoaXMgaW5pdGlhbGl6YXRpb24gaGVyZSBhdCBhbGw/CisgICAgLy8gUmVkdWN0aW9uIGNsYXVzZSBjYW4gbm90IGJlIGEgc3RhbmQtYWxvbmUgZGlyZWN0aXZlLgorCisgICAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAgIC8vIHBvc3NpYmxlIGRldGVjdGlvbiBvZiBmYWxzZS1wb3NpdGl2ZSByYWNlIGJ5IHRoZSB0aHJlYWRjaGVja2VyID8/PworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLyBjaGVjayBjb3JyZWN0bmVzcyBvZiByZWR1Y2UgYmxvY2sgbmVzdGluZworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCApOworCisgICAgLy8gaXQncyBiZXR0ZXIgdG8gY2hlY2sgYW4gYXNzZXJ0aW9uIEFTU0VSVCggdGhyX3N0YXRlID09IFRIUl9XT1JLX1NUQVRFICkKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3ZhcnMsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMsIGxjayApOworICAgIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIHJldHZhbCA9IDI7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy9jYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZCBwcm9maWxlcgorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgVFJVRSwgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYyApOworICAgICAgICByZXR2YWwgPSAoIHJldHZhbCAhPSAwICkgPyAoIDAgKSA6ICggMSApOworCisgICAgICAgIC8vIGFsbCBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgc2hvdWxkIGRvIHRoaXMgcG9wIGhlcmUKKyAgICAgICAgLy8gICAgICggbm9uZSBvZiBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgd2lsbCBlbnRlciBfX2ttcGNfZW5kX3JlZHVjZSgpICkKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBpZiggcmV0dmFsID09IDAgKSB7IC8vIDA6IGFsbCBvdGhlciB3b3JrZXJzOyAxOiBtYXN0ZXIKKyAgICAgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eCwgcmV0dXJucyAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgcmV0dmFsICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBpZC4KK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKKworRmluaXNoIHRoZSBleGVjdXRpb24gb2YgYSBibG9ja2luZyByZWR1Y2UuCitUaGUgPHR0PmxjazwvdHQ+IHBvaW50ZXIgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgZnVuY3Rpb24uCisqLwordm9pZAorX19rbXBjX2VuZF9yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkICk7CisKKyAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZCBwcm9maWxlcgorICAgIC8vICAgICAgICAgICAgICAoaXQncyBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgb24gY29uc3RydWN0cyBpZiBOT1dBSVQgbm90IHNwZWNpZmllZCkKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZXhlY3V0ZXMgaGVyZSAobWFzdGVyIHJlbGVhc2VzIGFsbCBvdGhlciB3b3JrZXJzKQorICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2UoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKKworICAgIHJldHVybjsKK30KKworI3VuZGVmIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9ECisjdW5kZWYgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QKKworLyotLSBlbmQgb2YgaW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfdGFza2lkKCkgeworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAga21wX2ludDMyICAgIGd0aWQ7CisgICAgICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisKKyAgICAgICAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICByZXR1cm4gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3Rhc2tfaWQ7CisKKyAgICAjZWxzZQorCisgICAgICAgIHJldHVybiAwOworCisgICAgI2VuZGlmCisKK30gLy8gX19rbXBjX2dldF90YXNraWQKKworCitrbXBfdWludDY0CitfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQoKSB7CisKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKworICAgICAgICBrbXBfaW50MzIgICAgICAgIGd0aWQ7CisgICAgICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudF90YXNrOworCisgICAgICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgICAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHRocmVhZCAgICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQ7CisgICAgICAgIHJldHVybiAoIHBhcmVudF90YXNrID09IE5VTEwgPyAwIDogcGFyZW50X3Rhc2stPnRkX3Rhc2tfaWQgKTsKKworICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAjZW5kaWYKKworfSAvLyBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQKKwordm9pZCBfX2ttcGNfcGxhY2VfdGhyZWFkcyhpbnQgbkMsIGludCBuVCwgaW50IG5PKQoreworI2lmIEtNUF9NSUMKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfQorICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG5DOworICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gblQ7CisgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBuTzsKKyNlbmRpZgorfQorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2RlYnVnLmMgYi9yYzEvcnVudGltZS9zcmMva21wX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNDMwMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIGttcF9kZWJ1Zy5jIC0tIGRlYnVnIHV0aWxpdGllcyBmb3IgdGhlIEd1aWRlIGxpYnJhcnkKKyAqICRSZXZpc2lvbjogNDIxNTAgJAorICogJERhdGU6IDIwMTMtMDMtMTUgMTU6NDA6MzggLTA1MDAgKEZyaSwgMTUgTWFyIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIiAvKiByZWFsbHkgbmVjZXNzYXJ5PyAqLworI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZmRlZiBLTVBfREVCVUcKK3ZvaWQKK19fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX291dCwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKGFwKTsKK30KKyNlbmRpZgorCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGYoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBpbnQKKyAgICBfX2ttcF9kZWJ1Z19hc3NlcnQoCisgICAgICAgIGNoYXIgY29uc3QgKiAgbXNnLAorICAgICAgICBjaGFyIGNvbnN0ICogIGZpbGUsCisgICAgICAgIGludCAgICAgICAgICAgbGluZQorICAgICkgeworCisgICAgICAgIGlmICggZmlsZSA9PSBOVUxMICkgeworICAgICAgICAgICAgZmlsZSA9IEtNUF9JMThOX1NUUiggVW5rbm93bkZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBkaXJlY3RvcmllcyBmcm9tIHBhdGgsIGxlYXZlIG9ubHkgZmlsZSBuYW1lLiBGaWxlIG5hbWUgaXMgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyBpbiBib3RoZXJpbmcgZGV2ZWxvcGVycyBhbmQgY3VzdG9tZXJzIHdpdGggZnVsbCBwYXRocy4KKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzbGFzaCA9IHN0cnJjaHIoIGZpbGUsICcvJyApOworICAgICAgICAgICAgaWYgKCBzbGFzaCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBzbGFzaCArIDE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMoJWQpOiAlcy5cbiIsIGZpbGUsIGxpbmUsIG1zZyApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEZWJ1Z0JyZWFrKCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU1RBTEwKKyAgICAgICAgICAgICAgICAvKiAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7ICovCisgICAgICAgICAgICAgICAgZm9yKDs7KTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2b2xhdGlsZSAqIFpFUk8gPSAoaW50KikgMDsKKyAgICAgICAgICAgICAgICAgICAgKysgKCpaRVJPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQXNzZXJ0aW9uRmFpbHVyZSwgZmlsZSwgbGluZSApLAorICAgICAgICAgICAgS01QX0hOVCggU3VibWl0QnVnUmVwb3J0ICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgICAgICAgIHJldHVybiAwOworCisgICAgfSAvLyBfX2ttcF9kZWJ1Z19hc3NlcnQKKworI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKy8qIER1bXAgZGVidWdnaW5nIGJ1ZmZlciB0byBzdGRlcnIgKi8KK3ZvaWQKK19fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGRjID0gX19rbXBfZGVidWdfY291bnQ7CisgICAgICAgIGNoYXIgKmRiID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIChkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcykgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGJfZW5kID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBjaGFyICpkYjI7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5TdGFydCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKTpcbiIsCisgICAgICAgICAgICAgICAgIGRjICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9kZWJ1Z19idWZfbGluZXM7IGkrKyApIHsKKworICAgICAgICAgICAgaWYgKCAqZGIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXggdXAgd2hlcmUgbm8gY2FycmlhZ2UgcmV0dXJuIGJlZm9yZSBzdHJpbmcgdGVybWluYXRpb24gY2hhciAqLworICAgICAgICAgICAgICAgIGZvciAoIGRiMiA9IGRiICsgMTsgZGIyIDwgZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxOyBkYjIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqZGIyID09ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICooZGIyLTEpICE9ICdcbicgKSB7ICpkYjIgPSAnXG4nOyAqKGRiMisxKSA9ICdcMCc7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBjYXNlIGF0IGVuZCBieSBzaG9ydGVuaW5nIHRoZSBwcmludGVkIG1lc3NhZ2UgYnkgb25lIGNoYXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCBkYjIgPT0gZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxICYmCisgICAgICAgICAgICAgICAgICAgICAqZGIyID09ICdcMCcgJiYgKihkYjItMSkgIT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgKihkYjItMSkgPSAnXG4nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJTRkOiAlLipzIiwgaSwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBkYiApOworICAgICAgICAgICAgICAgICpkYiA9ICdcMCc7IC8qIG9ubHkgbGV0IGl0IHByaW50IG9uY2UhICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKyAgICAgICAgICAgIGlmICggZGIgPj0gZGJfZW5kICkKKyAgICAgICAgICAgICAgICBkYiA9IF9fa21wX2RlYnVnX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiRW5kIGR1bXAgb2YgZGVidWdnaW5nIGJ1ZmZlciAoZW50cnk9JWQpLlxuXG4iLAorICAgICAgICAgICAgICAgICAoIGRjK2ktMSApICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZGVidWcuaCBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzcwNmZmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICoga21wX2RlYnVnLmggLS0gZGVidWcgLyBhc3NlcnRpb24gY29kZSBmb3IgQXNzdXJlIGxpYnJhcnkKKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdfSAorI2RlZmluZSBLTVBfREVCVUdfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uIGNhbiBkbyBjb21waWxlLXRpbWUgY2hlY2tpbmcgb2YgZGF0YSBzdHJ1Y3R1cmUgc2l6ZXMsIGV0Yy4gVGhpcyB3b3JrcyBieQorICAgIGRlY2xhcmluZyBhIG5lZ2F0aXZlLWxlbmd0aCBhcnJheSBpZiB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBJbiB0aGF0CisgICAgY2FzZSwgdGhlIGNvbXBpbGVyIGlzc3VlcyBhIHN5bnRheCBlcnJvciBhbmQgc3RvcHMgdGhlIGNvbXBpbGF0aW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBpcworICAgIHRydWUsIHdlIGdldCBhbiBleHRyYW5lb3VzIHN0YXRpYyBzaW5nbGUgY2hhcmFjdGVyIGFycmF5IGluIHRoZSBzY29wZSBvZiB0aGUgbWFjcm8uCisKKyAgICBVc2FnZToKKworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIHNvbWVfdCApIDw9IDMyICk7CisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBzb21lX3QsIGZpZWxkICkgJSA4ID09IDAgKTsKKworICAgIERvIG5vdCB1c2UgX0tNUF9CVUlMRF9BU1NFUlQgYW5kIF9fS01QX0JVSUxEX0FTU0VSVCBkaXJlY3RseSwgaXQgaXMgd29ya2luZyBndXRzLgorKi8KKworI2RlZmluZSBfX0tNUF9CVUlMRF9BU1NFUlQoIGV4cHIsIHN1ZmZpeCApICBzdGF0aWMgY2hhciBfX2ttcF9idWlsZF9jaGVja18jI3N1ZmZpeFsgKGV4cHIpID8gMSA6IC0xIF0KKyNkZWZpbmUgX0tNUF9CVUlMRF9BU1NFUlQoIGV4cHIsIHN1ZmZpeCApICAgX19LTVBfQlVJTERfQVNTRVJUKCAoZXhwciksIHN1ZmZpeCApCisjZGVmaW5lIEtNUF9CVUlMRF9BU1NFUlQoIGV4cHIgKSAgICAgICAgICAgIF9LTVBfQlVJTERfQVNTRVJUKCAoZXhwciksIF9fTElORV9fICkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUnVuLXRpbWUgYXNzZXJ0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoIHZvaWQgKTsKKworI2lmZGVmIEtNUF9VU0VfQVNTRVJUCisgICAgZXh0ZXJuIGludCBfX2ttcF9kZWJ1Z19hc3NlcnQoIGNoYXIgY29uc3QgKiBleHByLCBjaGFyIGNvbnN0ICogZmlsZSwgaW50IGxpbmUgKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVCggY29uZCApICAgICAgICAgICAgICggKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCggI2NvbmQsIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAobXNnKSwgX19GSUxFX18sIF9fTElORV9fICkgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICBLTVBfQVNTRVJUKCBjb25kICkKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApCisgICAgI2Vsc2UKKyAgICAgICAgLy8gRG8gbm90IGV4cG9zZSBjb25kaXRpb24gaW4gcmVsZWFzZSBidWlsZC4gVXNlICJhc3NlcnRpb24gZmFpbHVyZSIuCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVCggY29uZCApICAgICAgICAgICAgICggKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCggImFzc2VydGlvbiBmYWlsdXJlIiwgX19GSUxFX18sIF9fTElORV9fICkgKQorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICBLTVBfQVNTRVJUKCBjb25kICkKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgMAorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKCBjb25kLCBtc2cgKSAwCisgICAgI2VuZGlmIC8vIEtNUF9ERUJVRworI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAwCisgICAgI2RlZmluZSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkgICAgICAgMAorICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKCBjb25kLCBtc2cgKSAwCisjZW5kaWYgLy8gS01QX1VTRV9BU1NFUlQKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGV4dGVybiB2b2lkIF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9kZWJ1Z19wcmludGYoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOworCisjaWZkZWYgS01QX0RFQlVHCisKKyAgICBleHRlcm4gaW50IGttcF9hX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2JfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfY19kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9kX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2VfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZl9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9kaWFnOworCisgICAgI2RlZmluZSBLQV9UUkFDRShkLHgpICAgICBpZiAoa21wX2FfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtCX1RSQUNFKGQseCkgICAgIGlmIChrbXBfYl9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0NfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9jX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRF9UUkFDRShkLHgpICAgICBpZiAoa21wX2RfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtFX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZV9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0ZfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9mX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLX0RJQUcoZCx4KSAgICAgICB7aWYgKGttcF9kaWFnID09IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmX3N0ZG91dCB4IDsgfSB9CisKKyAgICAjZGVmaW5lIEtBX0RVTVAoZCx4KSAgICAgaWYgKGttcF9hX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKyAgICAjZGVmaW5lIEtCX0RVTVAoZCx4KSAgICAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKyAgICAjZGVmaW5lIEtDX0RVTVAoZCx4KSAgICAgaWYgKGttcF9jX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKyAgICAjZGVmaW5lIEtEX0RVTVAoZCx4KSAgICAgaWYgKGttcF9kX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKyAgICAjZGVmaW5lIEtFX0RVTVAoZCx4KSAgICAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKyAgICAjZGVmaW5lIEtGX0RVTVAoZCx4KSAgICAgaWYgKGttcF9mX2RlYnVnID49IGQpIHsgaW50IGtzOyBfX2ttcF9kaXNhYmxlKCZrcyk7ICh4KSA7IF9fa21wX2VuYWJsZShrcyk7IH0KKworI2Vsc2UKKworICAgICNkZWZpbmUgS0FfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0JfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0NfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0RfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0VfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0ZfVFJBQ0UoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS19ESUFHKGQseCkgICAgICAge30vKiBub3RoaW5nIHRvIGRvICovCisKKyAgICAjZGVmaW5lIEtBX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0JfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQ19EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtEX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0VfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRl9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9kaXNwYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNTMwNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwCkBAIC0wLDAgKzEsMjQwMyBAQAorLyoKKyAqIGttcF9kaXNwYXRjaC5jcHA6IGR5bmFtaWMgc2NoZWR1bGluZyAtIGl0ZXJhdGlvbiBpbml0aWFsaXphdGlvbiBhbmQgZGlzcGF0Y2guCisgKiAkUmV2aXNpb246IDQyNjc0ICQKKyAqICREYXRlOiAyMDEzLTA5LTE4IDExOjEyOjQ5IC0wNTAwIChXZWQsIDE4IFNlcCAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBEeW5hbWljIHNjaGVkdWxpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICoKKyAqIE5PVEU6IF9fa21wX250aCBpcyBhIGNvbnN0YW50IGluc2lkZSBvZiBhbnkgZGlzcGF0Y2ggbG9vcCwgaG93ZXZlcgorICogICAgICAgaXQgbWF5IGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBwYXJhbGxlbCByZWdpb25zLiAgX19rbXBfbWF4X250aAorICogICAgICAgaXMgdGhlIGxhcmdlc3QgdmFsdWUgX19rbXBfbnRoIG1heSB0YWtlLCAxIGlzIHRoZSBzbWFsbGVzdC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAjaW5jbHVkZSA8ZmxvYXQuaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisKKyAgICAvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH1fdCB0eXBlcworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGUgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgICAgICBVVCBjb3VudDsgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQKKyAgICAgICAgVCAgdWI7CisgICAgICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgICAgICBUICBsYjsKKyAgICAgICAgU1Qgc3Q7ICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZAorICAgICAgICBVVCB0YzsgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQKKyAgICAgICAgVCAgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8vIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YgorCisgICAgICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisKKyAgICAgICAgLy8gS01QX0FMSUdOKCAzMiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgICAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgICAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgICAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsgLy8gY29tcGlsZXIgZG9lcyBub3QgYWNjZXB0IHNpemVvZihUKSo0CisgICAgICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgICAgIFQgIHBhcm0yOworICAgICAgICAgICAgVCAgcGFybTM7CisgICAgICAgICAgICBUICBwYXJtNDsKKyAgICAgICAgfTsKKworICAgICAgICBVVCBvcmRlcmVkX2xvd2VyOyAvLyB1bnNpZ25lZAorICAgICAgICBVVCBvcmRlcmVkX3VwcGVyOyAvLyB1bnNpZ25lZAorICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgVCAgbGFzdF91cHBlcjsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgfTsKKworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKKyAgICAvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH1fdCB0eXBlcworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGUgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgICAgICBUICBsYjsKKyAgICAgICAgVCAgdWI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgIC8vIHNpZ25lZAorICAgICAgICBVVCB0YzsgICAgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFQgIHBhcm0xOworICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgVCAgcGFybTM7CisgICAgICAgIFQgIHBhcm00OworCisgICAgICAgIFVUIGNvdW50OyAgICAgICAgIC8vIHVuc2lnbmVkCisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisJVCAgbGFzdF91cHBlcjsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgfTsKKworI2VuZGlmIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm8gc3RydWN0dXJlIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZSB7CisgICAgLy8gZHVwbGljYXRlIGFsaWdubWVudCBoZXJlLCBvdGhlcndpc2Ugc2l6ZSBvZiBzdHJ1Y3R1cmUgaXMgbm90IGNvcnJlY3QgaW4gb3VyIGNvbXBpbGVyCisgICAgdW5pb24gS01QX0FMSUdOX0NBQ0hFIHByaXZhdGVfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGU8IFQgPiBwOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90ICAgICAgICAgICAgIHA2NDsKKyAgICB9IHU7CisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlOyAgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAgICBrbXBfdWludDMyICAgICAgb3JkZXJlZDsgICAvKiBvcmRlcmVkIGNsYXVzZSBzcGVjaWZpZWQgKi8KKyAgICBrbXBfdWludDMyICAgICAgb3JkZXJlZF9idW1wZWQ7CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICogbmV4dDsgLyogc3RhY2sgb2YgYnVmZmVycyBmb3IgbmVzdCBvZiBzZXJpYWwgcmVnaW9ucyAqLworICAgIGttcF91aW50MzIgICAgICBub21lcmdlOyAgIC8qIGRvbid0IG1lcmdlIGl0ZXJzIGlmIHNlcmlhbGl6ZWQgKi8KKyAgICBrbXBfdWludDMyICAgICAgdHlwZV9zaXplOworICAgIGVudW0gY29uc190eXBlICBwdXNoZWRfd3M7Cit9OworCisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH1fdCB0eXBlcwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUgVVQgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBVVCAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUgVVQgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIFVUICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtMV07IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfTsKKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfc2hhcmVkX2luZm8gc3RydWN0dXJlIGFuZCBkaXNwYXRjaF9zaGFyZWRfaW5mb190IHR5cGUKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGUgeworICAgIC8vIHdlIG5lZWQgdW5pb24gaGVyZSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgc2l6ZQorICAgIHVuaW9uIHNoYXJlZF9pbmZvX3RtcGwgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb1hYX3RlbXBsYXRlPCBVVCA+ICBzOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3QgICAgICAgICAgICAgICBzNjQ7CisgICAgfSB1OworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIGJ1ZmZlcl9pbmRleDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKQoreworICAgIC8qIFdvcmsgYXJvdW5kIHdlaXJkIGNvZGUtZ2VuIGJ1ZyB0aGF0IGNhdXNlcyBhc3NlcnQgdG8gdHJpcCAqLworICAgICNpZiBLTVBfQVJDSF9YODZfNjQgJiYgS01QX09TX0xJTlVYCisgICAgI2Vsc2UKKyAgICAgICAgS01QX0FTU0VSVCggYXJnID49IDAgKTsKKyAgICAjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCisjdW5kZWYgVVNFX1RFU1RfTE9DS1MKKworLy8gdGVzdF90aGVuX2FkZCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5fYWRkKCB2b2xhdGlsZSBUICpwLCBUIGQgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQUREMzIoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9hZGQ8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9BREQ2NCggcCwgZCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jX2FjcSB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jX2FjcSggdm9sYXRpbGUgVCAqcCApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jKCB2b2xhdGlsZSBUICpwICkgeyBLTVBfQVNTRVJUKDApOyB9OworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2luYzwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAgKQoreworICAgIGttcF9pbnQ2NCByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzY0KCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIGNvbXBhcmVfYW5kX3N3YXAgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwKCB2b2xhdGlsZSBUICpwLCBUIGMsIFQgcyApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjLCBrbXBfaW50MzIgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggcCwgYywgcyApOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcDwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzICkKK3sKKyAgICByZXR1cm4gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCBwLCBjLCBzICk7Cit9CisKKy8qCisgICAgU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLgorICAgIFdhaXRzIHVudGlsIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hlbiBjYWxsZWQgd2l0aCAqc3Bpbm5lciBhbmQgY2hlY2suCisgICAgRG9lcyBOT1QgcHV0IHRocmVhZHMgdG8gc2xlZXAuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEFyZ3VtZW50czoKKyAgICAgICAgb2JqIC0tIGlzIGhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHRvIHJlcG9ydCB0byBpdHRub3RpZnkuIEl0IGlzIHVzZWQgdG8gcmVwb3J0CisgICAgICAgICAgICBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcworICAgICAgICAgICAgcmVwb3J0ZWQgdG8gaXR0bm90aWZ5IHZpYSBLTVBfRlNZTkNfQUNRVUlSRUQoKS4gSG93ZXZlciwgaXQgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQKKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGFuZCBsb2NrIHJvdXRpbmUgY2FsbHMgdG8gS01QX1dBSVRfWUlFTEQoKSwgdGhlIGxhdGVyIHNob3VsZCByZXBvcnQgdGhlIHNhbWUKKyAgICAgICAgICAgIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorLy8gVG9EbzogbWFrZSBpbmxpbmUgZnVuY3Rpb24gKG1vdmUgdG8gaGVhZGVyIGZpbGUgZm9yIGljbCkKK3N0YXRpYyBVVCAgLy8gdW5zaWduZWQgNC0gb3IgOC1ieXRlIHR5cGUKK19fa21wX3dhaXRfeWllbGQoIHZvbGF0aWxlIFVUICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIFVULCBVVCApCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICAgICAgICAqIG9iaikgICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBVVCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBVVCwgVVQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIF9fa21wX3N0YXRpY19kZWxheShUUlVFKTsKKworICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsCisgICAgICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCwgdGhlbiB5aWVsZAorICAgICAgICAvLyBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgIHJldHVybiByOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfZXEoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID09IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9uZXEoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9sdCggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfZ2UoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID49IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9sZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPD0gY2hlY2tlcjsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZGVvX2Vycm9yKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZF9yZWYgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aCA9IF9fa21wX3RocmVhZHNbKmd0aWRfcmVmXTsKKyAgICAgICAgaWYgKCB0aCAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUKKyAgICAgICAgICAmJiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggKmd0aWRfcmVmLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwgTlVMTCApOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gICogc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIFVUICBsb3dlcjsKKworICAgICAgICBpZiAoICEgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICB9CisgICAgICAgIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICNpZiAhIGRlZmluZWQoIEtNUF9HT01QX0NPTVBBVCApCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgICAgIEtNUF9NQigpOworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyUlZCBiZWZvcmUgd2FpdDogb3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwgVVQgPiggJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJSVkIGFmdGVyIHdhaXQ6IG9yZGVyZWRfaXRlcjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2R4b19lcnJvciggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aCA9IF9fa21wX3RocmVhZHNbKmd0aWRfcmVmXTsKKyAgICAgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50IC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHI7CisKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKy8vICAgIGludCAgY2lkID0gKmNpZF9yZWY7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGggLT4gdGgudGhfZGlzcGF0Y2ggKTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9keG86IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBpZiAoIHByIC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gICogc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisKKyAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gKTsKKyAgICAgICAgI2lmICEgZGVmaW5lZCggS01QX0dPTVBfQ09NUEFUICkKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICAgICAgICAgICAgICAgICAgLyogSG93IHRvIHRlc3QgaXQ/IC0gT00gKi8KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNNdWx0aXBsZU5lc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qICFkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgKz0gMTsKKworICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBidW1waW5nIG9yZGVyZWQgb3JkZXJlZF9idW1wZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwci0+b3JkZXJlZF9idW1wZWQgKSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIFRPRE8gdXNlIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmU/ICovCisgICAgICAgIHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKy8qIENvbXB1dGVzIGFuZCByZXR1cm5zIHggdG8gdGhlIHBvd2VyIG9mIHksIHdoZXJlIHkgbXVzdCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgbG9uZyBkb3VibGUKK19fa21wX3Bvdyhsb25nIGRvdWJsZSB4LCBVVCB5KSB7CisgICAgbG9uZyBkb3VibGUgcz0xLjBMOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh4ID4gMC4wICYmIHggPCAxLjApOworICAgIC8vS01QX0RFQlVHX0FTU0VSVCh5ID49IDApOyAvLyB5IGlzIHVuc2lnbmVkCisgICAgd2hpbGUoeSkgeworICAgICAgICBpZiAoIHkgJiAxICkKKyAgICAgICAgICAgIHMgKj0geDsKKyAgICAgICAgeCAqPSB4OworICAgICAgICB5ID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmFzc2lnbmVkIGl0ZXJhdGlvbnMgYWZ0ZXIgaWR4IGNodW5rcyBoYXZlIGJlZW4gYXNzaWduZWQKKyAgICh0aGUgdG90YWwgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBpbiBjaHVua3Mgd2l0aCBpbmRleCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaWR4KS4KKyAgIF9fZm9yY2VpbmxpbmUgc2VlbXMgdG8gYmUgYnJva2VuIHNvIHRoYXQgaWYgd2UgX19mb3JjZWlubGluZSB0aGlzIGZ1bmN0aW9uLCB0aGUgYmVoYXZpb3IgaXMgd3JvbmcKKyAgIChvbmUgb2YgdGhlIHVuaXQgdGVzdHMsIHNjaF9ndWlkZWRfYW5hbHl0aWNhbF9iYXNpYy5jcHAsIGZhaWxzKQorKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2lubGluZSB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90CitfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nKAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCBiYXNlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgaWR4CispIHsKKyAgICAvKiBOb3RlOiBPbiBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBhdAorICAgICAgIGxlYXN0IGZvciBJQ0wgOC4xLCBsb25nIGRvdWJsZSBhcml0aG1ldGljIG1heSBub3QgcmVhbGx5IGhhdmUKKyAgICAgICBsb25nIGRvdWJsZSBwcmVjaXNpb24sIGV2ZW4gd2l0aCAvUWxvbmdfZG91YmxlLiAgQ3VycmVudGx5LCB3ZQorICAgICAgIHdvcmthcm91bmQgdGhhdCBpbiB0aGUgY2FsbGVyIGNvZGUsIGJ5IG1hbmlwdWxhdGluZyB0aGUgRlBDVyBmb3IKKyAgICAgICBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuICBUaGUgbGFjayBvZiBwcmVjaXNpb24gaXMgbm90CisgICAgICAgZXhwZWN0ZWQgdG8gYmUgYSBjb3JyZWN0bmVzcyBpc3N1ZSwgdGhvdWdoLgorICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKworICAgIGxvbmcgZG91YmxlIHggPSB0YyAqIF9fa21wX3BvdzwgVVQgPihiYXNlLCBpZHgpOworICAgIFVUIHIgPSAoVVQpIHg7CisgICAgaWYgKCB4ID09IHIgKQorICAgICAgICByZXR1cm4gcjsKKyAgICByZXR1cm4gciArIDE7Cit9CisKKy8vIFBhcmFtZXRlcnMgb2YgdGhlIGd1aWRlZC1pdGVyYXRpdmUgYWxnb3JpdGhtOgorLy8gICBwMiA9IG4gKiBucHJvYyAqICggY2h1bmsgKyAxICkgIC8vIHBvaW50IG9mIHN3aXRjaGluZyB0byBkeW5hbWljCisvLyAgIHAzID0gMSAvICggbiAqIG5wcm9jICkgICAgICAgICAgLy8gcmVtYWluaW5nIGl0ZXJhdGlvbnMgbXVsdGlwbGllcgorLy8gYnkgZGVmYXVsdCBuID0gMi4gRm9yIGV4YW1wbGUgd2l0aCBuID0gMyB0aGUgY2h1bmtzIGRpc3RyaWJ1dGlvbiB3aWxsIGJlIG1vcmUgZmxhdC4KKy8vIFdpdGggbiA9IDEgZmlyc3QgY2h1bmsgaXMgdGhlIHNhbWUgYXMgZm9yIHN0YXRpYyBzY2hlZHVsZSwgZS5nLiB0cmlwIC8gbnByb2MuCitzdGF0aWMgaW50IGd1aWRlZF9pbnRfcGFyYW0gPSAyOworc3RhdGljIGRvdWJsZSBndWlkZWRfZmx0X3BhcmFtID0gMC41Oy8vID0gMS4wIC8gZ3VpZGVkX2ludF9wYXJhbTsKKworLy8gVVQgLSB1bnNpZ25lZCBmbGF2b3Igb2YgVCwgU1QgLSBzaWduZWQgZmxhdm9yIG9mIFQsCisvLyBEQkwgLSBkb3VibGUgaWYgc2l6ZW9mKFQpPT00LCBvciBsb25nIGRvdWJsZSBpZiBzaXplb2YoVCk9PTgKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAqIGxvYywKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHViLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90IHN0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90IGNodW5rLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MKKykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OmZsb2F0aW5nX3QgIERCTDsKKyAgICBzdGF0aWMgY29uc3QgaW50IF9fX2ttcF9zaXplX3R5cGUgPSBzaXplb2YoIFVUICk7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTsKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjOworICAgIGttcF9pbmZvX3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGg7CisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtOworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfYnVmZmVyX2luZGV4OworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICAgICAgICAgICogcHI7CisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaDsKKworICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKSA9PSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyApICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiApID09IHNpemVvZiggZGlzcGF0Y2hfc2hhcmVkX2luZm8gKSApOworCisgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIGNhbGxlZDogc2NoZWR1bGU6JSVkIGNodW5rOiUlJXMgbGI6JSUlcyB1YjolJSVzIHN0OiUlJXNcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwgZ3RpZCwgc2NoZWR1bGUsIGNodW5rLCBsYiwgdWIsIHN0ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgIC8qIHNldHVwIGRhdGEgKi8KKyAgICB0aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgdGVhbSAgID0gdGggLT4gdGgudGhfdGVhbTsKKyAgICBhY3RpdmUgPSAhIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgdGgtPnRoLnRoX2lkZW50ID0gbG9jOworCisgICAgaWYgKCAhIGFjdGl2ZSApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCArKzsKKworICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2hlbiBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzLCBuZWVkIHRvIHJlc2l6ZSBidWZmZXI/ICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICogPgorICAgICAgICAgICAgKCAmdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogPgorICAgICAgICAgICAgKCAmdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgIH0KKworICAgIC8qIFBpY2sgdXAgdGhlIG5vbWVyZ2Uvb3JkZXJlZCBiaXRzIGZyb20gdGhlIHNjaGVkdWxpbmcgdHlwZSAqLworICAgIGlmICggKHNjaGVkdWxlID49IGttcF9ubV9sb3dlcikgJiYgKHNjaGVkdWxlIDwga21wX25tX3VwcGVyKSApIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfbm1fbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgcHItPnR5cGVfc2l6ZSA9IF9fX2ttcF9zaXplX3R5cGU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICAgIGlmICgga21wX29yZF9sb3dlciAmIHNjaGVkdWxlICkgeworICAgICAgICBwci0+b3JkZXJlZCA9IFRSVUU7CisgICAgICAgIHNjaGVkdWxlID0gKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpYyApIHsKKyAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3J1bnRpbWUgKSB7CisgICAgICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNjaGVkdWxpbmcgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgX19rbXBfc2NoX2RlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IHRlYW0gLT4gdC50X3NjaGVkLnJfc2NoZWRfdHlwZTsKKyAgICAgICAgICAgICAgICAvLyBEZXRhaWwgdGhlIHNjaGVkdWxlIGlmIG5lZWRlZCAoZ2xvYmFsIGNvbnRyb2xzIGFyZSBkaWZmZXJlbnRpYXRlZCBhcHByb3ByaWF0ZWx5KQorICAgICAgICAgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGNodW5rIHNpemUgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgICAgIGNodW5rID0gdGVhbSAtPiB0LnRfc2NoZWQuY2h1bms7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZCA9IF9fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKTsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNjaGVkdWxpbmcgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSBhbmQvb3IgS01QX1NDSEVEVUxFIG9yIGRlZmF1bHQKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgICAgICAgICAgICAgIGNodW5rICAgID0gcl9zY2hlZC5jaHVuazsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBuZXc6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuayApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IF9fa21wX2d1aWRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggY2h1bmsgPD0gMCApIHsKKyAgICAgICAgICAgICAgICBjaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9hdXRvICkgeworICAgICAgICAgICAgLy8gbWFwcGluZyBhbmQgZGlmZmVyZW50aWF0aW9uOiBpbiB0aGUgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKQorICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9hdXRvOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDoga21wX3NjaF9hdXRvOiBUIyUlZCBuZXc6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuayApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgICAgICAvKiBndWlkZWQgYW5hbHl0aWNhbCBub3Qgc2FmZSBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICBpZiAoIHRlYW0tPnQudF9ucHJvYyA+IDE8PDIwICYmIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCApIHsKKyAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRGlzcGF0Y2hNYW55VGhyZWFkcyApOworICAgICAgICB9CisgICAgICAgIHByLT51LnAucGFybTEgPSBjaHVuazsKKyAgICB9CisgICAgS01QX0FTU0VSVDIoIChrbXBfc2NoX2xvd2VyIDwgc2NoZWR1bGUgJiYgc2NoZWR1bGUgPCBrbXBfc2NoX3VwcGVyKSwKKyAgICAgICAgICAgICAgICAidW5rbm93biBzY2hlZHVsaW5nIHR5cGUiICk7CisKKyAgICBwci0+dS5wLmNvdW50ID0gMDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHN0ID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsCisgICAgICAgICAgICAgICAgKCBwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvICksIGxvYworICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRjID0gKCB1YiAtIGxiICsgc3QgKTsKKyAgICBpZiAoIHN0ICE9IDEgKSB7CisgICAgICAgIGlmICggc3QgPCAwICkgeworICAgICAgICAgICAgaWYgKCBsYiA8IHViICkgeworICAgICAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgLy8gbGIgPj0gdWIKKyAgICAgICAgICAgICAgICB0YyA9IChTVCl0YyAvIHN0OyAgLy8gY29udmVydCB0byBzaWduZWQgZGl2aXNpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgLy8gc3QgPiAwCisgICAgICAgICAgICBpZiAoIHViIDwgbGIgKSB7CisgICAgICAgICAgICAgICAgdGMgPSAwOyAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgICAgICAgICAgfSBlbHNlIHsgICAvLyBsYiA+PSB1YgorICAgICAgICAgICAgICAgIHRjIC89IHN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggdWIgPCBsYiApIHsgICAgICAgIC8vIHN0ID09IDEKKyAgICAgICAgdGMgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgfQorCisgICAgcHItPnUucC5sYiA9IGxiOworICAgIHByLT51LnAudWIgPSB1YjsKKyAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgcHItPnUucC50YyA9IHRjOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgcHItPnUucC5sYXN0X3VwcGVyID0gdWIgKyBzdDsKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIC8qIE5PVEU6IG9ubHkgdGhlIGFjdGl2ZSBwYXJhbGxlbCByZWdpb24ocykgaGFzIGFjdGl2ZSBvcmRlcmVkIHNlY3Rpb25zICovCisKKyAgICBpZiAoIGFjdGl2ZSApIHsKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCA9PSAwICkgeworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2Rlb19lcnJvcjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG9fZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworCisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSAxOworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gMDsKKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2RlbzwgVVQgPjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG88IFVUID47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgZW51bSBjb25zX3R5cGUgd3MgPSBwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvOworICAgICAgICBpZiAoIHB1c2hfd3MgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IHdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCB3cywgbG9jICk7CisgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gY3Rfbm9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoIHNjaGVkdWxlICkgeworICAgICNpZiAgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgVCBudGMsIGluaXQ7CisKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX3N0ZWFsIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBudGMgPSAodGMgJSBjaHVuayA/IDEgOiAwKSArIHRjIC8gY2h1bms7CisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSAmJiBudGMgPj0gbnByb2MgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgICAgICAgICAgVCBzbWFsbF9jaHVuaywgZXh0cmFzOworCisgICAgICAgICAgICAgICAgc21hbGxfY2h1bmsgPSBudGMgLyBucHJvYzsKKyAgICAgICAgICAgICAgICBleHRyYXMgPSBudGMgJSBucHJvYzsKKworICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKCBpZCA8IGV4dHJhcyA/IGlkIDogZXh0cmFzICk7CisgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IGluaXQ7CisgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGluaXQgKyBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyAxIDogMCApOworCisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGxiOworICAgICAgICAgICAgICAgIC8vcHItPnBmaWVsZHMucGFybTMgPSAwOyAvLyBpdCdzIG5vdCB1c2VkIGluIHN0YXRpY19zdGVhbAorICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSBpZDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgICAgICAgICAgIC8qIHRvbyBmZXcgaXRlcmF0aW9uczogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICovCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAvKiBGQUxMLVRIUk9VR0ggdG8gc3RhdGljIGJhbGFuY2VkICovCisgICAgICAgIH0gLy8gY2FzZQorICAgICNlbmRpZgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFQgbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBUIGluaXQsIGxpbWl0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSApIHsKKyAgICAgICAgICAgICAgICBUIGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICAgICAgICAgIGlmICggdGMgPCBucHJvYyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpZCA8IHRjICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSAoaWQgPT0gdGMgLSAxKTsgIC8qIHBhcm0xIHN0b3JlcyAqcGxhc3RpdGVyICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsgIC8qIG1lYW5zIG5vIG1vcmUgY2h1bmtzIHRvIGV4ZWN1dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVCBzbWFsbF9jaHVuayA9IHRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgICAgIFQgZXh0cmFzID0gdGMgJSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkICogc21hbGxfY2h1bmsgKyAoaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyk7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHNtYWxsX2NodW5rIC0gKGlkIDwgZXh0cmFzID8gMCA6IDEpOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IG5wcm9jIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRjID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdGMgLSAxOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHRyaXAgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdCA9PSAxICkgeworICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQ7CisgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGxiICsgbGltaXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFQgdWJfdG1wID0gbGIgKyBsaW1pdCAqIHN0OyAgIC8vIGNhbGN1bGF0ZWQgdXBwZXIgYm91bmQsICJ1YiIgaXMgdXNlci1kZWZpbmVkIHVwcGVyIGJvdW5kCisgICAgICAgICAgICAgICAgcHItPnUucC5sYiA9IGxiICsgaW5pdCAqIHN0OworICAgICAgICAgICAgICAgIC8vIGFkanVzdCB1cHBlciBib3VuZCB0byAidWIiIGlmIG5lZWRlZCwgc28gdGhhdCBNUyBsYXN0cHJpdmF0ZSB3aWxsIG1hdGNoIGl0IGV4YWN0bHkKKyAgICAgICAgICAgICAgICBpZiAoIHN0ID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPiB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPCB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gLy8gY2FzZQorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCBjYXNlXG4iLGd0aWQpKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoMkwgKiBjaHVuayArIDEgKSAqIG5wcm9jID49IHRjICkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIHRvbyBsYXJnZSwgc3dpdGNoIHRvIGR5bmFtaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHJlbWFpbmluZyBpdGVycyBiZWNvbWUgbGVzcyB0aGFuIHBhcm0yIC0gc3dpdGNoIHRvIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGd1aWRlZF9pbnRfcGFyYW0gKiBucHJvYyAqICggY2h1bmsgKyAxICk7CisgICAgICAgICAgICAgICAgICAgICooZG91YmxlKikmcHItPnUucC5wYXJtMyA9IGd1aWRlZF9mbHRfcGFyYW0gLyBucHJvYzsgICAvLyBtYXkgb2NjdXB5IHBhcm0zIGFuZCBwYXJtNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfZ3JlZWR5IGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSB0YzsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkIGNhc2VcbiIsIGd0aWQpKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoMkwgKiBjaHVuayArIDEgKSAqIG5wcm9jID49IHRjICkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIHRvbyBsYXJnZSwgc3dpdGNoIHRvIGR5bmFtaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBjb21tb25seSB1c2VkIHRlcm06ICgyIG5wcm9jIC0gMSkvKDIgbnByb2MpICovCisgICAgICAgICAgICAgICAgICAgIERCTCB4OworCisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgLyogTGludXgqIE9TIGFscmVhZHkgaGFzIDY0LWJpdCBjb21wdXRhdGlvbiBieSBkZWZhdWx0IGZvcgorCQkgICAgICAgbG9uZyBkb3VibGUsIGFuZCBvbiBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwKKwkJICAgICAgIC9RbG9uZ19kb3VibGUgZG9lc24ndCB3b3JrLiAgT24gV2luZG93cyogT1MKKwkJICAgICAgIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgd2UgbmVlZCB0byBzZXQgcHJlY2lzaW9uIHRvCisJCSAgICAgICA2NC1iaXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA1My1iaXQuIEV2ZW4gdGhvdWdoIGxvbmcKKwkJICAgICAgIGRvdWJsZSBkb2Vzbid0IHdvcmsgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsIHRoZQorCQkgICAgICAgcmVzdWx0aW5nIGxhY2sgb2YgcHJlY2lzaW9uIGlzIG5vdCBleHBlY3RlZCB0byBpbXBhY3QKKwkJICAgICAgIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYWxnb3JpdGhtLCBidXQgdGhpcyBoYXMgbm90IGJlZW4KKwkJICAgICAgIG1hdGhlbWF0aWNhbGx5IHByb3Zlbi4KKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBGUENXIGFuZCBzZXQgcHJlY2lzaW9uIHRvIDY0LWJpdCwgYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIHRvIDUzLWJpdAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2xkRnBjdyA9IF9jb250cm9sODcoMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhfUENfNjQsX01DV19QQyk7IC8vIDAsMHgzMDAwMAorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyogdmFsdWUgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBzb2x2ZXIgZm9yIGNyb3NzLW92ZXIgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgdGFyZ2V0ID0gKChsb25nIGRvdWJsZSljaHVuayAqIDIgKyAxKSAqIG5wcm9jIC8gdGM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY3Jvc3NvdmVyIHBvaW50LS1jaHVuayBpbmRleGVzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbgorCQkgICAgICAgdGhpcyBwb2ludCBzd2l0Y2ggdG8gZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgIFVUICAgY3Jvc3M7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICB4ID0gKGxvbmcgZG91YmxlKTEuMCAtIChsb25nIGRvdWJsZSkwLjUgLyBucHJvYzsKKworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHsgLy8gdGVzdCBuYXR1cmFsIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF90ZXN0X2EgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMICBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbmF0dXJhbF9hbGlnbm1lbnQgPSAocHRyZGlmZl90KSZ0LmIgLSAocHRyZGlmZl90KSZ0IC0gKHB0cmRpZmZfdCkxOworICAgICAgICAgICAgICAgICAgICAgICAgLy9fX2ttcF93YXJuKCAiICVsbHggJWxseCAlbGxkIiwgKGxvbmcgbG9uZykmdC5kLCAobG9uZyBsb25nKSZ0LCAobG9uZyBsb25nKW5hdHVyYWxfYWxpZ25tZW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoICggKHB0cmRpZmZfdCkmcHItPnUucC5wYXJtMyApICYgKCBuYXR1cmFsX2FsaWdubWVudCApICkgPT0gMCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSB0ZXJtIGluIHRocmVhZCBwcml2YXRlIGRpc3BhdGNoIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAqKERCTCopJnByLT51LnAucGFybTMgPSB4OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNvbHZlIGZvciB0aGUgY3Jvc3NvdmVyIHBvaW50IHRvIHRoZSBuZWFyZXN0IGludGVnZXIgaSBmb3Igd2hpY2ggQ19pIDw9IGNodW5rICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgIGxlZnQsIHJpZ2h0LCBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc3RpbWF0ZSBpbml0aWFsIHVwcGVyIGFuZCBsb3dlciBib3VuZCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2Vzbid0IG1hdHRlciB3aGF0IHZhbHVlIHJpZ2h0IGlzIGFzIGxvbmcgYXMgaXQgaXMgcG9zaXRpdmUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgYWZmZWN0cyBwZXJmb3JtYW5jZSBvZiB0aGUgc29sdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAyMjk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gX19rbXBfcG93PCBVVCA+KHgscmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwID4gdGFyZ2V0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRveworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICo9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocD50YXJnZXQgJiYgcmlnaHQgPCAoMTw8MjcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPj4gMTsgLyogbG93ZXIgYm91bmQgaXMgcHJldmlvdXMgKGZhaWxlZCkgZXN0aW1hdGUgb2YgdXBwZXIgYm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpc2VjdGlvbiByb290LWZpbmRpbmcgbWV0aG9kICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGxlZnQgKyAxIDwgcmlnaHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfcG93PCBVVCA+KHgsbWlkKSA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICBjcm9zcyA9IHJpZ2h0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGFzc2VydCBzYW5pdHkgb2YgY29tcHV0ZWQgY3Jvc3NvdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoY3Jvc3MgJiYgX19rbXBfcG93PCBVVCA+KHgsIGNyb3NzIC0gMSkgPiB0YXJnZXQgJiYgX19rbXBfcG93PCBVVCA+KHgsIGNyb3NzKSA8PSB0YXJnZXQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIGNyb3Nzb3ZlciBwb2ludCBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8vIEM3NTgwMworICAgICAgICAgICAgICAgICAgICAjaWYgKCAoIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUyApICYmIEtNUF9BUkNIX1g4NiApICYmICggISBkZWZpbmVkKCBLTVBfSTggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKCooIERCTCAqICkmcHItPnUucC5wYXJtMykKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCAoeCkKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IHRjIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZyh0YywgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCwgY3Jvc3MpIC0gY3Jvc3MgKiBjaHVuazsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBGUENXCisgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csX01DV19QQyk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSB0YzsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLGd0aWQpKTsKKyAgICAgICAgICAgIHByLT51LnAucGFybTEgPSAoIHRlYW0gLT4gdC50X25wcm9jID4gMSApID8KKyAgICAgICAgICAgICAgICAoIHRjICsgdGVhbS0+dC50X25wcm9jIC0gMSApIC8gdGVhbS0+dC50X25wcm9jIDoKKyAgICAgICAgICAgICAgICB0YzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkIDoKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkIDoKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19jaHVua2VkL2ttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VzXG4iLCBndGlkKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRTUzogdHJhcGV6b2lkIHNlbGYtc2NoZWR1bGluZywgbWluaW11bSBjaHVua19zaXplID0gcGFybTEgKi8KKworICAgICAgICAgICAgVCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNDsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIHBhcm0xID0gY2h1bms7CisKKyAgICAgICAgICAgIC8qIEYgOiBzaXplIG9mIHRoZSBmaXJzdCBjeWNsZSAqLworICAgICAgICAgICAgcGFybTIgPSAoIHRjIC8gKDIgKiB0ZWFtLT50LnRfbnByb2MpICk7CisKKyAgICAgICAgICAgIGlmICggcGFybTIgPCAxICkgeworICAgICAgICAgICAgICAgIHBhcm0yID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTCA6IHNpemUgb2YgdGhlIGxhc3QgY3ljbGUuICBNYWtlIHN1cmUgdGhlIGxhc3QgY3ljbGUKKyAgICAgICAgICAgICAqICAgICBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIGZpcnN0IGN5Y2xlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIHBhcm0xIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwYXJtMSA+IHBhcm0yICkgeworICAgICAgICAgICAgICAgIHBhcm0xID0gcGFybTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE4gOiBudW1iZXIgb2YgY3ljbGVzICovCisgICAgICAgICAgICBwYXJtMyA9ICggcGFybTIgKyBwYXJtMSApOworICAgICAgICAgICAgcGFybTMgPSAoIDIgKiB0YyArIHBhcm0zIC0gMSkgLyBwYXJtMzsKKworICAgICAgICAgICAgaWYgKCBwYXJtMyA8IDIgKSB7CisgICAgICAgICAgICAgICAgcGFybTMgPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzaWdtYSA6IGRlY3JlYXNpbmcgaW5jciBvZiB0aGUgdHJhcGV6b2lkICovCisgICAgICAgICAgICBwYXJtNCA9ICggcGFybTMgLSAxICk7CisgICAgICAgICAgICBwYXJtNCA9ICggcGFybTIgLSBwYXJtMSApIC8gcGFybTQ7CisKKyAgICAgICAgICAgIC8vIHBvaW50bGVzcyBjaGVjaywgYmVjYXVzZSBwYXJtNCA+PSAwIGFsd2F5cworICAgICAgICAgICAgLy9pZiAoIHBhcm00IDwgMCApIHsKKyAgICAgICAgICAgIC8vICAgIHBhcm00ID0gMDsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gcGFybTE7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0yID0gcGFybTI7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0zID0gcGFybTM7CisgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gcGFybTQ7CisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgKSwgLy8gUHJpbWFyeSBtZXNzYWdlCisgICAgICAgICAgICAgICAgS01QX0hOVCggR2V0TmV3ZXJMaWJyYXJ5ICksICAgICAgICAgIC8vIEhpbnQKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCB0ZXJtaW5hdG9yCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoCisgICAgcHItPnNjaGVkdWxlID0gc2NoZWR1bGU7CisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoaXMgYnVmZmVyIHNob3VsZCBiZSBteV9idWZmZXJfaW5kZXggd2hlbiBpdCdzIGZyZWUgdG8gdXNlIGl0ICovCisKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgYmVmb3JlIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBrbXBfdWludDMyID4oICYgc2gtPmJ1ZmZlcl9pbmRleCwgbXlfYnVmZmVyX2luZGV4LCBfX2ttcF9lcTwga21wX3VpbnQzMiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAvLyBOb3RlOiBLTVBfV0FJVF9ZSUVMRCgpIGNhbm5vdCBiZSB1c2VkIHRoZXJlOiBidWZmZXIgaW5kZXggYW5kIG15X2J1ZmZlcl9pbmRleCBhcmUKKyAgICAgICAgICAgIC8vICphbHdheXMqIDMyLWJpdCBpbnRlZ2Vycy4KKyAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgYWZ0ZXIgd2FpdDogbXlfYnVmZmVyX2luZGV4OiVkIHNoLT5idWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBteV9idWZmZXJfaW5kZXgsIHNoLT5idWZmZXJfaW5kZXgpICk7CisKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCopIHByOworICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKSAgc2g7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCggZ3RpZCApOworICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9OyAvLyBpZgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgcmV0dXJuaW5nOiBzY2hlZHVsZTolJWQgb3JkZXJlZDolJSVzIGxiOiUlJXMgdWI6JSUlcyIgXAorICAgICAgICAgICAgIiBzdDolJSVzIHRjOiUlJXMgY291bnQ6JSUlc1xuXHRvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzIiBcCisgICAgICAgICAgICAiIHBhcm0xOiUlJXMgcGFybTI6JSUlcyBwYXJtMzolJSVzIHBhcm00OiUlJXNcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsCisgICAgICAgICAgICBndGlkLCBwci0+c2NoZWR1bGUsIHByLT5vcmRlcmVkLCBwci0+dS5wLmxiLCBwci0+dS5wLnViLAorICAgICAgICAgICAgcHItPnUucC5zdCwgcHItPnUucC50YywgcHItPnUucC5jb3VudCwKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyLCBwci0+dS5wLnBhcm0xLAorICAgICAgICAgICAgcHItPnUucC5wYXJtMiwgcHItPnUucC5wYXJtMywgcHItPnUucC5wYXJtNCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgIGlmICggX19fa21wX3NpemVfdHlwZSA8IDggKSB7CisgICAgICAvLyBJdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0aGF0IGFmdGVyIGV4ZWN1dGlvbiBvZiBhIGxvb3Agd2l0aCBzb21lIG90aGVyIHNjaGVkdWxlIGtpbmQKKyAgICAgIC8vIGFsbCB0aGUgcGFybTMgdmFyaWFibGVzIHdpbGwgY29udGFpbiB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgIC8vIEV2ZW4gaWYgYWxsIHBhcm0zIHdpbGwgYmUgdGhlIHNhbWUsIGl0IHN0aWxsIGV4aXN0cyBhIGJhZCBjYXNlIGxpa2UgdXNpbmcgMCBhbmQgMQorICAgICAgLy8gcmF0aGVyIHRoYW4gcHJvZ3JhbSBsaWZlLXRpbWUgaW5jcmVtZW50LgorICAgICAgLy8gU28gdGhlIGRlZGljYXRlZCB2YXJpYWJsZSBpcyByZXF1aXJlZC4gVGhlICdzdGF0aWNfc3RlYWxfY291bnRlcicgaXMgdXNlZC4KKyAgICAgIGlmKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpY19zdGVhbCApIHsKKyAgICAgICAgLy8gT3RoZXIgdGhyZWFkcyB3aWxsIGluc3BlY3QgdGhpcyB2YXJpYWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0uCisgICAgICAgIC8vIFRoaXMgaXMgYSBmbGFnIHNob3dpbmcgdGhhdCBvdGhlciB0aHJlYWRzIG1heSBzdGVhbCBmcm9tIHRoaXMgdGhyZWFkIHNpbmNlIHRoZW4uCisgICAgICAgIHZvbGF0aWxlIFQgKiBwID0gJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXI7CisgICAgICAgICpwID0gKnAgKyAxOworICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYgLy8gKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgVVNFX1NURUFMSU5HICkKK30KKworLyoKKyAqIEZvciBvcmRlcmVkIGxvb3BzLCBlaXRoZXIgX19rbXBfZGlzcGF0Y2hfZmluaXNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgaXRlcmF0aW9uLCBvciBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBjaHVuayBvZiBpdGVyYXRpb25zLiAgSWYgdGhlIG9yZGVyZWQgc2VjdGlvbihzKSB3ZXJlIG5vdCBleGVjdXRlZAorICogZm9yIHRoaXMgaXRlcmF0aW9uIChvciBldmVyeSBpdGVyYXRpb24gaW4gdGhpcyBjaHVuayksIHdlIG5lZWQgdG8gc2V0IHRoZQorICogb3JkZXJlZCBpdGVyYXRpb24gY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCB0aHJlYWQgY2FuIHByb2NlZWQuCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVUIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisgICAgICAgIH0gLy8gaWYKKyAgICB9IC8vIGlmCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoIGludCBndGlkLCBpZGVudF90ICpsb2MgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90IFNUOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworLy8gICAgICAgIGludCBjaWQ7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPnZvbGF0aWxlKiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisvLyAgICAgICAgZm9yIChjaWQgPSAwOyBjaWQgPCBLTVBfTUFYX09SREVSRUQ7ICsrY2lkKSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKyAgICAgICAgICAgIFVUIHVwcGVyID0gcHItPnUucC5vcmRlcmVkX3VwcGVyOworICAgICAgICAgICAgVVQgaW5jID0gdXBwZXIgLSBsb3dlciArIDE7CisKKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkID09IGluYyApIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluYyAtPSBwci0+b3JkZXJlZF9idW1wZWQ7CisKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlJWQgYmVmb3JlIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKy8vISEhISEgVE9ETyBjaGVjayBpZiB0aGUgaW5jIHNob3VsZCBiZSB1bnNpZ25lZCwgb3Igc2lnbmVkPz8/CisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGFmdGVyIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgaW5jOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMsIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHRlc3RfdGhlbl9hZGQ8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGluYyk7CisgICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgaW50CitfX2ttcF9kaXNwYXRjaF9uZXh0KAorICAgIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LCBUICpwX2xiLCBUICpwX3ViLCB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcF9zdAorKSB7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190ICBEQkw7CisgICAgc3RhdGljIGNvbnN0IGludCBfX19rbXBfc2l6ZV90eXBlID0gc2l6ZW9mKCBVVCApOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiBwcjsKKyAgICBrbXBfaW5mb190ICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0ZWFtID0gdGggLT4gdGgudGhfdGVhbTsKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgY2FsbGVkIHBfbGI6JSUlcyBwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDogJSVwXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmICggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgLyogTk9URTogc2VyaWFsaXplIHRoaXMgZGlzcGF0Y2ggYmVjYXNlIHdlIGFyZSBub3QgYXQgdGhlIGFjdGl2ZSBsZXZlbCAqLworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BfYnVmZmVyICk7IC8qIHRvcCBvZiB0aGUgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKworICAgICAgICBpZiAoIChzdGF0dXMgPSAocHItPnUucC50YyAhPSAwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgeworICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPnB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCBwci0+bm9tZXJnZSApIHsKKyAgICAgICAgICAgIGttcF9pbnQzMiBsYXN0OworICAgICAgICAgICAgVCAgICAgICAgIHN0YXJ0OworICAgICAgICAgICAgVVQgICAgICAgIGxpbWl0LCB0cmlwLCBpbml0OworICAgICAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgICAgICBUICAgICAgICAgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgaW5pdCA9IGNodW5rICogcHItPnUucC5jb3VudCsrOworICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+dS5wLnRjID0gMDsKKworICAgICAgICAgICAgKnBfbGIgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSAqcF91YjsKKyAgICAgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHBfbGFzdCApIHsKKyAgICAgICAgICAgICAgICAqcF9sYXN0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBpZgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgc2VyaWFsaXplZCBjYXNlOiBwX2xiOiUlJXMgIiBcCisgICAgICAgICAgICAgICAgInBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCAqcF9zdCwgcF9sYXN0LCBzdGF0dXMpICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW50MzIgbGFzdCA9IDA7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICpzaDsKKyAgICAgICAgVCAgICAgICAgIHN0YXJ0OworICAgICAgICBTVCAgICAgICAgaW5jcjsKKyAgICAgICAgVVQgICAgICAgIGxpbWl0LCB0cmlwLCBpbml0OworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworCisgICAgICAgIGlmICggcHItPnUucC50YyA9PSAwICkgeworICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChwci0+c2NoZWR1bGUpIHsKKyAgICAgICAgICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAmJiBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX3N0ZWFsIGNhc2VcbiIsIGd0aWQpICk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggX19fa21wX3NpemVfdHlwZSA+IDQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciB0aHJlYWRzIGRvIG5vdCBsb29rIGludG8gdGhlIGRhdGEgb2YgdGhpcyB0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIG1ha2Ugdm9sYXRpbGUgY2FzdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgICA9ICggcHItPnUucC5jb3VudCApKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoIGluaXQgPCAoVVQpcHItPnUucC51YiApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bmlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVQgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHViOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gdW5pb25faTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb3BlcmF0aW9ucyBvbiAnY291bnQnIG9yICd1YicgbXVzdCBiZSBjb21iaW5lZCBhdG9taWNhbGx5IHRvZ2V0aGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlYWxpbmcgaW1wbGVtZW50ZWQgb25seSBmb3IgNC1ieXRlIGluZGV4ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9pNCB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQuYiA9ICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvbGF0aWxlIGttcF9pbnQ2NCogKSZwci0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2b2xkLmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZuZXcuYiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQuYiA9ICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgICA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoIGluaXQgPCAoVVQpdm5ldy5wLnViICkgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHdoaWxlX2xpbWl0ID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHdoaWxlX2luZGV4ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFsZ29yaXRobSBvZiBzZWFyY2hpbmcgZm9yIGEgdmljdGltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGNsZWFuZWQgdXAgYW5kIG1lYXN1cmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAoICFzdGF0dXMgKSAmJiAoIHdoaWxlX2xpbWl0ICE9ICsrd2hpbGVfaW5kZXggKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb25faTQgIHZvbGQsIHZuZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByZW1haW5pbmc7IC8vIGttcF9pbnQzMiBiZWNhdXNlIEtNUF9JNCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICB2aWN0aW1JZHggICAgPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgb2xkVmljdGltSWR4ID0gdmljdGltSWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiAqIHZpY3RpbTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXZpY3RpbUlkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1JZHggPSB0ZWFtLT50LnRfbnByb2MgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXZpY3RpbUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0tPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAodmljdGltID09IE5VTEwgfHwgdmljdGltID09IHByKSAmJiBvbGRWaWN0aW1JZHggIT0gdmljdGltSWR4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGEgcHJvcGVyIHBsYWNlIG9mIHRoaXMgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggIXZpY3RpbSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCooIHZvbGF0aWxlIFQgKiApJnZpY3RpbS0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCB2b2xhdGlsZSBUICogKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZGVsYXkgd291bGQgYmUgbmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmljdGltIGlzIG5vdCByZWFkeSB5ZXQgdG8gcGFydGljaXBhdGUgaW4gc3RlYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHZpY3RpbSBpcyBzdGlsbCBpbiBrbXBfaW5pdF9kaXNwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggb2xkVmljdGltSWR4ID09IHZpY3RpbUlkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSB2aWN0aW1JZHg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCAmdmljdGltLT51LnAuY291bnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodm5ldy5wLnViIC0gMSkgKiAoVVQpY2h1bmsgPD0gdHJpcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB2bmV3LnAuY291bnQgPj0gKFVUKXZuZXcucC51YiB8fCAocmVtYWluaW5nID0gdm5ldy5wLnViIC0gdm5ldy5wLmNvdW50KSA8IDQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAudWIgLT0gKHJlbWFpbmluZyA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgd2FybmluZyBvbiBwb2ludGxlc3MgY29tcGFyaXNvbiBvZiB1bnNpZ25lZCB3aXRoIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMTg2ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHZuZXcucC51YiA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkmdmljdGltLT51LnAuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2b2xkLmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2bmV3LmIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG93biBjb3VudCBhbmQgdWIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlYWxpbmcgZXhlY3V0ZWQgb24gbm9uLUtNUF9BUkNIX1g4NiBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0b21pYyA2NC1iaXQgd3JpdGUgb24gaWEzMiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmF2YWlsYWJsZSwgc28gd2UgZG8gdGhpcyBpbiBzdGVwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIFRoaXMgY29kZSBpcyBub3QgdGVzdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdm9sZC5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IGluaXQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnViID0gdm5ldy5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB2bmV3LnAudWI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQucC5jb3VudCA9IGluaXQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpcyBpdCBzYWZlIGFuZCBlbm91Z2g/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpID0gdm9sZC5iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlICgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoICFzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgKj0gY2h1bms7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICNlbmRpZiAvLyAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAmJiBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkIGNhc2VcbiIsIGd0aWQpICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9ICFwci0+dS5wLmNvdW50KSAhPSAwICkgeyAgLyogY2hlY2sgaWYgdGhyZWFkIGhhcyBhbnkgaXRlcmF0aW9uIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIG5vIGl0ZXJhdGlvbnMgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBwci0+dS5wLnViICsgcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6ICAvKiBvcmlnaW5hbCBjb2RlIGZvciBrbXBfc2NoX3N0YXRpY19ncmVlZHkgd2FzIG1lcmdlZCBoZXJlICovCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIHBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX1thZmZpbml0eXxjaHVua2VkXSBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFybTEgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YyAtIDE7CisgICAgICAgICAgICAgICAgICAgIGluaXQgID0gcGFybTEgKiAocHItPnUucC5jb3VudCArIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBwYXJtMSArIGluaXQgLSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgKz0gdGVhbS0+dC50X25wcm9jOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBpdGVyYXRpdmUgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXRvbWljIHBhcnQgb2YgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUICByZW1haW5pbmc7ICAgICAgICAgICAgIC8vIHNpZ25lZCwgYmVjYXVzZSBjYW4gYmUgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gc2gtPnUucy5pdGVyYXRpb247ICAvLyBzaGFyZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPD0gMCApIHsgICAgLy8gQUM6IG5lZWQgdG8gY29tcGFyZSB3aXRoIDAgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLCBkb24ndCB0cnkgYXRvbWljIG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKFQpcmVtYWluaW5nIDwgcHItPnUucC5wYXJtMiApIHsgLy8gY29tcGFyZSB3aXRoIEsqbnByb2MqKGNodW5rKzEpLCBLPTIgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkeW5hbWljLXN0eWxlIHNoY2VkdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljYWxseSBpbnJlbWVudCBpdGVyYXRpb25zLCBnZXQgb2xkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KCAoU1QqKSZzaC0+dS5zLml0ZXJhdGlvbiwgKFNUKWNodW5rc3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAvLyBhbGwgaXRlcmF0aW9ucyBnb3QgYnkgb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvdCBzb21lIGl0ZXJhdGlvbnMgdG8gd29yayBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA+IGNodW5rc3BlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMTsgICAvLyB0aGUgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgcmVtYWluaW5nIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIChVVCkoIHJlbWFpbmluZyAqICooZG91YmxlKikmcHItPnUucC5wYXJtMyApOyAvLyBkaXZpZGUgYnkgSypucHJvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21wYXJlX2FuZF9zd2FwPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVClpbml0LCAoU1QpbGltaXQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDQVMgd2FzIHN1Y2Nlc3NmdWwsIGNodW5rIG9idGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCAgIGNodW5rc3BlYyA9IHByLT51LnAucGFybTE7CisgICAgICAgICAgICAgICAgICAgIFVUIGNodW5rSWR4OworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgLyogZm9yIHN0b3Jpbmcgb3JpZ2luYWwgRlBDVyB2YWx1ZSBmb3IgV2luZG93cyogT1Mgb24KKwkJICAgICAgIElBLTMyIGFyY2hpdGVjdHVyZSA4LWJ5dGUgdmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2xkRnBjdzsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZwY3dTZXQgPSAwOworICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkIGFuYWx5dGljYWwgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJpcCAgPSBwci0+dS5wLnRjOworCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X25wcm9jID4gMSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKDJVTCAqIGNodW5rc3BlYyArIDEpICogKFVUKXRlYW0tPnQudF9ucHJvYyA8IHRyaXApOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsgLyogdGhpcyB3aGlsZSBsb29wIGlzIGEgc2FmZWd1YXJkIGFnYWluc3QgdW5leHBlY3RlZCB6ZXJvIGNodW5rIHNpemVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua0lkeCA9IHRlc3RfdGhlbl9pbmNfYWNxPCBTVCA+KCh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMuaXRlcmF0aW9uICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNodW5rSWR4ID49IChVVClwci0+dS5wLnBhcm0yICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGNodW5rSWR4ICogY2h1bmtzcGVjICsgcHItPnUucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHZlcmlmeSBpbml0ID4gMCBpbiBjYXNlIG9mIG92ZXJmbG93IGluIHRoZSBhYm92ZSBjYWxjdWxhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0ID4gMCAmJiBpbml0IDw9IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBjaHVua3NwZWMgLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZXhwb25lbnRpYWwtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgdG8gd29ya2Fyb3VuZCB0aGUgbGFjayBvZiBsb25nIGRvdWJsZSBwcmVjaXNpb24gb24gV2luZG93cyogT1MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjaGVjayB3b3JrcyBhcm91bmQgdGhlIHBvc3NpYmxlIGVmZmVjdCB0aGF0IGluaXQgIT0gMCBmb3IgY2h1bmtJZHggPT0gMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIHNhdmUgb3JpZ2luYWwKKwkJCSAgICAgICBGUENXIGFuZCBzZXQgcHJlY2lzaW9uIHRvIDY0LWJpdCwgYXMgV2luZG93cyogT1MKKwkJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgZGVmYXVsdHMgdG8gNTMtYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhZnBjd1NldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRnBjdyA9IF9jb250cm9sODcoMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhfUENfNjQsX01DV19QQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwY3dTZXQgPSAweDMwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNodW5rSWR4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzwgVCA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXAsICooIERCTCAqICkmcHItPnUucC5wYXJtMywgY2h1bmtJZHggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXAgLSBfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nPCBUID4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXAsICooIERCTCAqICkmcHItPnUucC5wYXJtMywgY2h1bmtJZHggKyAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChpbml0IDw9IGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluaXQgPCBsaW1pdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsaW1pdCA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlICgxKQorICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBGUENXIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICBBQzogY2hlY2sgZnBjd1NldCBmbGFnIGZpcnN0IGJlY2F1c2Ugb2xkRnBjdyBjYW4gYmUgdW5pbml0aWFsaXplZCBoZXJlCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICggZnBjd1NldCAmJiAoIG9sZEZwY3cgJiBmcGN3U2V0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVVCAgIGluZGV4OworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm0yID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtMyA9IHByLT51LnAucGFybTM7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTQgPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gKCBpbmRleCAqICggKDIqcGFybTIpIC0gKGluZGV4LTEpKnBhcm00ICkgKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoKFQpaW5kZXggPCBwYXJtMyAmJiBpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9ICggKGluZGV4KzEpICogKCAyKnBhcm0yIC0gaW5kZXgqcGFybTQgKSApIC8gMiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoCisgICAgICAgIH0gLy8gaWYgdGMgPT0gMDsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgVVQgICBudW1fZG9uZTsKKworICAgICAgICAgICAgbnVtX2RvbmUgPSB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm51bV9kb25lICk7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBpbmNyZW1lbnQgbnVtX2RvbmU6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5udW1fZG9uZSApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgaWYgKCBudW1fZG9uZSA9PSB0ZWFtLT50LnRfbnByb2MtMSApIHsKKyAgICAgICAgICAgICAgICAvKiBOT1RFOiByZWxlYXNlIHRoaXMgYnVmZmVyIHRvIGJlIHJldXNlZCAqLworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgICAgICAgICBzaC0+dS5zLm51bV9kb25lID0gMDsKKyAgICAgICAgICAgICAgICBzaC0+dS5zLml0ZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlPyAqLworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2ggLT4gYnVmZmVyX2luZGV4ICs9IEtNUF9NQVhfRElTUF9CVUY7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQgY2hhbmdlIGJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IE5VTEw7CisgICAgICAgIH0gLy8gaWYgKHN0YXR1cyA9PSAwKQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGVsc2UgaWYgKCBsYXN0ICkgeworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgfSAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBub3JtYWwgY2FzZTogIiBcCisgICAgICAgICAgICAicF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0LCBzdGF0dXMgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGlzcGF0Y2ggcm91dGluZXMKKy8vICAgIFRyYW5zZmVyIGNhbGwgdG8gdGVtcGxhdGU8IHR5cGUgVCA+CisvLyAgICBfX2ttcF9kaXNwYXRjaF9pbml0KCBpZGVudF90ICpsb2MsIGludCBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBUIGxiLCBUIHViLCBTVCBzdCwgU1QgY2h1bmsgKQorZXh0ZXJuICJDIiB7CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAeworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBzY2hlZHVsZSBTY2hlZHVsZSB0eXBlCitAcGFyYW0gbGIgIExvd2VyIGJvdW5kCitAcGFyYW0gdWIgIFVwcGVyIGJvdW5kCitAcGFyYW0gc3QgIFN0ZXAgKG9yIGluY3JlbWVudCBpZiB5b3UgcHJlZmVyKQorQHBhcmFtIGNodW5rIFRoZSBjaHVuayBzaXplIHRvIGJsb2NrIHdpdGgKKworVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgcnVudGltZSB0byBzdGFydCBhIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBmb3IgbG9vcCwgc2F2aW5nIHRoZSBsb29wIGFyZ3VtZW50cy4KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgorKi8KKwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gcF9sYXN0IFBvaW50ZXIgdG8gYSBmbGFnIHNldCB0byBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBjaHVuayBvciB6ZXJvIG90aGVyd2lzZQorQHBhcmFtIHBfbGIgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZCBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHBhcmFtIHBfdWIgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHBhcmFtIHBfc3QgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IGNodW5rIG9mIHdvcmsKK0ByZXR1cm4gb25lIGlmIHRoZXJlIGlzIHdvcmsgdG8gYmUgZG9uZSwgemVybyBvdGhlcndpc2UKKworR2V0IHRoZSBuZXh0IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjaHVuayBvZiB3b3JrIGZvciB0aGlzIHRocmVhZC4KK0lmIHRoZXJlIGlzIG5vIG1vcmUgd29yaywgdGhlbiB0aGUgbGIsdWIgYW5kIHN0cmlkZSBuZWVkIG5vdCBiZSBtb2RpZmllZC4KKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorQHBhcmFtIGxvYyBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorCitNYXJrIHRoZSBlbmQgb2YgYSBkeW5hbWljIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisvKiEgQH0gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9Ob24tdGVtcGxhdGUgcm91dGluZXMgZnJvbSBrbXBfZGlzcGF0Y2guYyB1c2VkIGluIG90aGVyIHNvdXJjZXMKKwora21wX3VpbnQzMiBfX2ttcF9lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9uZXFfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbHRfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDwgY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9nZV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sZV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPD0gY2hlY2tlcjsKK30KK2ttcF91aW50MzIgX19rbXBfZXFfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID09IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbmVxXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSAhPSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2x0XzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfZ2VfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID49IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbGVfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDw9IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIKK19fa21wX3dhaXRfeWllbGRfNCh2b2xhdGlsZSBrbXBfdWludDMyICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICgqIHByZWQpKCBrbXBfdWludDMyLCBrbXBfdWludDMyICkKKyAgICAgICAgICAgICAgICAgICAsIHZvaWQgICAgICAgICogb2JqICAgIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICAgIHJlZ2lzdGVyIHZvbGF0aWxlIGttcF91aW50MzIgICAgICAgICAqIHNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBrbXBfdWludDMyLCBrbXBfdWludDMyICkgPSBwcmVkOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gVENSXzQoKnNwaW4pLCBjaGVjaykpIHsKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisgICAgICAgIC8qIEdFSCAtIHJlbW92ZSB0aGlzIHNpbmNlIGl0IHdhcyBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCB3aGVuIGttcF93YWl0IHdhcyBzcGxpdC4KKyAgICAgICAgICAgSXQgY2F1c2VzIHByb2JsZW1zIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIGJlY2F1c2Ugb2YgZXhpdCBsb2NrICovCisgICAgICAgIC8qIGlmICggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSAmJiBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KQorICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7ICovCisKKyAgICAgICAgX19rbXBfc3RhdGljX2RlbGF5KFRSVUUpOworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgd2FpdGVkIGEgYml0LCBvciBhcmUgb3ZlcnN1YnNjcmliZWQsIHlpZWxkICovCisgICAgICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK2ttcF91aW50NjQKK19fa21wX3dhaXRfeWllbGRfOCggdm9sYXRpbGUga21wX3VpbnQ2NCAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgICAgICAgICAgICBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICgqIHByZWQpKCBrbXBfdWludDY0LCBrbXBfdWludDY0ICkKKyAgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgKQoreworICAgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgICAgcmVnaXN0ZXIgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQ2NCAgICAgICAgICAgY2hlY2sgICAgICAgICA9IGNoZWNrZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgIHNwaW5zOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgKCpmKSAoIGttcF91aW50NjQsIGttcF91aW50NjQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQ2NCAgICAgICAgICAgcjsKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgKHZvaWQqKSBzcGluICk7CisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisgICAgLy8gbWFpbiB3YWl0IHNwaW4gbG9vcAorICAgIHdoaWxlKCFmKHIgPSAqc3BpbiwgY2hlY2spKQorICAgIHsKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisgICAgICAgIC8qIEdFSCAtIHJlbW92ZSB0aGlzIHNpbmNlIGl0IHdhcyBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCB3aGVuIGttcF93YWl0IHdhcyBzcGxpdC4KKyAgICAgICAgICAgSXQgY2F1c2VzIHByb2JsZW1zIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIGJlY2F1c2Ugb2YgZXhpdCBsb2NrICovCisgICAgICAgIC8qIGlmICggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSAmJiBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KQorICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7ICovCisKKyAgICAgICAgX19rbXBfc3RhdGljX2RlbGF5KFRSVUUpOworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCQVJSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmMgYi9yYzEvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlOWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5jIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqICRSZXZpc2lvbjogNDIyNjMgJAorICogJERhdGU6IDIwMTMtMDQtMDQgMTE6MDM6MTkgLTA1MDAgKFRodSwgMDQgQXByIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgIEpIIDEyLzIzLzIwMDIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPbiBXaW5kb3dzKiBPUywgdGhlcmUgYXJlIHR3byBlbnZpcm9ubWVudHMgKGF0IGxlYXN0LCBzZWUgYmVsb3cpOgorCisgICAgICAgIDEuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAKKwkgICBBY2Nlc3NpYmxlIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLAorICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKS4KKworICAgICAgICAyLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBBY2Nlc3NpYmxlIHRocm91Z2ggZ2V0ZW52KCksIHB1dGVudigpLgorCisgICAgcHV0ZW52KCkgZnVuY3Rpb24gdXBkYXRlcyBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gZ2V0ZW52KCkgZnVuY3Rpb24gCisgICAgc2VhcmNoIGZvciB2YXJpYWJsZXMgaW4gQyBSVEwgZW52aXJvbm1lbnQgb25seS4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGZ1bmN0aW9ucyB3b3JrICpvbmx5KiAKKyAgICB3aXRoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKworICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seSBvbmUgV2luZG93cyogT1Mgb24gCisgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIHBlciBwcm9jZXNzLiBDaGFuZ2VzIGluIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgcHJvY2Vzcy12aXNpYmxlLgorCisgICAgQyBlbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBNdWx0aXBsZSBjb3BpZXMgb2YgQyBSVEwgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MsIGFuZAorICAgIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICAgVGh1cywgcHJvcGVyIHdheSB0byB3b3JrIHdpdGggZW52aXJvbm1lbnQgb24gV2luZG93cyogT1MgaXM6CisKKyAgICAgICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIGJlaW5nIHVwZGF0ZWQuIFdpbmRvd3MqIE9TIG9uIAorCSAgIElBLTMyIGFyY2hpdGVjdHVyZSBtYXkgYmUgY29uc2lkZXJlZCBhcyBwcmltYXJ5IHRhcmdldCwKKwkgICB3aGlsZSB1cGRhdGluZyBDIFJUTCBlbnZpcm9ubWVudCBpcyBhIGZyZWUgYm9udXMuCisKKyAgICAgICAgMi4gR2V0IHZhcmlhYmxlcyB3aXRoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSAtLSBnZXRlbnYoKSBkb2VzIG5vdCAKKwkgICBzZWFyY2ggV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIG5vdCBzZWUgdmFyaWFibGVzCisJICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAgMjAwNy0wNC0wNSAtLSBsZXYKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAvLyBLTVBfT1NfKi4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgLy8KKyNpbmNsdWRlICJrbXBfc3RyLmgiICAgLy8gX19rbXBfc3RyXyooKS4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIGdldGVudiwgc2V0ZW52LCB1bnNldGVudi4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8vIHN0cmxlbiwgc3RyY3B5LgorICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiAqIGVudmlyb247CisgICAgI2VsaWYgS01QX09TX0RBUldJTgorICAgICAgICAjaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyAgICAgICAgI2RlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8d2luZG93cy5oPiAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUsIFNldEVudmlyb25tZW50VmFyaWFibGUsIEdldExhc3RFcnJvci4KKyNlbHNlCisgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisjZW5kaWYKKworCisvLyBUT0RPOiBFbGltaW5hdGUgZGlyZWN0IG1lbW9yeSBhbGxvY2F0aW9ucywgdXNlIHN0cmluZyBvcGVyYXRpb25zIGluc3RlYWQuCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgKgorYWxsb2NhdGUoCisgICAgc2l6ZV90IHNpemUKKykgeworICAgIHZvaWQgKiBwdHIgPSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKwlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcHRyOworfSAvLyBhbGxvY2F0ZQorCisKK2NoYXIgKgorX19rbXBfZW52X2dldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBjaGFyICogcmVzdWx0ID0gTlVMTDsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBnZXRlbnYoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiggdmFsdWUgKSArIDE7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBzdHJuY3B5KCByZXN1bHQsIHZhbHVlLCBsZW4gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKgorICAgICAgICAgICAgV2UgdXNlIEdldEVudmlyb25tZW50VmFyaWFibGUgZm9yIFdpbmRvd3MqIE9TIGluc3RlYWQgb2YgZ2V0ZW52IGJlY2F1c2UgdGhlIGFjdCBvZgorICAgICAgICAgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgICAgICAgICB1bmF2YWlsYWJsZS4gIGdldGVudigpIGFwcGFyZW50bHkgZ2V0cyBhIGNsZWFuIGNvcHkgb2YgdGhlIGVudiB2YXJpYWJsZXMgYXMgdGhleSBleGlzdGVkCisgICAgICAgICAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICAgICAgICAgIEpIIDEyLzIzLzIwMDIKKyAgICAgICAgKi8KKyAgICAgICAgRFdPUkQgcmM7CisgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAvLyBWYXJpYWJsZSBpcyBub3QgZm91bmQsIGl0J3Mgb2ssIGp1c3QgY29udGludWUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEV09SRCBsZW4gPSByYzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiApOworICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgcmVzdWx0LCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgbWF5IHJldHVybiAwIGlmIHZhcmlhYmxlIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4KKyAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBlcnJvci4gVGhlIHZhcmlhYmxlIHNob3VsZCBiZSBpbiB0aGUgZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZ2V0CisKKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorCit2b2lkCitfX2ttcF9lbnZfZnJlZSggY2hhciBjb25zdCAqICogdmFsdWUgKSB7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogdmFsdWUgKTsKKyAgICAqIHZhbHVlID0gTlVMTDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9mcmVlCisKKworCitpbnQKK19fa21wX2Vudl9leGlzdHMoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICByZXR1cm4gKCAoIHZhbHVlID09IE5VTEwgKSA/ICggMCApIDogKCAxICkgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9leGlzdHMKKworCisKK3ZvaWQKK19fa21wX2Vudl9zZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIGludCBvdmVyd3JpdGUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgaW50IHJjID0gc2V0ZW52KCBuYW1lLCB2YWx1ZSwgb3ZlcndyaXRlICk7CisgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgIC8vIERlYWQgY29kZS4gSSB0cmllZCB0byBwdXQgdG9vIG1hbnkgdmFyaWFibGVzIGludG8gTGludXgqIE9TCisgICAgICAgICAgICAvLyBlbnZpcm9ubWVudCBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIFdoZW4gYXBwbGljYXRpb24gY29uc3VtZXMKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiB+Mi41IEdCIG9mIG1lbW9yeSwgZW50aXJlIHN5c3RlbSBmZWVscyBiYWQuIFNvbWV0aW1lcworICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gaXMga2lsbGVkIChieSBPUz8pLCBzb21ldGltZXMgc3lzdGVtIHN0b3BzIAorICAgICAgICAgICAgLy8gcmVzcG9uZGluZy4uLiBCdXQgdGhpcyBlcnJvciBtZXNzYWdlIG5ldmVyIGFwcGVhcnMuIC0tbG4KKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIE5vdEVub3VnaE1lbW9yeSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIEJPT0wgcmM7CisgICAgICAgIGlmICggISBvdmVyd3JpdGUgKSB7CisgICAgICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgLy8gVmFyaWFibGUgZXhpc3RzLCBkbyBub3Qgb3ZlcndyaXRlLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJjID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfc2V0CisKKworCit2b2lkCitfX2ttcF9lbnZfdW5zZXQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIHVuc2V0ZW52KCBuYW1lICk7CisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgQk9PTCByYyA9IFNldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwgKTsKKyAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfdW5zZXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEludGVsIE9wZW5NUCBSVEwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudmlyb25tZW50OiBqdXN0IGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMsIHZhcmlhYmxlcworICAgIGFyZSBzZXBhcmF0ZWQgd2l0aCB2ZXJ0aWNhbCBiYXJzLCBlLiBnLjoKKworICAgICAgICAiS01QX1dBUk5JTkdTPTB8S01QX0FGRklOSVRZPWNvbXBhY3R8IgorCisgICAgRW1wdHkgdmFyaWFibGVzIGFyZSBhbGxvd2VkIGFuZCBpZ25vcmVkOgorCisgICAgICAgICJ8fEtNUF9XQVJOSU5HUz0xfHwiCisKKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2Vfc3RyaW5nKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jaywgICAvLyBNOiBFbnYgYmxvY2sgdG8gZmlsbC4KKyAgICBjaGFyIGNvbnN0ICogICAgZW52ICAgICAgLy8gSTogU3RyaW5nIHRvIHBhcnNlLgorKSB7CisKKyAgICBjaGFyIGNvbnN0IGNocl9kZWxpbWl0ZXIgICA9ICd8JzsKKyAgICBjaGFyIGNvbnN0IHN0cl9kZWxpbWl0ZXJbXSA9IHsgY2hyX2RlbGltaXRlciwgMCB9OworCisgICAgY2hhciAqICAgICAgICAgIGJ1bGsgICAgICAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICAgICAgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgICAgICA9IDA7ICAvLyBOdW1iZXIgb2YgdXNlZCBlbGVtZW50cyBpbiB2YXJzIGFycmF5LgorICAgIGludCAgICAgICAgICAgICBkZWxpbWl0ZXJzID0gMDsgIC8vIE51bWJlciBvZiBkZWxpbWl0ZXJzIGluIGlucHV0IHN0cmluZy4KKworICAgIC8vIENvcHkgb3JpZ2luYWwgc3RyaW5nLCB3ZSB3aWxsIG1vZGlmeSB0aGUgY29weS4KKyAgICBidWxrID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZW52ICk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJzIGluIGVudmlyb25tZW50IGJsb2NrLiBDb3VudCBkZWxpbWl0ZXJzIChtYXhpbXVtIG51bWJlciBvZiB2YXJpYWJsZXMKKyAgICAvLyBpcyBudW1iZXIgb2YgZGVsaW1pdGVycyBwbHVzIG9uZSkuCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogcHRyID0gYnVsazsKKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgcHRyID0gc3RyY2hyKCBwdHIsIGNocl9kZWxpbWl0ZXIgKTsKKyAgICAgICAgICAgIGlmICggcHRyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgKysgZGVsaW1pdGVyczsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICB9OyAvLyBmb3JldmVyCisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoICggZGVsaW1pdGVycyArIDEgKSAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJpYWJsZXMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byB2YXJpYWJsZSAoYm90aCBuYW1lIGFuZCB2YWx1ZSkuCisgICAgICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgICAgIGNoYXIgKiB2YWx1ZTsgICAvLyBQb2ludGVyIHRvIHZhbHVlLgorICAgICAgICBjaGFyICogYnVmOyAgICAgLy8gQnVmZmVyIGZvciBfX2ttcF9zdHJfdG9rZW4oKSBmdW5jdGlvbi4KKyAgICAgICAgdmFyID0gX19rbXBfc3RyX3Rva2VuKCBidWxrLCBzdHJfZGVsaW1pdGVyLCAmIGJ1ZiApOyAgICAgIC8vIEdldCB0aGUgZmlyc3QgdmFyLgorICAgICAgICB3aGlsZSAoIHZhciAhPSBOVUxMICkgeworICAgICAgICAgICAgLy8gU2F2ZSBmb3VuZCB2YXJpYWJsZSBpbiB2YXJzIGFycmF5LgorICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjb3VudCA8IGRlbGltaXRlcnMgKyAxICk7CisgICAgICAgICAgICB2YXJzWyBjb3VudCBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgIHZhcnNbIGNvdW50IF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgICAgIHZhciA9IF9fa21wX3N0cl90b2tlbiggTlVMTCwgc3RyX2RlbGltaXRlciwgJiBidWYgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcKKworCisKKy8qCisgICAgV2luZG93cyogT1MgKGFjdHVhbGx5LCBET1MpIGVudmlyb25tZW50IGJsb2NrIGlzIGEgcGllY2Ugb2YgbWVtb3J5IHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzLiBFYWNoCisgICAgdmFyaWFibGUgaXMgdGVybWluYXRlZCB3aXRoIHplcm8gYnl0ZSwgZW50aXJlIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2l0aCBvbmUgZXh0cmEgemVybyBieXRlLCBzbworICAgIHdlIGhhdmUgdHdvIHplcm8gYnl0ZXMgYXQgdGhlIGVuZCBvZiBlbnZpcm9ubWVudCBibG9jaywgZS4gZy46CisKKyAgICAgICAgIkhPTUU9QzpcXHVzZXJzXFxsZXZceDAwT1M9V2luZG93c19OVFx4MDBceDAwIgorCisgICAgSXQgaXMgbm90IGNsZWFyIGhvdyBlbXB0eSBlbnZpcm9ubWVudCBpcyByZXByZXNlbnRlZC4gIlx4MDBceDAwIj8KKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cygKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciBjb25zdCAqICAgIGVudiAgICAgIC8vIEk6IFBvaW50ZXIgdG8gV2luZG93cyogT1MgKERPUykgZW52aXJvbm1lbnQgYmxvY2suCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOyAgICAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgPSAwOyAgICAgLy8gU2l6ZSBvZiBidWxrLgorCisgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKworICAgIGlmICggZW52ICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycyBpbiBlbnZpcm9ubWVudCBibG9jay4gQ291bnQgdmFyaWFibGVzLCBmaW5kIHNpemUgb2YgYmxvY2suCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgICAgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gZW52OyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCB2YXJpYWJsZSBzdGFydHMgYW5kIGJlZ2lubmluZyBvZiBlbnZpcm9ubWVudCBibG9jay4KKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB3aGlsZSAoIGxlbiAhPSAwICkgeworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIHNpemUgPSBzaXplICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBsZW4gKyAxOyAvLyBNb3ZlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIHNpemUgPSBzaXplICsgMTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGVudiBibG9jaywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gYnl0ZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3JpZ2luYWwgYmxvY2sgdG8gYnVsaywgd2Ugd2lsbCBtb2RpZnkgYnVsaywgbm90IG9yaWdpbmFsIGJsb2NrLgorICAgICAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICAgICAgbWVtY3B5KCBidWxrLCBlbnYsIHNpemUgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICAgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycywgbm93IGluIGJ1bGsuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB3aGlsZSAoIGxlbiAhPSAwICkgeworICAgICAgICAgICAgICAgIC8vIFNhdmUgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICB9CisKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICAgIGJsb2NrLT5idWxrICA9IGJ1bGs7CisgICAgYmxvY2stPnZhcnMgID0gdmFyczsKKyAgICBibG9jay0+Y291bnQgPSBjb3VudDsKKworfTsgLy8gX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cworCisKKworLyoKKyAgICBVbml4IGVudmlyb25tZW50IGJsb2NrIGlzIGEgYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmFyaWFibGVzLCBsYXN0IHBvaW50ZXIgaW4gYXJyYXkgaXMgTlVMTDoKKworICAgICAgICB7ICJIT01FPS9ob21lL2xldiIsICJURVJNPXh0ZXJtIiwgTlVMTCB9CisqLworCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgKiAqICAgICAgICBlbnYgICAgICAvLyBJOiBVbml4IGVudmlyb25tZW50IHRvIHBhcnNlLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgPSAwOyAgICAvLyBTaXplIG9mIGJ1bGsuCisKKyAgICAvLyBDb3VudCBudW1iZXIgb2YgdmFyaWFibGVzIGFuZCBsZW5ndGggb2YgcmVxdWlyZWQgYnVsay4KKyAgICB7CisgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgc2l6ZSAgPSAwOworICAgICAgICB3aGlsZSAoIGVudlsgY291bnQgXSAhPSBOVUxMICkgeworICAgICAgICAgICAgc2l6ZSArPSBzdHJsZW4oIGVudlsgY291bnQgXSApICsgMTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgaW50ICAgIGk7CisgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHZhcmlhYmxlIHRvIGJ1bGsuCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIGVudlsgaSBdICk7CisgICAgICAgICAgICBtZW1jcHkoIHZhciwgZW52WyBpIF0sIGxlbiArIDEgKTsKKyAgICAgICAgICAgIC8vIFNhdmUgZm91bmQgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdmFyLCAnPScsICYgbmFtZSwgJiB2YWx1ZSApOworICAgICAgICAgICAgdmFyc1sgaSBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gTW92ZSBwb2ludGVyLgorICAgICAgICAgICAgdmFyICs9IGxlbiArIDE7CisgICAgICAgIH07IC8vIGZvcgorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgKKworCisKK3ZvaWQKK19fa21wX2Vudl9ibGtfaW5pdCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAvLyBNOiBCbG9jayB0byBpbml0aWFsaXplLgorICAgIGNoYXIgY29uc3QgKiAgICBidWxrICAgIC8vIEk6IEluaXRpYWxpemF0aW9uIHN0cmluZywgb3IgTlVMTC4KKykgeworCisgICAgaWYgKCBidWxrICE9IE5VTEwgKSB7CisgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZyggYmxvY2ssIGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgoIGJsb2NrLCBlbnZpcm9uICk7CisgICAgICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqIG1lbSA9IEdldEVudmlyb25tZW50U3RyaW5ncygpOworICAgICAgICAgICAgICAgIGlmICggbWVtID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZpcm9ubWVudCApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzKCBibG9jaywgbWVtICk7CisgICAgICAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5ncyggbWVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAgICAgI2VuZGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9lbnZfYmxrX2luaXQKKworCisKK3N0YXRpYworaW50CitfX19rbXBfZW52X3Zhcl9jbXAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgcXNvcnQoKS4KKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogbGhzLAorICAgIGttcF9lbnZfdmFyX3QgY29uc3QgKiByaHMKKykgeworICAgIHJldHVybiBzdHJjbXAoIGxocy0+bmFtZSwgcmhzLT5uYW1lICk7Cit9CisKK3ZvaWQKK19fa21wX2Vudl9ibGtfc29ydCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2sgIC8vIE06IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzb3J0LgorKSB7CisKKyAgICBxc29ydCgKKyAgICAgICAgKHZvaWQgKikgYmxvY2stPnZhcnMsCisgICAgICAgIGJsb2NrLT5jb3VudCwKKyAgICAgICAgc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICksCisgICAgICAgICggaW50ICggKiApKCB2b2lkIGNvbnN0ICosIHZvaWQgY29uc3QgKiApICkgJiBfX19rbXBfZW52X3Zhcl9jbXAKKyAgICApOworCit9IC8vIF9fa21wX2Vudl9ibG9ja19zb3J0CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2ZyZWUoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZnJlZS4KKykgeworCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGJsb2NrLT52YXJzICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGJsb2NrLT5idWxrICk7CisKKyAgICBibG9jay0+Y291bnQgPSAwOworICAgIGJsb2NrLT52YXJzICA9IE5VTEw7CisgICAgYmxvY2stPmJ1bGsgID0gTlVMTDsKKworfSAvLyBfX2ttcF9lbnZfYmxrX2ZyZWUKKworCisKK2NoYXIgY29uc3QgKiAgICAgICAgICAgICAgIC8vIFI6IFZhbHVlIG9mIHZhcmlhYmxlIG9yIE5VTEwgaWYgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuCitfX2ttcF9lbnZfYmxrX3ZhcigKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssIC8vIEk6IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICBjaGFyIGNvbnN0ICogICAgbmFtZSAgIC8vIEk6IE5hbWUgb2YgdmFyaWFibGUgdG8gZmluZC4KKykgeworCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay0+Y291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggc3RyY21wKCBibG9jay0+dmFyc1sgaSBdLm5hbWUsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLT52YXJzWyBpIF0udmFsdWU7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisgICAgcmV0dXJuIE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsb2NrX3ZhcgorCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmggYi9yYzEvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjMmVjNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDgzIEBACisvKgorICoga21wX2Vudmlyb25tZW50LmggLS0gSGFuZGxlIGVudmlyb25tZW50IHZhcm9pYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRU5WSVJPTk1FTlRfSAorI2RlZmluZSBLTVBfRU5WSVJPTk1FTlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIE5VTEwgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorLy8gKk5vdGUqOiBSZXR1cm5lZCBwb2ludGVkICptdXN0KiBiZSBmcmVlZCBhZnRlciB1c2Ugd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorY2hhciAqIF9fa21wX2Vudl9nZXQoIGNoYXIgY29uc3QgKiBuYW1lICk7Cit2b2lkICAgX19rbXBfZW52X2ZyZWUoIGNoYXIgY29uc3QgKiAqIHZhbHVlICk7CisKKy8vIFJldHVybiAxIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBleGlzdHMgb3IgMCBpZiBkb2VzIG5vdCBleGlzdC4KK2ludCBfX2ttcF9lbnZfZXhpc3RzKCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvLyBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgordm9pZCBfX2ttcF9lbnZfc2V0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCBpbnQgb3ZlcndyaXRlICk7CisKKy8vIFVuc2V0IChyZW1vdmUpIGVudmlyb25tZW50IHZhcmlhYmxlLgordm9pZCBfX2ttcF9lbnZfdW5zZXQoIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdvcmtpbmcgd2l0aCBlbnZpcm9ubWVudCBibG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAga21wX2Vudl9ibGtfdCBpcyByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKG9yIGVudmlyb25tZW50LWxpa2UpLiBVc2FnZToKKworICAgICAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsgLy8gSW5pdGlhbGl6ZSBibG9jayBmcm9tIHByb2Nlc3MgZW52aXJvbm1lbnQuCisgICAgICAgIC8vIG9yCisgICAgICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgIktNUF9XQVJOSU5HPTF8S01QX0FGRklOSVRZPW5vbmUiICk7IC8vIGZyb20gc3RyaW5nLgorICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsgLy8gT3B0aW9uYWxseSwgc29ydCBsaXN0LgorICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICAgICAgLy8gUHJvY2VzcyBibG9jay52YXJzWyBpIF0ubmFtZSBhbmQgYmxvY2sudmFyc1sgaSBdLnZhbHVlLi4uCisgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIF9fa21wX2Vudl9ibG9ja19mcmVlKCAmIGJsb2NrICk7CisqLworCitzdHJ1Y3QgX19rbXBfZW52X3ZhciB7CisgICAgY2hhciBjb25zdCAqIG5hbWU7CisgICAgY2hhciBjb25zdCAqIHZhbHVlOworfTsKK3R5cGVkZWYgc3RydWN0IF9fa21wX2Vudl92YXIga21wX2Vudl92YXJfdDsKKworc3RydWN0IF9fa21wX2Vudl9ibGsgeworICAgIGNoYXIgY29uc3QgKiAgICAgICAgICBidWxrOworICAgIGttcF9lbnZfdmFyX3QgY29uc3QgKiB2YXJzOworICAgIGludCAgICAgICAgICAgICAgICAgICBjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfYmxrIGttcF9lbnZfYmxrX3Q7CisKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoIGttcF9lbnZfYmxrX3QgKiBibG9jaywgY2hhciBjb25zdCAqIGJ1bGsgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOwordm9pZCAgICAgICAgIF9fa21wX2Vudl9ibGtfc29ydCgga21wX2Vudl9ibGtfdCAqIGJsb2NrICk7CitjaGFyIGNvbnN0ICogX19rbXBfZW52X2Jsa192YXIoICBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRU5WSVJPTk1FTlRfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2Vycm9yLmMgYi9yYzEvcnVudGltZS9zcmMva21wX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhMTcyOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYwpAQCAtMCwwICsxLDUyNiBAQAorLyogCisgKiBrbXBfZXJyb3IuYyAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnNfdGV4dF9mb3J0W10gPSB7CisgICAgIihub25lKSIsCisgICAgIlBBUkFMTEVMIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkIERPIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgU0VDVElPTlMgYW5kIFdPUktTSEFSRSBkaXJlY3RpdmVzICovCisgICAgIk9SREVSRUQgd29yay1zaGFyaW5nIiwgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCBETyBPUkRFUkVEIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgU0VDVElPTlMgZGlyZWN0aXZlcyAqLworICAgICJTRUNUSU9OUyIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCBTSU5HTEUgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiBTRUNUSU9OUyBhbmQgV09SS1NIQVJFIGRpcmVjdGl2ZXMgKi8KKyAgICAiVEFTS1EiLAorICAgICJUQVNLUSIsCisgICAgIlRBU0tRIE9SREVSRUQiLAorICAgICJDUklUSUNBTCIsCisgICAgIk9SREVSRUQiLCAgICAgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIk9SREVSRUQiLCAgICAgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJPUkRFUkVEIiwgICAgICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJNQVNURVIiLAorICAgICJSRURVQ0UiLAorICAgICJCQVJSSUVSIgorfTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zX3RleHRfY1tdID0geworICAgICIobm9uZSkiLAorICAgICJcInBhcmFsbGVsXCIiLAorICAgICJ3b3JrLXNoYXJpbmciLCAgICAgICAgICAgICAvKiB0aGlzIGlzIG5vdCBjYWxsZWQgImZvciIgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJvcmRlcmVkXCIgd29yay1zaGFyaW5nIiwgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3Igb3JkZXJlZCIgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJzZWN0aW9uc1wiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJzaW5nbGUiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwidGFza3FcIiIsCisgICAgIlwidGFza3FcIiIsCisgICAgIlwidGFza3Egb3JkZXJlZFwiIiwKKyAgICAiXCJjcml0aWNhbFwiIiwKKyAgICAiXCJvcmRlcmVkXCIiLCAgICAgICAgICAgICAgLyogaW4gUEFSQUxMRUwgKi8KKyAgICAiXCJvcmRlcmVkXCIiLCAgICAgICAgICAgICAgLyogaW4gUERPICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFRBU0tRICovCisgICAgIlwibWFzdGVyXCIiLAorICAgICJcInJlZHVjZVwiIiwKKyAgICAiXCJiYXJyaWVyXCIiCit9OworCisjZGVmaW5lIGdldF9zcmMoIGlkZW50ICkgICAoIChpZGVudCkgPT0gTlVMTCA/IE5VTEwgOiAoaWRlbnQpLT5wc291cmNlICkKKworI2RlZmluZSBQVVNIX01TRyggY3QsIGlkZW50ICkgXAorICAgICJcdHB1c2hpbmcgb24gc3RhY2s6ICVzICglcylcbiIsIGNvbnNfdGV4dF9jWyAoY3QpIF0sIGdldF9zcmMoIChpZGVudCkgKQorI2RlZmluZSBQT1BfTVNHKCBwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJcdHBvcHBpbmcgb2ZmIHN0YWNrOiAlcyAoJXMpXG4iLCAgICAgICAgICAgICAgICAgXAorICAgIGNvbnNfdGV4dF9jWyAocCktPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgXSwgICAgICAgXAorICAgIGdldF9zcmMoIChwKS0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgKQorCitzdGF0aWMgaW50IGNvbnN0IGNvbnNfdGV4dF9mb3J0X251bSA9IHNpemVvZiggY29uc190ZXh0X2ZvcnQgKSAvIHNpemVvZiggY2hhciBjb25zdCAqICk7CitzdGF0aWMgaW50IGNvbnN0IGNvbnNfdGV4dF9jX251bSAgICA9IHNpemVvZiggY29uc190ZXh0X2MgICAgKSAvIHNpemVvZiggY2hhciBjb25zdCAqICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tIFNUQVJUIE9GIFNUQVRJQyBMT0NBTCBST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2NoZWNrX251bGxfZnVuYyggdm9pZCApCit7CisgICAgLyogbm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgKQoreworICAgIGludCAgICBpOworICAgIHN0cnVjdCBjb25zX2RhdGEgKmQ7CisKKyAgICAvKiBUT0RPIGZvciBtb25pdG9yIHBlcmhhcHM/ICovCisgICAgaWYgKGd0aWQgPCAwKQorICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJleHBhbmQgY29uc19zdGFjayAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworICAgIGQgPSBwLT5zdGFja19kYXRhOworCisgICAgcC0+c3RhY2tfc2l6ZSA9IChwLT5zdGFja19zaXplICogMikgKyAxMDA7CisKKyAgICAvKiBUT0RPIGZyZWUgdGhlIG9sZCBkYXRhICovCisgICAgcC0+c3RhY2tfZGF0YSA9IChzdHJ1Y3QgY29uc19kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBjb25zX2RhdGEgKSAqIChwLT5zdGFja19zaXplKzEpICk7CisKKyAgICBmb3IgKGkgPSBwLT5zdGFja190b3A7IGkgPj0gMDsgLS1pKQorICAgICAgICBwLT5zdGFja19kYXRhW2ldID0gZFtpXTsKKworICAgIC8qIE5PVEU6IHdlIGRvIG5vdCBmcmVlIHRoZSBvbGQgc3RhY2tfZGF0YSAqLworfQorCisvLyBOT1RFOiBGdW5jdGlvbiByZXR1cm5zIGFsbG9jYXRlZCBtZW1vcnksIGNhbGxlciBtdXN0IGZyZWUgaXQhCitzdGF0aWMgY2hhciBjb25zdCAqCitfX2ttcF9wcmFnbWEoCisgICAgZW51bSBjb25zX3R5cGUgICBjdCwKKyAgICBpZGVudF90IGNvbnN0ICogIGlkZW50CispIHsKKyAgICBjaGFyIGNvbnN0ICogY29ucyA9IE5VTEw7ICAvLyBDb25zdHJ1Y3QgbmFtZS4KKyAgICBjaGFyICogZmlsZSA9IE5VTEw7ICAvLyBGaWxlIG5hbWUuCisgICAgY2hhciAqIGZ1bmMgPSBOVUxMOyAgLy8gRnVuY3Rpb24gKHJvdXRpbmUpIG5hbWUuCisgICAgY2hhciAqIGxpbmUgPSBOVUxMOyAgLy8gTGluZSBudW1iZXIuCisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAga21wX21zZ190ICAgICBwcmdtOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICBpZiAoIDAgPCBjdCAmJiBjdCA8PSBjb25zX3RleHRfY19udW0gKSB7OworICAgICAgICBjb25zID0gY29uc190ZXh0X2NbIGN0IF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgIH07CisgICAgaWYgKCBpZGVudCAhPSBOVUxMICYmIGlkZW50LT5wc291cmNlICE9IE5VTEwgKSB7CisgICAgICAgIGNoYXIgKiB0YWlsID0gTlVMTDsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlcyIsIGlkZW50LT5wc291cmNlICk7IC8vIENvcHkgc291cmNlIHRvIGJ1ZmZlci4KKyAgICAgICAgLy8gU3BsaXQgc3RyaW5nIGluIGJ1ZmZlciB0byBmaWxlLCBmdW5jLCBhbmQgbGluZS4KKyAgICAgICAgdGFpbCA9IGJ1ZmZlci5zdHI7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCBOVUxMLCAgICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBmaWxlLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgZnVuYywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGxpbmUsICYgdGFpbCApOworICAgIH07IC8vIGlmCisgICAgcHJnbSA9IF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2ZtdF9QcmFnbWEsIGNvbnMsIGZpbGUsIGZ1bmMsIGxpbmUgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisgICAgcmV0dXJuIHByZ20uc3RyOworfSAvLyBfX2ttcF9wcmFnbWEKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBFTkQgT0YgU1RBVElDIExPQ0FMIFJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3ZvaWQKK19fa21wX2Vycm9yX2NvbnN0cnVjdCgKKyAgICBrbXBfaTE4bl9pZF90ICAgIGlkLCAgICAgLy8gTWVzc2FnZSBpZGVudGlmaWVyLgorICAgIGVudW0gY29uc190eXBlICAgY3QsICAgICAvLyBDb25zdHJ1Y3QgdHlwZS4KKyAgICBpZGVudF90IGNvbnN0ICogIGlkZW50ICAgLy8gQ29uc3RydWN0IGlkZW50LgorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdCA9IF9fa21wX3ByYWdtYSggY3QsIGlkZW50ICk7CisgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoIGlkLCBjb25zdHJ1Y3QgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0ICk7Cit9CisKK3ZvaWQKK19fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAga21wX2kxOG5faWRfdCAgICAgICAgICAgIGlkLCAgICAgLy8gTWVzc2FnZSBpZGVudGlmaWVyLgorICAgIGVudW0gY29uc190eXBlICAgICAgICAgICBjdCwgICAgIC8vIEZpcnN0IGNvbnN0cnVjdCB0eXBlLgorICAgIGlkZW50X3QgY29uc3QgKiAgICAgICAgICBpZGVudCwgIC8vIEZpcnN0IGNvbnN0cnVjdCBpZGVudC4KKyAgICBzdHJ1Y3QgY29uc19kYXRhIGNvbnN0ICogY29ucyAgICAvLyBTZWNvbmQgY29uc3RydWN0LgorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdDEgPSBfX2ttcF9wcmFnbWEoIGN0LCBpZGVudCApOworICAgIGNoYXIgY29uc3QgKiBjb25zdHJ1Y3QyID0gX19rbXBfcHJhZ21hKCBjb25zLT50eXBlLCBjb25zLT5pZGVudCApOworICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBfX2ttcF9tc2dfZm9ybWF0KCBpZCwgY29uc3RydWN0MSwgY29uc3RydWN0MiApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QxICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdDIgKTsKK30KKworCitzdHJ1Y3QgY29uc19oZWFkZXIgKgorX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKQoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcDsKKworICAgIC8qIFRPRE8gZm9yIG1vbml0b3IgcGVyaGFwcz8gKi8KKyAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICB9OyAvLyBpZgorICAgIEtFX1RSQUNFKCAxMCwgKCJhbGxvY2F0ZSBjb25zX3N0YWNrICglZClcbiIsIGd0aWQgKSApOworICAgIHAgPSAoc3RydWN0IGNvbnNfaGVhZGVyICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBjb25zX2hlYWRlciApICk7CisgICAgcC0+cF90b3AgPSBwLT53X3RvcCA9IHAtPnNfdG9wID0gMDsKKyAgICBwLT5zdGFja19kYXRhID0gKHN0cnVjdCBjb25zX2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IGNvbnNfZGF0YSApICogKE1JTl9TVEFDSysxKSApOworICAgIHAtPnN0YWNrX3NpemUgPSBNSU5fU1RBQ0s7CisgICAgcC0+c3RhY2tfdG9wICA9IDA7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS5wcmV2ID0gMDsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0uaWRlbnQgPSBOVUxMOworICAgIHJldHVybiBwOworfQorCit2b2lkCitfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHZvaWQgKiBwdHIgKSB7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICogcCA9IChzdHJ1Y3QgY29uc19oZWFkZXIgKikgcHRyOworICAgIGlmICggcCAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHAtPnN0YWNrX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHAtPnN0YWNrX2RhdGEgKTsKKyAgICAgICAgICAgIHAtPnN0YWNrX2RhdGEgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9mcmVlKCBwICk7CisgICAgfTsgLy8gaWYKK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICogcCApIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkJlZ2luIGNvbnN0cnVjdCBzdGFjayB3aXRoICVkIGl0ZW1zIGZvciB0aHJlYWQgJWRcbiIsIHRvcywgZ3RpZCApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgICBzdGFja190b3A9JWQgeyBQPSVkLCBXPSVkLCBTPSVkIH1cbiIsIHRvcywgcC0+cF90b3AsIHAtPndfdG9wLCBwLT5zX3RvcCApOworICAgIGZvciAoIGkgPSB0b3M7IGkgPiAwOyBpLS0gKSB7CisgICAgICAgIHN0cnVjdCBjb25zX2RhdGEgKiBjID0gJiAoIHAtPnN0YWNrX2RhdGFbIGkgXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICAgICAgc3RhY2tfZGF0YVslMmRdID0geyAlcyAoJXMpICVkICVwIH1cbiIsIGksIGNvbnNfdGV4dF9jWyBjLT50eXBlIF0sIGdldF9zcmMoIGMtPmlkZW50ICksIGMtPnByZXYsIGMtPm5hbWUgKTsKKyAgICB9OyAvLyBmb3IgaQorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiRW5kIGNvbnN0cnVjdCBzdGFjayBmb3IgdGhyZWFkICVkXG4iLCBndGlkICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstXG4iICk7CisgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworfQorCit2b2lkCitfX2ttcF9wdXNoX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX2NvbnMgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfcHVzaF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBVU0hfTVNHKCBjdF9wYXJhbGxlbCwgaWRlbnQgKSApICk7CisgICAgaWYgKCBwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSApIHsKKyAgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKyAgICB9OyAvLyBpZgorICAgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9wYXJhbGxlbDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2ID0gcC0+cF90b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lID0gTlVMTDsKKyAgICBwLT5wX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCit2b2lkCitfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX2NoZWNrX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworCisgICAgaWYgKCBwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSApIHsKKyAgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcC0+d190b3AgPiBwLT5wX3RvcCAmJgorICAgICAgICAhKElTX0NPTlNfVFlQRV9UQVNLUShwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUpICYmIElTX0NPTlNfVFlQRV9UQVNLUShjdCkpKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJFIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24uCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LCAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcC0+c190b3AgPiBwLT5wX3RvcCApIHsKKyAgICAgICAgLy8gV2UgYXJlIGFscmVhZHkgaW4gYSBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24uCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LCAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0gKTsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wdXNoX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCAgICAgICAgIHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgY3QsIGlkZW50ICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2ID0gcC0+d190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lID0gTlVMTDsKKyAgICBwLT53X3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCit2b2lkCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX2NoZWNrX3N5bmMgKGd0aWQ9JWQpXG4iLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworICAgIGlmIChwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSkKKyAgICAgICBfX2ttcF9leHBhbmRfY29uc19zdGFjayggZ3RpZCwgcCApOworCisgICAgaWYgKGN0ID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwgY3QgPT0gY3Rfb3JkZXJlZF9pbl9wZG8gfHwgY3QgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wIDw9IHAtPnBfdG9wKSB7CisgICAgICAgICAgICAvKiB3ZSBhcmUgbm90IGluIGEgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgICAgICAgICAgICAjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgICAgICAgICAgICAgIC8qIGRvIG5vdCByZXBvcnQgZXJyb3IgbWVzc2FnZXMgZm9yIFBBUkFMTEVMIE9SREVSRUQgKi8KKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsICk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0JvdW5kVG9Xb3Jrc2hhcmluZywgY3QsIGlkZW50ICk7CisgICAgICAgICAgICAjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICAgaWYgKCFJU19DT05TX1RZUEVfT1JERVJFRChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0udHlwZSA9PSBjdF90YXNrcSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vdEluVGFza0NvbnN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTm9PcmRlcmVkQ2xhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPnNfdG9wID4gcC0+cF90b3AgJiYgcC0+c190b3AgPiBwLT53X3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgc3luYyBjb25zdHJ1Y3Qgd2hpY2ggaXMgaW5zaWRlIGEgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwLT5zX3RvcDsKKyAgICAgICAgICAgIGVudW0gY29uc190eXBlIHN0YWNrX3R5cGU7CisKKyAgICAgICAgICAgIHN0YWNrX3R5cGUgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnR5cGU7CisKKyAgICAgICAgICAgIGlmIChzdGFja190eXBlID09IGN0X2NyaXRpY2FsIHx8CisgICAgICAgICAgICAgICAgKCAoIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgICAgICBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGRvICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3Rhc2txICApICYmICAgICAvKiBDIGRvZXNuJ3QgYWxsb3cgbmFtZWQgb3JkZXJlZDsgb3JkZXJlZCBpbiBvcmRlcmVkIGdldHMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgcC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgIChwLT5zdGFja19kYXRhWyBpbmRleCBdLmlkZW50LT5mbGFncyAmIEtNUF9JREVOVF9LTVBDICkpKSB7CisgICAgICAgICAgICAgICAgLyogd2UgYXJlIGluIE9SREVSRUQgd2hpY2ggaXMgaW5zaWRlIGFuIE9SREVSRUQgb3IgQ1JJVElDQUwgY29uc3RydWN0ICovCisgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgaW5kZXggXQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBjdCA9PSBjdF9jcml0aWNhbCApIHsKKyAgICAgICAgaWYgKCBsY2sgIT0gTlVMTCAmJiBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeyAgICAvKiB0aGlzIHNhbWUgdGhyZWFkIGFscmVhZHkgaGFzIGxvY2sgZm9yIHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBzdHJ1Y3QgY29uc19kYXRhIGNvbnMgPSB7IE5VTEwsIGN0X2NyaXRpY2FsLCAwLCBOVUxMIH07CisgICAgICAgICAgICAvKiB3YWxrIHVwIGNvbnN0cnVjdCBzdGFjayBhbmQgdHJ5IHRvIGZpbmQgY3JpdGljYWwgd2l0aCBtYXRjaGluZyBuYW1lICovCisgICAgICAgICAgICB3aGlsZSAoIGluZGV4ICE9IDAgJiYgcC0+c3RhY2tfZGF0YVsgaW5kZXggXS5uYW1lICE9IGxjayApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ucHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBmb3VuZCBtYXRjaCBvbiB0aGUgc3RhY2sgKG1heSBub3QgYWx3YXlzIGJlY2F1c2Ugb2YgaW50ZXJsZWF2ZWQgY3JpdGljYWwgZm9yIEZvcnRyYW4pICovCisgICAgICAgICAgICAgICAgY29ucyA9IHAtPnN0YWNrX2RhdGFbIGluZGV4IF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB3ZSBhcmUgaW4gQ1JJVElDQUwgd2hpY2ggaXMgaW5zaWRlIGEgQ1JJVElDQUwgY29uc3RydWN0IG9mIHRoZSBzYW1lIG5hbWUgKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNOZXN0aW5nU2FtZU5hbWUsIGN0LCBpZGVudCwgJiBjb25zICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBjdCA9PSBjdF9tYXN0ZXIgfHwgY3QgPT0gY3RfcmVkdWNlICkgeworICAgICAgICBpZiAocC0+d190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN0ID09IGN0X3JlZHVjZSAmJiBwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgICAgICAvKiBpbnNpZGUgYSBhbm90aGVyIFNZTkMgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+c190b3AgXQorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfc3luYyAoZ3RpZD0lZClcbiIsIGd0aWQgKSApOworICAgIF9fa21wX2NoZWNrX3N5bmMoIGd0aWQsIGN0LCBpZGVudCwgbGNrICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrIHAtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICA9IGN0OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXYgID0gcC0+c190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lICA9IGxjazsKKyAgICBwLT5zX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICB0b3MgPSBwLT5zdGFja190b3A7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnBfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQgKTsKKyAgICB9CisgICAgaWYgKCB0b3MgIT0gcC0+cF90b3AgfHwgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAhPSBjdF9wYXJhbGxlbCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0X3BhcmFsbGVsLCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCitlbnVtIGNvbnNfdHlwZQorX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIGlmICggdG9zID09IDAgfHwgcC0+d190b3AgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCApOworICAgIH0KKworICAgIGlmICggdG9zICE9IHAtPndfdG9wIHx8CisgICAgICAgICAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAgICAvKiBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaCAqLworICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Bkb19vcmRlcmVkICYmIGN0ID09IGN0X3BkbyApICYmCisgICAgICAgICAgISAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2sgKQorICAgICAgICAgKQorICAgICAgICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworICAgIHJldHVybiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGU7Cit9CisKK3ZvaWQKK19fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfc3luYyAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnNfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9OworICAgIGlmICggdG9zICE9IHAtPnNfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyB0b3MgXQorICAgICAgICApOworICAgIH07CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBPUF9NU0coIHAgKSApICk7CisgICAgcC0+c190b3AgPSBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gTlVMTDsKKyAgICBwLT5zdGFja190b3AgPSB0b3MgLSAxOworICAgIEtFX0RVTVAoIDEwMDAsIGR1bXBfY29uc19zdGFjayggZ3RpZCwgcCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19iYXJyaWVyIChsb2M6ICVwLCBndGlkOiAlZCAlZClcbiIsIGlkZW50LCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIGlkZW50ICE9IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH0KKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICk7CisgICAgfQorICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2Vycm9yLmggYi9yYzEvcnVudGltZS9zcmMva21wX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMGIyYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisKK3ZvaWQgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKwordm9pZCBfX2ttcF9wb3BfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK2VudW0gY29uc190eXBlIF9fa21wX3BvcF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VSUk9SX0gKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1YTdjYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGttcF9mdG5fY2RlY2wuYyAtLSBGb3J0cmFuIF9fY2RlY2wgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQyNzU3ICQKKyAqICREYXRlOiAyMDEzLTEwLTE4IDA4OjIwOjU3IC0wNTAwIChGcmksIDE4IE9jdCAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgaWYgZGVmaW5lZCAgS01QX1dJTl9DREVDTCB8fCAgIWRlZmluZWQgR1VJREVETExfRVhQT1JUUworIyAgICAgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICAgICAgS01QX0ZUTl9VUFBFUgorIyAgIGVuZGlmCisjZWxpZiBLTVBfT1NfVU5JWAorIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgIEtNUF9GVE5fUExBSU4KKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX2NkZWNsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIAkvKiBubyBzdGRjYWxsICovCisjICAgaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorIyAgIGluY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZiAvKiBLTVBfRlROX0VOVFJJRVMgKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9yYzEvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjc1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oCkBAIC0wLDAgKzEsMTIxNCBAQAorLyoKKyAqIGttcF9mdG5fZW50cnkuaCAtLSBGb3J0cmFuIGVudHJ5IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0Mjc5OCAkCisgKiAkRGF0ZTogMjAxMy0xMC0zMCAxNjozOTo1NCAtMDUwMCAoV2VkLCAzMCBPY3QgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEZUTl9TVERDQUxMCisjIGVycm9yIFRoZSBzdXBwb3J0IGZpbGUga21wX2Z0bl9lbnRyeS5oIHNob3VsZCBub3QgYmUgY29tcGlsZWQgYnkgaXRzZWxmLgorI2VuZGlmCisKKyNpZmRlZiBLTVBfU1RVQgorICAgICNpbmNsdWRlICJrbXBfc3R1Yi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgR251L01TIE9wZW4gTVAgY29kZWdlbiwgb21wX3NldF9udW1fdGhyZWFkcygpLAorICogb21wX3NldF9uZXN0ZWQoKSwgYW5kIG9tcF9zZXRfZHluYW1pYygpIFtpbiBsb3dlcmNhc2Ugb24gTVMsIGFuZCB3L28KKyAqIGEgdHJhaWxpbmcgdW5kZXJzY29yZSBvbiBMaW51eCogT1NdIHRha2UgY2FsbCBieSB2YWx1ZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqICsgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscygpCisgKiArIG9tcF9zZXRfc2NoZWR1bGUoKQorICoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggOS4xIGFuZCBwcmV2aW91cyBJbnRlbCBjb21waWxlciwgdGhlc2UKKyAqIGVudHJ5IHBvaW50cyB0YWtlIGNhbGwgYnkgcmVmZXJlbmNlIGludGVnZXIgYXJndW1lbnRzLgorICovCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGlmIChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTikgfHwgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQpCisjICBkZWZpbmUgUEFTU19BUkdTX0JZX1ZBTFVFIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIGhlbHBzIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLgorI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICNkZWZpbmUgS01QX0RFUkVGCisjZWxzZQorICAgICNkZWZpbmUgS01QX0RFUkVGICoKKyNlbmRpZgorCit2b2lkICBGVE5fU1REQ0FMTAorRlROX1NFVF9TVEFDS1NJWkUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIChzaXplX3QpIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFX1MoIHNpemVfdCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1NUQUNLU0laRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAoaW50KV9fa21wX3N0a3NpemU7CisgICAgI2VuZGlmCit9CisKK3NpemVfdCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkVfUyggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0JMT0NLVElNRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZywgdGhyZWFkLCB0aWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0JMT0NLVElNRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2Jsb2NrdGltZSgpOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGttcF90ZWFtX3AgKnRlYW07CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF90ZWFtOworCisgICAgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmdzIHVzZWQgaW4gX19rbXBfd2FpdF9zbGVlcCgpICovCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIEtNUF9NQVhfQkxPQ0tUSU1FKSApOworICAgICAgICAgICAgcmV0dXJuIEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICB9CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3plcm9fYnQgJiYgIWdldF9fYnRfc2V0KCB0ZWFtLCB0aWQgKSApIHsKKwkgICAgS0ZfVFJBQ0UoMTAsICggImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLAorCQkJICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgMCkgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyAgICAgICAgZWxzZSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKyAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKSApICk7CisgICAgICAgICAgICByZXR1cm4gZ2V0X19ibG9ja3RpbWUoIHRlYW0sIHRpZCApOworICAgICAgICB9OworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfU0VSSUFMKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfc2VyaWFsICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUlkoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgZW51bSBsaWJyYXJ5X3R5cGUgbGliOworICAgICAgICBsaWIgPSAoZW51bSBsaWJyYXJ5X3R5cGUpIEtNUF9ERVJFRiBhcmc7CisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYiApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTElCUkFSWSAodm9pZCkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfbGlicmFyeSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoaW50KSBfX2ttcF9saWJyYXJ5KTsKKyAgICAjZW5kaWYKK30KKworI2lmIE9NUF8zMF9FTkFCTEVECisKK2ludCBGVE5fU1REQ0FMTAorRlROX1NFVF9BRkZJTklUWSggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHkoIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eSggbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MoIHZvaWQgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA8PSAxICkgeworICAgICAgICAgICAgcmV0dXJuIEtNUF9DUFVfU0VUU0laRTsKKyAgICAgICAgfQorICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX3hwcm9jOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0soIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgKm1hc2sgPSBOVUxMOworICAgICNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgICptYXNrID0ga21wY19tYWxsb2MoIF9fa21wX2FmZmluX21hc2tfc2l6ZSApOworICAgICAgICBLTVBfQ1BVX1pFUk8oIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIC8vIE5vdGhpbmcKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggKm1hc2sgPT0gTlVMTCApIHsKKwkgICAgICAgIEtNUF9GQVRBTCggQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBrbXBjX2ZyZWUoICptYXNrICk7CisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAqLworCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTlVNX1RIUkVBRFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIC8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBLTVBfREVSRUYgYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBjdXJyZW50IHRlYW0gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9USFJFQURTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyhOVUxMKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaW50ICAgICAgICAgZ3RpZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBndGlkICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIC8vcmV0dXJuIHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9jdXJyZW50X3Rhc2tbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXSAtPiBpY3ZzLm5wcm9jOworCXJldHVybiB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMubnByb2M7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2V0X25wcm9jWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF07CisgICAgICAgICNlbmRpZgorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTlVNKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBndGlkOworCisgICAgICAgICNpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNECisgICAgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAgICAgICAgICAgKGd0aWQgPSAoKGttcF9pbnRwdHJfdClUbHNHZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEVpdGhlciBsaWJyYXJ5IGlzbid0IGluaXRpYWxpemVkIG9yIHRocmVhZCBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIC8vIDAgaXMgdGhlIGNvcnJlY3QgVElEIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1ndGlkOyAvLyBXZSBrZWVwIChndGlkKzEpIGluIFRMUworICAgICAgICAjZWxpZiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgaWYgKCBfX2ttcF9ndGlkX21vZGUgPj0gMyApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGd0aWQgPSBfX2ttcF9ndGlkKSA9PSBLTVBfR1RJRF9ETkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgICAgICAoZ3RpZCA9IChrbXBfaW50cHRyX3QpKHB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC0tZ3RpZDsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUworICAgICAgICAjZW5kaWYKKworICAgICAgICByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIC8qIE5PVEU6IHRoaXMgaXMgbm90IHN5bmNyb25pemVkLCBzbyBpdCBjYW4gY2hhbmdlIGF0IGFueSBtb21lbnQgKi8KKyAgICAgICAgLyogTk9URTogdGhpcyBudW1iZXIgYWxzbyBpbmNsdWRlcyB0aHJlYWRzIHByZWFsbG9jYXRlZCBpbiBob3QtdGVhbXMgKi8KKyAgICAgICAgcmV0dXJuIFRDUl80KF9fa21wX250aCk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9QUk9DUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2M7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNURUQpKCBpbnQgS01QX0RFUkVGIGZsYWcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X25lc3RlZCggS01QX0RFUkVGIGZsYWcgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworICAgICAgICBzZXRfX25lc3RlZCggdGhyZWFkLCAoIChLTVBfREVSRUYgZmxhZykgPyBUUlVFIDogRkFMU0UgKSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05FU1RFRCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9uZXN0ZWQoKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICByZXR1cm4gZ2V0X19uZXN0ZWQoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfRFlOQU1JQykoIGludCBLTVBfREVSRUYgZmxhZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfZHluYW1pYyggS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICAvLyAhISEgV2hhdCBpZiBmb3JlaWduIHRocmVhZCBjYWxscyBpdD8KKyAgICAgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisgICAgICAgIHNldF9fZHluYW1pYyggdGhyZWFkLCBLTVBfREVSRUYgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0RZTkFNSUMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfZHluYW1pYygpOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIHJldHVybiBnZXRfX2R5bmFtaWMoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX1BBUkFMTEVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCB0aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICAvLyBBQzogcl9pbl9wYXJhbGxlbCBkb2VzIG5vdCB3b3JrIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSByZWFsIHBhcmFsbGVsIGlzIGluYWN0aXZlLCBidXQgYWxsIHRocmVhZHMgaGF2ZSBzYW1lIHJvb3QsCisgICAgICAgICAgICAvLyAgICAgc28gc2V0dGluZyBpdCBpbiBvbmUgdGVhbSBhZmZlY3RzIG90aGVyIHRlYW1zLgorICAgICAgICAgICAgLy8gICAgIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgcGVyLXRlYW0gbmVzdGluZyBsZXZlbAorICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPyAxIDogMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3Jvb3QtPnIucl9pbl9wYXJhbGxlbCA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisgICAgI2VuZGlmCit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfU0NIRURVTEUpKCBrbXBfc2NoZWRfdCBLTVBfREVSRUYga2luZCwgaW50IEtNUF9ERVJFRiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc2NoZWR1bGUoIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKyAgICAgICAgLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1NDSEVEVUxFKSgga21wX3NjaGVkX3QgKiBraW5kLCBpbnQgKiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19nZXRfc2NoZWR1bGUoIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfZ2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUykoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwkvLyBOb3RoaW5nLgorICAgICNlbHNlCisJLyogIFRPIERPICAqLworICAgICAgICAvKiBXZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworICAgICAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGFyZyApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisJcmV0dXJuIF9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0FDVElWRV9MRVZFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9hY3RpdmVfbGV2ZWw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0xFVkVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X2xldmVsOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuICggS01QX0RFUkVGIGxldmVsICkgPyAoIC0xICkgOiAoIDAgKTsKKyAgICAjZWxzZQorCXJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEVBTV9TSVpFKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAoIEtNUF9ERVJFRiBsZXZlbCApID8gKCAtMSApIDogKCAxICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wX2dldF90ZWFtX3NpemUoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGxldmVsICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RIUkVBRF9MSU1JVCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAxOyAgIC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgLyogZ2xvYmFsIElDViAqLworCXJldHVybiBfX2ttcF9tYXhfbnRoOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX0ZJTkFMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7ICAgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCXJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZmluYWw7CisgICAgI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgT01QXzQwX0VOQUJMRUQKKworCitrbXBfcHJvY19iaW5kX3QgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9QUk9DX0JJTkQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfcHJvY19iaW5kKCk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIGdldF9fcHJvY19iaW5kKCBfX2ttcF9lbnRyeV90aHJlYWQoKSApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9OVU1fVEVBTVMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIGlmICggdGhyLT50aC50aF90ZWFtX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1fbWljcm90YXNrICkgeworICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSB0aHItPnRoLnRoX3RlYW1zX2xldmVsOyAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGlpID0gdGVhbS0+dC50X2xldmVsOworICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgI2VuZGlmCit9CisKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKworc3RhdGljIGludCBfX2ttcF9kZWZhdWx0X2RldmljZSA9IDA7CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9ERUZBVUxUX0RFVklDRSggdm9pZCApCit7CisgICAgcmV0dXJuIF9fa21wX2RlZmF1bHRfZGV2aWNlOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0RFRkFVTFRfREVWSUNFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSBLTVBfREVSRUYgYXJnOworfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0RFVklDRVMoIHZvaWQgKQoreworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLy8gS01QX01JQyB8fCBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWZkZWYgS01QX1NUVUIKK3R5cGVkZWYgZW51bSB7IFVOSU5JVCA9IC0xLCBVTkxPQ0tFRCwgTE9DS0VEIH0ga21wX3N0dWJfbG9ja190OworI2VuZGlmIC8qIEtNUF9TVFVCICovCisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOSVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5JVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19pbml0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fREVTVFJPWV9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTklOSVQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2Rlc3Ryb3lfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fREVTVFJPWV9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spICE9IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBMT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3NldF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKCooKGludCAqKXVzZXJfbG9jaykpKys7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3NldF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1VOU0VUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY191bnNldF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9VTlNFVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKCooKGludCAqKXVzZXJfbG9jaykpLS07CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9URVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gTE9DS0VEICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBMT0NLRUQ7CisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcGNfdGVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1RFU1RfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuICsrKCooKGludCAqKXVzZXJfbG9jaykpOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcGNfdGVzdF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2RvdWJsZSBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1dUSU1FKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3d0aW1lKCk7CisgICAgI2Vsc2UKKyAgICAgICAgZG91YmxlIGRhdGE7CisgICAgICAgICNpZiAhIEtNUF9PU19MSU5VWAorICAgICAgICAvLyBXZSBkb24ndCBuZWVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdG8gZ2V0IHRoZSB0aW1lIG9uIExpbnV4KiBPUy4KKyAgICAgICAgLy8gVGhlIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUgb24gTGludXgqIE9TIG5vdy4KKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2VsYXBzZWQoICYgZGF0YSApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfV1RJQ0spKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfd3RpY2soKTsKKyAgICAjZWxzZQorICAgICAgICBkb3VibGUgZGF0YTsKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgX19rbXBfZWxhcHNlZF90aWNrKCAmIGRhdGEgKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9NQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgc2l6ZSApCit7CisgICAgLy8ga21wY19tYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfbWFsbG9jKCBLTVBfREVSRUYgc2l6ZSApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9DQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgbmVsZW0sIHNpemVfdCBLTVBfREVSRUYgZWxzaXplICkKK3sKKyAgICAvLyBrbXBjX2NhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19jYWxsb2MoIEtNUF9ERVJFRiBuZWxlbSwgS01QX0RFUkVGIGVsc2l6ZSApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9SRUFMTE9DKCB2b2lkICogS01QX0RFUkVGIHB0ciwgc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX3JlYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfcmVhbGxvYyggS01QX0RFUkVGIHB0ciwgS01QX0RFUkVGIHNpemUgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0ZSRUUoIHZvaWQgKiBLTVBfREVSRUYgcHRyICkKK3sKKyAgICAvLyBkb2VzIG5vdGhpbmcgaWYgdGhlIGxpYnJhcnkgaXMgbm90IGluaXRpYWxpemVkCisgICAga21wY19mcmVlKCBLTVBfREVSRUYgcHRyICk7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT04oIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT0ZGKCB2b2lkICkKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0gRkFMU0U7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfREVGQVVMVFMoIGNoYXIgY29uc3QgKiBzdHIKKyAgICAjaWZuZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAsIGludCBsZW4KKyAgICAjZW5kaWYKKykKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgICNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oIHN0ciApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBsZW4gKTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisvKiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uICovCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9DQU5DRUxMQVRJT04pKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICAvLyBpbml0aWFsaXplIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX29tcF9jYW5jZWxsYXRpb247CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMoaW50IGNhbmNlbF9raW5kKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyNlbHNlCisgICAgcmV0dXJuIF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbF9raW5kKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLy8gR0NDIGNvbXBhdGliaWxpdHkgKHZlcnNpb25lZCBzeW1ib2xzKQorI2lmIEtNUF9PU19MSU5VWAorCisvKgorICAgIFRoZXNlIGZvbGxvd2luZyBzZWN0aW9ucyBjcmVhdGUgZnVuY3Rpb24gYWxpYXNlcyAoZHVtbXkgc3ltYm9scykgZm9yIHRoZSBvbXBfKiByb3V0aW5lcy4KKyAgICBUaGVzZSBhbGlhc2VzIHdpbGwgdGhlbiBiZSB2ZXJzaW9uZWQgYWNjb3JkaW5nIHRvIGhvdyBsaWJnb21wIGBgdmVyc2lvbnMnJyBpdHMgCisgICAgc3ltYm9scyAoT01QXzEuMCwgT01QXzIuMCwgT01QXzMuMCwgLi4uKSB3aGlsZSBhbHNvIHJldGFpbmluZyB0aGUgCisgICAgZGVmYXVsdCB2ZXJzaW9uIHdoaWNoIGxpYmlvbXA1IHVzZXM6IFZFUlNJT04gKGRlZmluZWQgaW4gZXhwb3J0c19zby50eHQpCisgICAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgbGliZ29tcC5zby4xIHRoZW4ganVzdCB0eXBlOiAKKworICAgIG9iamR1bXAgLVQgL3BhdGgvdG8vbGliZ29tcC5zby4xIHwgZ3JlcCBvbXBfCisKKyAgICBFeGFtcGxlOgorICAgIFN0ZXAgMSkgIENyZWF0ZSBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyAKKyAgICAgICAgICAgICB3aGljaCBpcyBhbGlhcyBvZiBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcworICAgIFN0ZXAgMikgIFNldCBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyB0byB2ZXJzaW9uOiBvbXBfc2V0X251bV90aHJlYWRzQE9NUF8xLjAKKyAgICBTdGVwIDJCKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMgdG8gZGVmYXVsdCB2ZXJzaW9uIDogb21wX3NldF9udW1fdGhyZWFkc0BAVkVSU0lPTgorKi8KKworLy8gT01QXzEuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTlVNLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCk7CisKKy8vIE9NUF8yLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfV1RJQ0ssIDIwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1dUSU1FLCAyMCk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLy8gT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX1NJWkUsICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7CisKKy8vIE9NUF8zLjEgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9JTl9GSU5BTCwgMzEpOworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0dFVF9QUk9DX0JJTkQsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9URUFNUywgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9OVU0sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorLy8gT01QXzQuMSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKKworLy8gT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9XVElDSywgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsICAgICAgICAgMjAsICJPTVBfMi4wIik7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLy8gT01QXzMuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgIDMwLCAiT01QXzMuMCIpOworCisvLyB0aGUgbG9jayByb3V0aW5lcyBoYXZlIGEgMS4wIGFuZCAzLjAgdmVyc2lvbgoreHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAzMCwgIk9NUF8zLjAiKTsKKworLy8gT01QXzMuMSB2ZXJzaW9uZWQgc3ltYm9sCit4dmVyc2lvbmlmeShGVE5fSU5fRklOQUwsICAgICAgICAgIDMxLCAiT01QXzMuMSIpOworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9QUk9DX0JJTkQsICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RFQU1fTlVNLCAgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9DQU5DRUxMQVRJT04sICA0MCwgIk9NUF80LjAiKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgT01QXzQxX0VOQUJMRUQKKy8vIE9NUF80LjEgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX2V4dHJhLmMgYi9yYzEvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzdlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBrbXBfZnRuX2V4dHJhLmMgLS0gRm9ydHJhbiAnZXh0cmEnIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0Mjc1NyAkCisgKiAkRGF0ZTogMjAxMy0xMC0xOCAwODoyMDo1NyAtMDUwMCAoRnJpLCAxOCBPY3QgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9QTEFJTgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTIEtNUF9GVE5fQVBQRU5ECisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmV4dHJhW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gXCJleHRyYVwiIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyMgICBpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjICAgaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorI2Vsc2UKKyAgICAibm8iOworI2VuZGlmIC8qIEtNUF9GVE5fRU5UUklFUyAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9mdG5fb3MuaCBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0MTc1MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiBrbXBfZnRuX29zLmggLS0gS1BUUyBGb3J0cmFuIGRlZmluZXMgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyNzQ1ICQKKyAqICREYXRlOiAyMDEzLTEwLTE0IDE3OjAyOjA0IC0wNTAwIChNb24sIDE0IE9jdCAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0ZUTl9PU19ICisjZGVmaW5lIEtNUF9GVE5fT1NfSAorCisvLyBLTVBfRk5UX0VOVFJJRVMgbWF5IGJlIG9uZSBvZjogS01QX0ZUTl9QTEFJTiwgS01QX0ZUTl9VUFBFUiwgS01QX0ZUTl9BUFBFTkQsIEtNUF9GVE5fVUFQUEVORC4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeHRlcm5hbCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYmxvY2t0aW1lCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2RlZmF1bHRzCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX3NldF9hZmZpbml0eQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbWFsbG9jCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NhbGxvYworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZyZWUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIGttcF9nZXRfbnVtX2tub3duX3RocmVhZHMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9tYXhfdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0ZWQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X25lc3RlZAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9zY2hlZHVsZQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9sZXZlbAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luX2ZpbmFsCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX3NldF9wcm9jX2JpbmQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGVhbXMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5pdF9sb2NrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9jaworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbG9jaworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vbgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGljaworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkc18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9uZXN0X2xvY2tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlc18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb25fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX0FQUEVORCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9HRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQkxPQ0tUSU1FCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1NFUklBTAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5ECisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0RFRkFVTFRTCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFMTE9DCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NBTExPQworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIEtNUF9HRVRfTlVNX0tOT1dOX1RIUkVBRFMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9NQVhfVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05FU1RFRAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUCisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9TQ0hFRFVMRQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIE9NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9QUk9DX0JJTkQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEVBTVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DSworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DSworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PTgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElDSworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX0RFVklDRVMKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT04KKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyAgICAgICAgICBLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VUFBFUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VBUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfU0VSSUFMXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUllfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQ18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ0FMTE9DXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAgS01QX0dFVF9OVU1fS05PV05fVEhSRUFEU18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX01BWF9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1NDSEVEVUxFXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1BST0NfQklORF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9URUFNU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9ORVNUX0xPQ0tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9TRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFU18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VBUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHT01QIEFQSSBOQU1FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEFsbCBHT01QXzEuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQgICAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXIKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EICAgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCAgICAgICAgICAgIEdPTVBfY3JpdGljYWxfbmFtZV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUICAgICAgICAgICAgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgICAgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQgICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQgICAgICAgICAgICAgICAgICBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCAgICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQgICAgICAgICAgR09NUF9zZWN0aW9uc19lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQgICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUICAgICAgICAgICAgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX3N0YXJ0CisKKy8vIEFsbCBHT01QXzIuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0sgICAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19zdGFydAorCisvLyBBbGwgR09NUF8zLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNreWllbGQKKworLy8gQWxsIEdPTVBfNC4wIHN5bWJvbHMgCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYmlvbXA1CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXJfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQgICAgICAgICAgICAgR09NUF9jYW5jZWxsYXRpb25fcG9pbnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMICAgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQyAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pYworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCAgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2d1aWRlZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX3J1bnRpbWUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfc2VjdGlvbnMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQgICAgICAgICAgICAgICAgR09NUF90YXNrZ3JvdXBfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCAgICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX2VuZAorLyogVGFyZ2V0IGZ1bmN0aW9ucyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSBsaWJvZmZsb2FkICovCisvLyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUICAgICAgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldAorLy8jZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXRfZGF0YQorLy8jZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSAgICAgICAgICAgICAgR09NUF90YXJnZXRfZW5kX2RhdGEKKy8vI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X3VwZGF0ZQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9URUFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90ZWFtcworCisjaWYgS01QX09TX0xJTlVYCisgICAgI2RlZmluZSB4c3RyKHgpIHN0cih4KSAKKyAgICAjZGVmaW5lIHN0cih4KSAjeAorCisgICAgLy8gSWYgTGludXgsIHhleHBhbmQgcHJlcGVuZHMgX19rbXBfYXBpXyB0byB0aGUgcmVhbCBBUEkgbmFtZQorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBfX2ttcF9hcGlfIyNhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIF9fdHlwZW9mX18oX19rbXBfYXBpXyMjYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXIjI19hbGlhcyBfX2F0dHJpYnV0ZV9fKChhbGlhcyh4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lKSkpKQorCisgICAgI2RlZmluZSB4dmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyKSB2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIsICJWRVJTSU9OIikKKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIFwKKyAgICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSMjXyMjdmVyc2lvbl9udW0jI19hbGlhcykgIiwiIHhzdHIoYXBpX25hbWUpICJAIiB2ZXJzaW9uX3N0ciAiXG5cdCIpOyBcCisgICAgX19hc21fXygiLnN5bXZlciAiIHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUpICIsIiB4c3RyKGFwaV9uYW1lKSAiQEAiIGRlZmF1bHRfdmVyICJcblx0IikKKworI2Vsc2UgLyogS01QX09TX0xJTlVYICovCisgICAgI2RlZmluZSB4c3RyKHgpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHN0cih4KSAgLyogTm90aGluZyAqLworCisgICAgLy8gaWYgV2luZG93cyBvciBNYWMsIHhleHBhbmQgZG9lcyBubyBuYW1lIHRyYW5zZm9ybWF0aW9uCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIGFwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgIC8qIE5vdGhpbmcgKi8KKworICAgICNkZWZpbmUgeHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0cikgLyogTm90aGluZyAqLworICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgLyogTm90aGluZyAqLworCisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNlbmRpZiAvKiBLTVBfRlROX09TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWJjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jIC0tIEZvcnRyYW4gX19zdGRjYWxsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19zdGRjYWxsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisgICAgInllcyI7CisjZWxzZQorICAgICJubyI7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorCisjZGVmaW5lIEZUTl9TVERDQUxMIAlLTVBfU1REQ0FMTAorI2RlZmluZSBLTVBfRlROX0VOVFJJRVMJVVNFX0ZUTl9TVERDQUxMCisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorCisjZW5kaWYgLyogVVNFX0ZUTl9TVERDQUxMICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZ2xvYmFsLmMgYi9yYzEvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWY4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICoga21wX2dsb2JhbC5jIC0tIEtQVFMgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqICRSZXZpc2lvbjogNDI4MTYgJAorICogJERhdGU6IDIwMTMtMTEtMTEgMTU6MzM6MzcgLTA2MDAgKE1vbiwgMTEgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWZkZWYgS01QX1NFVFZFUlNJT04KK2NoYXIgX19rbXBfc2V0dmVyc2lvbl9zdHJpbmdbXSA9IFZFUlNJT05fU1RSSU5HOworI2VuZGlmCisKK2ttcF9rZXlfdCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5OworCitrbXBfY3B1aW5mb190ICAgX19rbXBfY3B1aW5mbyA9IHsgMCB9OyAvLyBOb3QgaW5pdGlhbGl6ZWQKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSU5JVElBTElaQVRJT04gVkFSSUFCTEVTICovCisvKiB0aGV5IGFyZSBzeW5jcm9uaXplZCB0byB3cml0ZSBkdXJpbmcgaW5pdCwgYnV0IHJlYWQgYW55dGltZSAqLwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X3NlcmlhbCAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9ndGlkICAgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfY29tbW9uICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21pZGRsZSAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9wYXJhbGxlbCAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfbW9uaXRvciAgICA9IDA7ICAvKiAxIC0gbGF1bmNoZWQsIDIgLSBhY3R1YWxseSBzdGFydGVkIChXaW5kb3dzKiBPUyBvbmx5KSAqLwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja3MgPSBGQUxTRTsKKworLyogbGlzdCBvZiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZXMgZm9yIGNvbW1vbnMgKi8KK2ttcF9jYWNoZWRfYWRkcl90ICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworaW50ICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2NvdW50ZXIgID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfcm9vdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3ZlcnNpb24gICAgICAgPSAwOworCit2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3RlYW1fY291bnRlciAgPSAwOwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90YXNrX2NvdW50ZXIgID0gMDsKKwordW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdCA9IEtNUF9ERUZBVUxUX0lOSVRfV0FJVDsgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KK3Vuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQgPSBLTVBfREVGQVVMVF9ORVhUX1dBSVQ7ICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK3NpemVfdCAgICAgIF9fa21wX3N0a3NpemUgICAgICAgICA9IEtNUF9ERUZBVUxUX1NUS1NJWkU7CitzaXplX3QgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwOyAgLy8gYXV0byBhZGp1c3QKK3NpemVfdCAgICAgIF9fa21wX3N0a29mZnNldCAgICAgICA9IEtNUF9ERUZBVUxUX1NUS09GRlNFVDsKKworc2l6ZV90ICAgIF9fa21wX21hbGxvY19wb29sX2luY3IgID0gS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUjsKKworLyogQmFycmllciBtZXRob2QgZGVmYXVsdHMsIHNldHRpbmdzLCBhbmQgc3RyaW5ncyAqLworLyogYnJhbmNoIGZhY3RvciA9IDJeYnJhbmNoX2JpdHMgKG9ubHkgcmVsZXZhbnQgZm9yIHRyZWUgYW5kIGh5cGVyIGJhcnJpZXIgdHlwZXMpICovCisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBoeXBlcjI6IEM3ODk4MCAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KKyNlbHNlCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBjb21tdW5pY2F0aW9uIGluIGNvcmUgZm9yIE1JQyAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNpZiBLTVBfQVJDSF9YODZfNjQKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQgID0gYnBfaHlwZXJfYmFyOyAgLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0ID0gYnBfaHlwZXJfYmFyOyAgLyogaHlwZXIyOiBDNzg5ODAgKi8KKyNlbHNlCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2xpbmVhcl9iYXI7CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2xpbmVhcl9iYXI7CisjZW5kaWYKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IDAgfTsKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IDAgfTsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IGJwX2xpbmVhcl9iYXIgfTsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IGJwX2xpbmVhcl9iYXIgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJLTVBfUExBSU5fQkFSUklFUiIsICJLTVBfRk9SS0pPSU5fQkFSUklFUiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWUgICAgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiIsICJLTVBfRk9SS0pPSU5fQkFSUklFUl9QQVRURVJOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIktNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgInBsYWluIiwgImZvcmtqb2luIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInJlZHVjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIFsgYnBfbGFzdF9iYXIgXSA9IHsgImxpbmVhciIsICJ0cmVlIiwgImh5cGVyIiB9OworCisKK2ludCAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKK3NpemVfdCAgICBfX2ttcF9hbGlnbl9hbGxvYyA9IENBQ0hFX0xJTkU7CisKKworaW50ICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19sb3c7CitpbnQgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfeHByb2MgPSAwOworaW50ICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IDA7CitzaXplX3QgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworaW50ICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworaW50ICAgICAgICAgICAgICAgX19rbXBfbWF4X250aCA9IDA7CitpbnQgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gMDsKK2ludCAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSAwOworaW50ICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IDA7CitpbnQgICAgICAgICAgIF9fa21wX3RwX2NhcGFjaXR5ID0gMDsKK2ludCAgICAgICAgICAgICBfX2ttcF90cF9jYWNoZWQgPSAwOworaW50ICAgICAgICAgICBfX2ttcF9kZmx0X25lc3RlZCA9IEZBTFNFOworI2lmIE9NUF8zMF9FTkFCTEVECitpbnQgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsgLyogbWF4X2FjdGl2ZV9sZXZlbHMgbGltaXQgKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorZW51bSBsaWJyYXJ5X3R5cGUgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfbm9uZTsKK2VudW0gc2NoZWRfdHlwZSAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX2RlZmF1bHQ7ICAvKiBzY2hlZHVsaW5nIG1ldGhvZCBmb3IgcnVudGltZSBzY2hlZHVsaW5nICovCitlbnVtIHNjaGVkX3R5cGUgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OyAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZW51bSBzY2hlZF90eXBlICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOyAvKiBkZWZhdWx0IGd1aWRlZCBzY2hlZHVsaW5nIG1ldGhvZCAqLworI2lmIE9NUF8zMF9FTkFCTEVECitlbnVtIHNjaGVkX3R5cGUgICAgICBfX2ttcF9hdXRvID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOyAvKiBkZWZhdWx0IGF1dG8gc2NoZWR1bGluZyBtZXRob2QgKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAoraW50ICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKK2ludCAgICAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUzsKK2ludCAgICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBLTVBfREVGQVVMVF9CTE9DS1RJTUUsIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICk7CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKK2ludCAgICAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworaW50ICAgICAgICAgICAgX19rbXBfaHRfY2FwYWJsZSA9IEZBTFNFOworaW50ICAgICAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworaW50ICAgICAgICBfX2ttcF9odF9sb2dfcGVyX3BoeSA9IDE7CitpbnQgICAgICAgICAgICAgICAgX19rbXBfbmNvcmVzID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSAwOworaW50ICAgICAgICAgICBfX2ttcF9hYm9ydF9kZWxheSA9IDA7CisjaWYgS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX1REQVRBX0dUSUQpCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMzsgLyogdXNlIF9fZGVjbHNwZWModGhyZWFkKSBUTFMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2VsaWYgS01QX09TX1dJTkRPV1MKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAyOyAvKiB1c2UgVExTIGZ1bmN0aW9ucyB0byBzdG9yZSBndGlkICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxzZQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDA7IC8qIHNlbGVjdCBtZXRob2QgdG8gZ2V0IGd0aWQgYmFzZWQgb24gI3RocmVhZHMgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKSAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK19fZGVjbHNwZWModGhyZWFkKSBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbHNlCitfX3RocmVhZCBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAtIHdvcmthcm91bmQgYmVjYXVzZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBjb21waWxlciAyMDExMDMxNiBkb2Vzbid0IGFjY2VwdCBfX2RlY2xzcGVjICovCisjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KK2ludCAgICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBJTlRfTUFYOworaW50ICAgICAgICAgICAgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAoraW50ICAgIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCA9IFRSVUU7CitrbXBfaW50MTYgIF9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgPSAwOwora21wX3VpbnQzMiAgICAgX19rbXBfaW5pdF9teGNzciA9IDA7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZG91YmxlICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgICA9IDEuMDsKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKK2ttcF9uZXN0ZWRfbnRocmVhZHNfdCBfX2ttcF9uZXN0ZWRfbnRoICA9IHsgTlVMTCwgMCwgMCB9OworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcyA9IHsgMSwgMTAyNCB9OyAvLyBUT0RPOiB0dW5lIGl0IQorCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitjaGFyICogX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlID0gIi0iOworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyNpZiBPTVBfNDBfRU5BQkxFRAoraW50IF9fa21wX2Rpc3BsYXlfZW52ICAgICAgICAgICA9IEZBTFNFOworaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgICA9IEZBTFNFOworaW50IF9fa21wX29tcF9jYW5jZWxsYXRpb24gICAgICA9IEZBTFNFOworI2VuZGlmCisKKy8qIG1hcCBPTVAgMy4wIHNjaGVkdWxlIHR5cGVzIHdpdGggb3VyIGludGVybmFsIHNjaGVkdWxlIHR5cGVzICovCitlbnVtIHNjaGVkX3R5cGUgX19rbXBfc2NoX21hcFsga21wX3NjaGVkX3VwcGVyIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF0gPSB7CisgICAga21wX3NjaF9zdGF0aWNfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsICAgIC8vID09PiBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfZ3VpZGVkICAgICAgICAgICAgPSAzCisgICAga21wX3NjaF9hdXRvLCAgICAgICAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0CisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBsaWtlbHkgbm90IHVzZWQsIGludHJvZHVjZWQgaGVyZSBqdXN0IHRvIGRlYnVnIHRoZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHB1YmxpYyBpbnRlbCBleHRlbnNpb24gc2NoZWR1bGVzCit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitpbnQgX19rbXBfY2xvY2tfZnVuY3Rpb25fcGFyYW07CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworCitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOwora21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKK2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKK3NpemVfdCAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CitlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CitlbnVtIGFmZmluaXR5X2dyYW4gX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKK2ludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyAgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID0gMDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPSBGQUxTRTsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9IFRSVUU7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKK2NoYXIgKiAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICAgICA9IE5VTEw7CitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7Cit1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgICAgPSAwOworCitjaGFyIGNvbnN0ICogIF9fa21wX2NwdWluZm9fZmlsZSAgICAgPSBOVUxMOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZCA9IHsgTlVMTCwgMCwgMCB9OworaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisKKyNpZiBLTVBfTUlDCit1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gMDsKK3Vuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IDA7Cit1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSAwOworI2VuZGlmCisKKyNpZiBPTVBfMzBfRU5BQkxFRAora21wX3Rhc2tpbmdfbW9kZV90IF9fa21wX3Rhc2tpbmdfbW9kZSA9IHRza21fdGFza190ZWFtczsKKworLyogVGhpcyBjaGVjayBlbnN1cmVzIHRoYXQgdGhlIGNvbXBpbGVyIGlzIHBhc3NpbmcgdGhlIGNvcnJlY3QgZGF0YSB0eXBlCisgKiBmb3IgdGhlIGZsYWdzIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIGttcGNfb21wX3Rhc2tfYWxsb2MoKS4KKyAqIElmIHRoZSB0eXBlIGlzIG5vdCBhIDQtYnl0ZSB0eXBlLCB0aGVuIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBhYm91dAorICogYSBub24tcG9zaXRpdmUgbGVuZ3RoIGFycmF5IHBvaW50aW5nIGhlcmUuICBJZiB0aGF0IGhhcHBlbnMsIHRoZQorICoga21wX3Rhc2tpbmdfZmxhZ3NfdCBzdHJ1Y3R1cmUgbXVzdCBiZSByZWRlZmluZWQgdG8gaGF2ZSBleGFjdGx5IDMyIGJpdHMuCisgKi8KK0tNUF9CVUlMRF9BU1NFUlQoIHNpemVvZihrbXBfdGFza2luZ19mbGFnc190KSA9PSA0ICk7CisKK2ttcF9pbnQzMiBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgPSAxOyAgIC8qIENvbnN0cmFpbiB0YXNrIHN0ZWFsaW5nIGJ5IGRlZmF1bHQgKi8KKworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitpbnQgICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gMDsKKyNlbmRpZgorCitpbnQgICAgIF9fa21wX3NldHRpbmdzID0gRkFMU0U7CitpbnQgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMDsKKyNpZiBVU0VfSVRUX0JVSUxECitpbnQgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyA9IDE7CitpbnQgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID0gMDsKKyNlbmRpZgorUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKK2ludCAgICAgX19rbXBfZGV0ZXJtX3JlZCA9IEZBTFNFOworCisjaWZkZWYgS01QX0RFQlVHCitpbnQgICAgIGttcF9hX2RlYnVnID0gMDsKK2ludCAgICAga21wX2JfZGVidWcgPSAwOworaW50ICAgICBrbXBfY19kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9kX2RlYnVnID0gMDsKK2ludCAgICAga21wX2VfZGVidWcgPSAwOworaW50ICAgICBrbXBfZl9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9kaWFnICAgID0gMDsKKyNlbmRpZgorCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmID0gRkFMU0U7ICAgICAgICAvKiBUUlVFIG1lYW5zIHVzZSBidWZmZXIsIEZBTFNFIG1lYW5zIHByaW50IHRvIHN0ZGVyciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfbGluZXMgPSBLTVBfREVCVUdfQlVGX0xJTkVTX0lOSVQ7IC8qIExpbmVzIG9mIGRlYnVnIHN0b3JlZCBpbiBidWZmZXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2NoYXJzID0gS01QX0RFQlVHX0JVRl9DSEFSU19JTklUOyAvKiBDaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgPSBGQUxTRTsgLyogVFJVRSBtZWFucyB1c2UgYXRvbWljIHVwZGF0ZSBvZiBidWZmZXIgZW50cnkgcG9pbnRlciAqLworCitjaGFyICAgKl9fa21wX2RlYnVnX2J1ZmZlciA9IE5VTEw7ICAgICAgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19jb3VudCA9IDA7ICAgICAgICAgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlciBzbyBmYXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgPSAwOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UgcmVjb21tZW5kZWQgaW4gd2FybmluZ3MgKi8KKy8qIGVuZCByb3RhdGluZyBkZWJ1ZyBidWZmZXIgKi8KKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2U7ICAgICAgICAgICAvKiArMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBpbiByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0xID0+IG9ubHkgZ28gcGFyIGZvciBjb25zdHJ1Y3RzIG91dHNpZGUgcmFuZ2UgKi8KK2NoYXIgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl0gPSB7ICdcMCcgfTsKK2NoYXIgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXSA9IHsgJ1wwJyB9OworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2VfdWIgPSBJTlRfTUFYOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgcHJpbnRpbmcgb3V0IGR5bmFtaWMgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwID0gRkFMU0U7ICAgICAgICAgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2ludCAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOyAvKiBUcnVlIG1lYW5zIHN0b3JhZ2UgbWFwIGluY2x1ZGVzIHBsYWNlbWVudCBpbmZvICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkID0gRkFMU0U7CisvKiBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IGRhdGEgc3RydWN0dXJlcyB3aGVuIHdlIGZvcmsgYSBjaGlsZCBwcm9jZXNzLCBkZWZhdWx0cyB0byBUUlVFICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrID0gVFJVRTsgLyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2ludCAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKworCitpbnQgICAgICAgIF9fa21wX2Vudl9jaHVuayAgICAgICA9IEZBTFNFOyAgLyogS01QX0NIVU5LIHNwZWNpZmllZD8gICAgICovCitpbnQgICAgICAgIF9fa21wX2Vudl9zdGtzaXplICAgICA9IEZBTFNFOyAgLyogS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfc3Rrc2l6ZSA9IEZBTFNFOyAgLyogT01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9hbGxfdGhyZWFkcyAgICAgPSBGQUxTRTsvKiBLTVBfQUxMX1RIUkVBRFMgb3IgS01QX01BWF9USFJFQURTIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkcyA9IEZBTFNFOy8qIE9NUF9USFJFQURfTElNSVQgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lICAgPSBGQUxTRTsgIC8qIEtNUF9CTE9DS1RJTUUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfY2hlY2tzICAgICAgPSBGQUxTRTsgIC8qIEtNUF9DSEVDS1Mgc3BlY2lmaWVkPyAgICAqLworaW50ICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgID0gRkFMU0U7ICAvKiBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAqLworCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2luaXQgPSBLTVBfSU5JVF9XQUlUOwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9uZXh0ID0gS01QX05FWFRfV0FJVDsKK2ttcF91aW50MzIgX19rbXBfeWllbGRpbmdfb24gPSAxOwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDE7ICAgICAvKiBZaWVsZC1jeWNsZSBpcyBvbiBieSBkZWZhdWx0ICovCitrbXBfaW50MzIgIF9fa21wX3lpZWxkX29uX2NvdW50ID0gMTA7IC8qIEJ5IGRlZmF1bHQsIHlpZWxkaW5nIGlzIG9uIGZvciAxMCBtb25pdG9yIHBlcmlvZHMuICovCitrbXBfaW50MzIgIF9fa21wX3lpZWxkX29mZl9jb3VudCA9IDE7IC8qIEJ5IGRlZmF1bHQsIHlpZWxkaW5nIGlzIG9mZiBmb3IgMSBtb25pdG9yIHBlcmlvZHMuICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU1RBVEUgbW9zdGx5IHN5bmNyb25pemVkIHdpdGggZ2xvYmFsIGxvY2sgKi8KKy8qIGRhdGEgd3JpdHRlbiB0byByYXJlbHkgYnkgbWFzdGVycywgcmVhZCBvZnRlbiBieSB3b3JrZXJzICovCisvKgorICogU0hBTEwgV0UgRURJVCBUSEUgQ09NTUVOVCBCRUxPVyBJTiBTT01FIFdBWT8KKyAqIFRPRE86ICBOb25lIG9mIHRoaXMgZ2xvYmFsIHBhZGRpbmcgc3R1ZmYgd29ya3MgY29uc2lzdGVudGx5IGJlY2F1c2UKKyAqIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgY29ycmVsYXRlZCB0byBzdG9yYWdlIG9yZGVyLgorICogVG8gZml4IHRoaXMsIGFsbCB0aGUgaW1wb3J0YW50IGdsb2JhbHMgbXVzdCBiZSBwdXQgaW4gYSBiaWcgc3RydWN0dXJlCisgKiBpbnN0ZWFkLgorICovCitLTVBfQUxJR05fQ0FDSEUKKyAgICAgICAgIGttcF9pbmZvX3QgKipfX2ttcF90aHJlYWRzICAgICA9IE5VTEw7CisgICAgICAgICBrbXBfcm9vdF90ICoqX19rbXBfcm9vdCAgICAgICAgPSBOVUxMOworCisvKiBkYXRhIHJlYWQvd3JpdHRlbiB0byBvZnRlbiBieSBtYXN0ZXJzICovCitLTVBfQUxJR05fQ0FDSEUKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF9udGggICAgICAgICAgICAgICAgICAgID0gMDsKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF9hbGxfbnRoICAgICAgICAgICAgICAgID0gMDsKK2ludCAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGggICAgICAgID0gMDsKK3ZvbGF0aWxlIGttcF9pbmZvX3QgICpfX2ttcF90aHJlYWRfcG9vbCAgICAgICAgICAgID0gTlVMTDsKK3ZvbGF0aWxlIGttcF90ZWFtX3QgICpfX2ttcF90ZWFtX3Bvb2wgICAgICAgICAgICAgID0gTlVMTDsKKworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCA9IDA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdMT0JBTC9ST09UIFNUQVRFICovCitLTVBfQUxJR05fQ0FDSEUKK2ttcF9nbG9iYWxfdCBfX2ttcF9nbG9iYWwgPSB7eyAwIH19OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogR0xPQkFMIFNZTkNIUk9OSVpBVElPTiBMT0NLUyAqLworLyogVE9ETyB2ZXJpZnkgdGhlIG5lZWQgZm9yIHRoZXNlIGxvY2tzIGFuZCBpZiB0aGV5IG5lZWQgdG8gYmUgZ2xvYmFsICovCitLTVBfQUxJR05fQ0FDSEUKKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pbml0el9sb2NrICAgKTsgLyogQ29udHJvbCBpbml0aWFsaXphdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7IC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZXhpdF9sb2NrOyAgIC8qIGV4aXQoKSBpcyBub3QgYWx3YXlzIHRocmVhZC1zYWZlICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7IC8qIGNvbnRyb2wgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitLTVBfQUxJR04oMTI4KQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZGVidWdfbG9jazsgICAgICAgICAgICAvKiBDb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyoKKyAgICAgICAgU2lnbmFsIGhhbmRsaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQgY29uZnVzZXMgdXNlcnM6IEluIGNhc2Ugb2Ygc2lnc2VndgorICAgICAgICAob3Igb3RoZXIgdHJvdWJsZSkgaW4gdXNlciBjb2RlIHNpZ25hbCBoYW5kbGVyIGNhdGNoZXMgdGhlIHNpZ25hbCwgd2hpY2ggdGhlbiAiYXBwZWFycyIgaW4KKyAgICAgICAgdGhlIG1vbml0b3IgdGhyZWFkICh3aGVuIHRoZSBtb25pdG9yIGV4ZWN1dGVzIHJhaXNlKCkgZnVuY3Rpb24pLiBVc2VycyBzZWUgc2lnbmFsIGluIHRoZQorICAgICAgICBtb25pdG9yIHRocmVhZCBhbmQgYmxhbWUgT3Blbk1QIFJUTC4KKworICAgICAgICBHcmFudCBzYWlkIHNpZ25hbCBoYW5kbGluZyByZXF1aXJlZCBvbiBzb21lIG9sZGVyIE9TZXMgKElyaXg/KSBzdXBwb3J0ZWQgYnkgS0FJLCBiZWNhdXNlCisgICAgICAgIGJhZCBhcHBsaWNhdGlvbnMgaHVuZyBidXQgbm90IGFib3J0ZWQuIEN1cnJlbnRseSBpdCBpcyBub3QgYSBwcm9ibGVtIGZvciBMaW51eCogT1MsIE9TIFgqIGFuZAorICAgICAgICBXaW5kb3dzKiBPUy4KKworICAgICAgICBHcmFudDogRm91bmQgbmV3IGhhbmdzIGZvciBFTDQsIEVMNSwgYW5kIGEgRmVkb3JhIENvcmUgbWFjaGluZS4gIFNvIEknbSBwdXR0aW5nCisgICAgICAgIHRoZSBkZWZhdWx0IGJhY2sgZm9yIG5vdyB0byBzZWUgaWYgdGhhdCBmaXhlcyBoYW5ncyBvbiB0aG9zZSBtYWNoaW5lcy4KKworICAgICAgICAyMDEwLTA0MDEzIExldjogSXQgd2FzIGEgYnVnIGluIEZvcnRyYW4gUlRMLiBGb3J0cmFuIFJUTCBwcmludHMgYSBraW5kIG9mIHN0YWNrIGJhY2t0cmFjZQorICAgICAgICB3aGVuIHByb2dyYW0gaXMgYWJvcnRpbmcsIGJ1dCB0aGUgY29kZSBpcyBub3Qgc2lnbmFsLXNhZmUuIFdoZW4gbXVsdGlwbGUgc2lnbmFscyByYWlzZWQgYXQKKyAgICAgICAgdGhlIHNhbWUgdGltZSAod2hpY2ggb2NjdXJzIGluIGR5bmFtaWMgbmVnYXRpdmUgdGVzdHMgYmVjYXVzZSBhbGwgdGhlIHdvcmtlciB0aHJlYWRzIGRldGVjdHMKKyAgICAgICAgdGhlIHNhbWUgZXJyb3IpLCBGb3J0cmFuIFJUTCBtYXkgaGFuZy4gVGhlIGJ1ZyBmaW5hbGx5IGZpeGVkIGluIEZvcnRyYW4gUlRMIGxpYnJhcnkgcHJvdmlkZWQKKyAgICAgICAgYnkgU3RldmUgUi4sIGFuZCB3aWxsIGJlIGF2YWlsYWJsZSBzb29uLgorICAgICovCisgICAgaW50IF9fa21wX2hhbmRsZV9zaWduYWxzID0gRkFMU0U7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBCVUlMRF9UVgora21wX2tleV90IF9fa21wX3R2X2tleSA9IDA7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2ludAorZ2V0X3N1c3BlbmRfY291bnRfKCB2b2lkICkgeworICAgIGludCBjb3VudCA9IF9fa21wX3N1c3BlbmRfY291bnQ7CisgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisgICAgcmV0dXJuIGNvdW50OworfQordm9pZAorc2V0X3N1c3BlbmRfY291bnRfKCBpbnQgKiB2YWx1ZSApIHsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gKnZhbHVlOworfQorI2VuZGlmCisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeSA9IDE7CitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeSAgICAgICA9IDE7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhlNTUzCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jCkBAIC0wLDAgKzEsMTAyOCBAQAorLyoKKyAqIGttcF9nc3VwcG9ydC5jCisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBkZWZpbmVkKF9feDg2XzY0KQorIyBkZWZpbmUgS01QX0k4CisjZW5kaWYKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgTUtMT0MobG9jLHJvdXRpbmUpIFwKKyAgICBzdGF0aWMgaWRlbnRfdCAobG9jKSA9IHswLCBLTVBfSURFTlRfS01QQywgMCwgMCwgIjt1bmtub3duO3Vua25vd247MDswOzsiIH07CisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUikodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXIiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2JhcnJpZXI6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworCisvKgwqLworLy8KKy8vIE11dHVhbCBleGNsdXNpb24KKy8vCisKKy8vCisvLyBUaGUgc3ltYm9sIHRoYXQgaWNjL2lmb3J0IGdlbmVyYXRlcyBmb3IgdW5uYW1lZCBmb3IgdW5uYW1lZCBjcml0aWNhbAorLy8gc2VjdGlvbnMgLSAuZ29tcF9jcml0aWNhbF91c2VyXyAtIGlzIGRlZmluZWQgdXNpbmcgLmNvbW0gaW4gYW55IG9iamVjdHMKKy8vIHJlZmVyZW5jZSBpdC4gIFdlIGNhbid0IHJlZmVyZW5jZSBpdCBkaXJlY3RseSBoZXJlIGluIEMgY29kZSwgYXMgdGhlCisvLyBzeW1ib2wgY29udGFpbnMgYSAiLiIuCisvLworLy8gVGhlIFJUTCBjb250YWlucyBhbiBhc3NlbWJseSBsYW5ndWFnZSBkZWZpbml0aW9uIG9mIC5nb21wX2NyaXRpY2FsX3VzZXJfCisvLyB3aXRoIGFub3RoZXIgc3ltYm9sIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciBpbml0aWFsaXplZCB3aXRoIGl0J3MKKy8vIGFkZHJlc3MuCisvLworZXh0ZXJuIGttcF9jcml0aWNhbF9uYW1lICpfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI7CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2VuZF9jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCkodm9pZCAqKnBwdHIpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX25hbWVfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9uYW1lX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgKGttcF9jcml0aWNhbF9uYW1lICopcHB0cik7Cit9CisKKworLy8KKy8vIFRoZSBHbnUgY29kZWdlbiB0cmllcyB0byB1c2UgbG9ja2VkIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBhdG9taWMgdXBkYXRlcworLy8gaW5saW5lLiAgSWYgaXQgY2FuJ3QsIHRoZW4gaXQgY2FsbHMgR09NUF9hdG9taWNfc3RhcnQoKSBiZWZvcmUgcGVyZm9ybWluZworLy8gdGhlIHVwZGF0ZSBhbmQgR09NUF9hdG9taWNfZW5kKCkgYWZ0ZXJ3YXJkLCByZWdhcmRsZXNzIG9mIHRoZSBkYXRhIHR5cGUuCisvLworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK2ludAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gM3JkIHBhcmFtZXRlciA9PSBGQUxTRSBwcmV2ZW50cyBrbXBfZW50ZXJfc2luZ2xlIGZyb20gcHVzaGluZyBhCisgICAgLy8gd29ya3NoYXJlIHdoZW4gVVNFX0NIRUNLUyBpcyBkZWZpbmVkLiAgV2UgbmVlZCB0byBhdm9pZCB0aGUgcHVzaCwKKyAgICAvLyBhcyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIEdPTVBfc2luZ2xlX2VuZCgpIGNhbGwuCisgICAgLy8KKyAgICByZXR1cm4gX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKTsKK30KKworCit2b2lkICoKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQpKHZvaWQpCit7CisgICAgdm9pZCAqcmV0dmFsOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX2NvcHlfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW50ZXIsIHJldHVybiBOVUxMLiAgVGhlIGdlbmVyYXRlZAorICAgIC8vIGNvZGUgd2lsbCB0aGVuIGNhbGwgR09NUF9zaW5nbGVfY29weV9lbmQoKSBmb3IgdGhpcyB0aHJlYWQgb25seSwKKyAgICAvLyB3aXRoIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisgICAgLy8KKyAgICBpZiAoX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLworICAgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCB0aHJlYWQgdG8gc2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIsCisgICAgLy8gYW5kIGZvciBhbGwgb3RoZXIgdGhyZWFkcyB0byByZWFjaCB0aGlzIHBvaW50LgorICAgIC8vCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICAvLworICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludCwgYW5kIHdhaXQgZm9yIGFsbAorICAgIC8vIHRocmVhZHMgdG8gZG8gbGlrZXdpc2UsIHRoZW4gcmV0dXJuLgorICAgIC8vCisgICAgcmV0dmFsID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQpKHZvaWQgKmRhdGEpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX2NvcHlfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfY29weV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm8gdGhlIHRlYW0sIHRoZW4gaGl0IHRoZSBiYXJyaWVyCisgICAgLy8gc28gdGhhdCB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGNvbnRpbnVlIG9uIGFuZCByZWFkIGl0LiAgSGl0IGFub3RoZXIKKyAgICAvLyBiYXJyaWVyIGJlZm9yZSBjb250aW51aW5nLCBzbyB0aGF0IHRoZSBrbm93IHRoYXQgdGhlIGNvcHlwcml2YXRlCisgICAgLy8gZGF0YSBwb2ludGVyIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gYWxsIHRocmVhZHMgYmVmb3JlIHRyeWluZyB0bworICAgIC8vIHJldXNlIHRoZSB0X2NvcHlwcml2X2RhdGEgZmllbGQuCisgICAgLy8KKyAgICBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2NvcHlwcml2X2RhdGEgPSBkYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX29yZGVyZWRfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX29yZGVyZWRfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX29yZGVyZWRfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2VuZF9vcmRlcmVkKCZsb2MsIGd0aWQpOworfQorCisKKy8qDCovCisvLworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisjZWxzZQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgICAgICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVCAgICAgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVF9VTEwgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFRfVUxMICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1CisKKworLyoMKi8KKy8vCisvLyBUaGUgcGFyYWxsZWwgY29udHJ1Y3QKKy8vCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLCB2b2lkICgqdGFzaykodm9pZCAqKSwKKyAgdm9pZCAqZGF0YSkKK3sKKyAgICB0YXNrKGRhdGEpOworfQorCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLAorICB2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsIGlkZW50X3QgKmxvYywKKyAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBsb25nIHN0YXJ0LCBsb25nIGVuZCwgbG9uZyBpbmNyLCBsb25nIGNodW5rX3NpemUpCit7CisgICAgLy8KKyAgICAvLyBJbnRpYWxpemUgdGhlIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0LgorICAgIC8vCisgICAgS01QX0RJU1BBVENIX0lOSVQobG9jLCAqZ3RpZCwgc2NoZWR1bGUsIHN0YXJ0LCBlbmQsIGluY3IsIGNodW5rX3NpemUsCisgICAgICBzY2hlZHVsZSAhPSBrbXBfc2NoX3N0YXRpYyk7CisKKyAgICAvLworICAgIC8vIE5vdyBpbnZva2UgdGhlIG1pY3JvdGFzay4KKyAgICAvLworICAgIHRhc2soZGF0YSk7Cit9CisKKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkLCBtaWNyb3Rhc2tfdCB3cmFwcGVyLCBpbnQgYXJnYywuLi4pCit7CisgICAgaW50IHJjOworCisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgYXJnYyk7CisKKyAgICByYyA9IF9fa21wX2ZvcmtfY2FsbChsb2MsIGd0aWQsIEZBTFNFLCBhcmdjLCB3cmFwcGVyLCBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICZhcAorI2Vsc2UKKyAgICAgIGFwCisjZW5kaWYKKyAgICAgICk7CisKKyAgICB2YV9lbmQoYXApOworCisgICAgaWYgKHJjKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHRociwKKyAgICAgICAgICB0aHItPnRoLnRoX3RlYW0pOworICAgIH0KK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7CisgICAgfQorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgICAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHRociwKKyAgICAgICAgICB0aHItPnRoLnRoX3RlYW0pOworICAgICAgICBfX2ttcF9qb2luX2NhbGwoJmxvYywgZ3RpZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7CisgICAgfQorfQorCisKKy8qDCovCisvLworLy8gTG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworCisvLworLy8gVGhlIEdudSBjb2RlZ2VuIHBhc3NlcyBpbiBhbiBleGNsdXNpdmUgdXBwZXIgYm91bmQgZm9yIHRoZSBvdmVyYWxsIHJhbmdlLAorLy8gYnV0IHRoZSBsaWJndWlkZSBkaXNwYXRjaCBjb2RlIGV4cGVjdHMgYW4gaW5jbHVzaXZlIHVwcGVyIGJvdW5kLCBoZW5jZSB0aGUKKy8vICJlbmQgLSBpbmNyIiA1dGggYXJndW1lbnQgdG8gS01QX0RJU1BBVENIX0lOSVQgKGFuZCB0aGUgIiB1YiAtIHN0ciIgMTF0aAorLy8gYXJndW1lbnQgdG8gX19rbXBfR09NUF9mb3JrX2NhbGwpLgorLy8KKy8vIENvbnZlcnNlbHksIEtNUF9ESVNQQVRDSF9ORVhUIHJldHVybnMgYW5kIGluY2x1c2l2ZSB1cHBlciBib3VuZCBpbiAqcF91YiwKKy8vIGJ1dCB0aGUgR251IGNvZGVnZW4gZXhwZWN0cyBhbiBleGNsdXNpZGUgdXBwZXIgYm91bmQsIHNvIHRoZSBhZGp1c3RtZW50CisvLyAiKnBfdWIgKz0gc3RyaWRlIiBjb21wZW5zdGF0ZXMgZm9yIHRoZSBkaXNjcmVwYW5jeS4KKy8vCisvLyBDb3JyZWN0aW9uOiB0aGUgZ251IGNvZGVnZW4gYWx3YXlzIGFkanVzdHMgdGhlIHVwcGVyIGJvdW5kIGJ5ICstMSwgbm90IHRoZQorLy8gc3RyaWRlIHZhbHVlLiAgV2UgYWRqdXN0IHRoZSBkaXNwYXRjaCBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5IChieSArLTEpLCBidXQKKy8vIHdlIHN0aWxsIGFkanVzdCBwX3ViIGJ5IHRoZSBhY3R1YWwgc3RyaWRlIHZhbHVlLgorLy8KKy8vIFRoZSAicnVudGltZSIgdmVyc2lvbnMgZG8gbm90IHRha2UgYSBjaHVua19zeiBwYXJhbWV0ZXIuCisvLworLy8gVGhlIHByb2ZpbGUgbGliIGNhbm5vdCBzdXBwb3J0IGNvbnN0cnVjdCBjaGVja2luZyBvZiB1bm9yZGVyZWQgbG9vcHMgdGhhdAorLy8gYXJlIHByZWRldGVybWluZWQgYnkgdGhlIGNvbXBpbGVyIHRvIGJlIHN0YXRpY2FsbHkgc2NoZWR1bGVkLCBhcyB0aGUgZ2NjCisvLyBjb2RlZ2VuIHdpbGwgbm90IGFsd2F5cyBlbWl0IGNhbGxzIHRvIEdPTVBfbG9vcF9zdGF0aWNfbmV4dCgpIHRvIGdldCB0aGUKKy8vIG5leHQgaXRlcmF0aW9uLiAgSW5zdGVhZCwgaXQgZW1pdHMgaW5saW5lIGNvZGUgdG8gY2FsbCBvbXBfZ2V0X3RocmVhZF9udW0oKQorLy8gbnVtIGFuZCBjYWxjdWxhdGUgdGhlIGl0ZXJhdGlvbiBzcGFjZSB1c2luZyB0aGUgcmVzdWx0LiAgSXQgZG9lc24ndCBkbyB0aGlzCisvLyB3aXRoIG9yZGVyZWQgc3RhdGljIGxvb3AsIHNvIHRoZXkgY2FuIGJlIGNoZWNrZWQuCisvLworCisjZGVmaW5lIExPT1BfU1RBUlQoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgbG9uZyAqcF9sYiwgICAgICAgICBcCisgICAgICBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgKnBfbGIsIGxvbmcgKnBfdWIpICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogJWRcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICBcCisgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFQoZnVuYyxmaW5pX2NvZGUpIFwKKyAgICBpbnQgZnVuYyhsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpbmlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICAgICAgXAorICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHN0cmlkZSAweCVseCwgIiAgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUKSwge30pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUKSwga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCksIGttcF9vcmRfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQpLCBrbXBfb3JkX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKworLyoMKi8KKy8vCisvLyBVbnNpZ25lZCBsb25nIGxvbmcgbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlc2UgYXJlIG5ldyB3aXRoIGdjYyA0LjQKKy8vCisKKyNkZWZpbmUgTE9PUF9TVEFSVF9VTEwoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgY2h1bmtfc3osICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cjIgPSB1cCA/ICgobG9uZyBsb25nKXN0cikgOiAtKChsb25nIGxvbmcpc3RyKTsgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICAgZ3RpZCwgdXAsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX2xiLCAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUX1VMTChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGludCB1cCwgdW5zaWduZWQgbG9uZyBsb25nIGxiLCB1bnNpZ25lZCBsb25nIGxvbmcgdWIsICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCB1cCAlZCwgbGIgMHglbGx4LCB1YiAweCVsbHgsIHN0ciAweCVsbHgsIGNodW5rX3N6IDB4JWxseFxuIiwgXAorICAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVRfVUxMKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfbGIsIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFRfVUxMKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmModW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX3VpbnQ2NCAqKXBfbGIsIFwKKyAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHN0cmlkZSAweCVsbHgsICIgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUKSwge30pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJUKSwga21wX29yZF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKKworCisvKgwqLworLy8KKy8vIENvbWJpbmVkIHBhcmFsbGVsIC8gbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlcmUgYXJlIG5vIHVsbCB2ZXJzaW9ucyAoeWV0KS4KKy8vCisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUF9TVEFSVChmdW5jLCBzY2hlZHVsZSkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBsYXN0ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICAgICAgICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksICAgICAgICAgXAorICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3opOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisKKy8qDCovCisvLworLy8gVGFza2luZyBjb25zdHJ1Y3RzCisvLworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0spKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhLCB2b2lkICgqY29weV9mdW5jKSh2b2lkICosIHZvaWQgKiksCisgIGxvbmcgYXJnX3NpemUsIGxvbmcgYXJnX2FsaWduLCBpbnQgaWZfY29uZCwgdW5zaWduZWQgZ29tcF9mbGFncykKK3sKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2siKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW50MzIgZmxhZ3MgPSAwOworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgKmlucHV0X2ZsYWdzID0gKGttcF90YXNraW5nX2ZsYWdzX3QgKikgJiBmbGFnczsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFzazogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgLy8gVGhlIGxvdy1vcmRlciBiaXQgaXMgdGhlICJ0aWVkIiBmbGFnCisgICAgaWYgKGdvbXBfZmxhZ3MgJiAxKSB7CisgICAgICAgIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA9IDE7CisgICAgfQorICAgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSAxOworICAgIC8vIF9fa21wX3Rhc2tfYWxsb2MoKSBzZXRzIHVwIGFsbCBvdGhlciBmbGFncworCisgICAgaWYgKCEgaWZfY29uZCkgeworICAgICAgICBhcmdfc2l6ZSA9IDA7CisgICAgfQorCisgICAga21wX3Rhc2tfdCAqdGFzayA9IF9fa21wX3Rhc2tfYWxsb2MoJmxvYywgZ3RpZCwgaW5wdXRfZmxhZ3MsCisgICAgICBzaXplb2Yoa21wX3Rhc2tfdCksIGFyZ19zaXplID8gYXJnX3NpemUgKyBhcmdfYWxpZ24gLSAxIDogMCwKKyAgICAgIChrbXBfcm91dGluZV9lbnRyeV90KWZ1bmMpOworCisgICAgaWYgKGFyZ19zaXplID4gMCkgeworICAgICAgICBpZiAoYXJnX2FsaWduID4gMCkgeworICAgICAgICAgICAgdGFzay0+c2hhcmVkcyA9ICh2b2lkICopKCgoKHNpemVfdCl0YXNrLT5zaGFyZWRzKQorICAgICAgICAgICAgICArIGFyZ19hbGlnbiAtIDEpIC8gYXJnX2FsaWduICogYXJnX2FsaWduKTsKKyAgICAgICAgfQorICAgICAgICAvL2Vsc2UgZXJyb3I/PworCisgICAgICAgIGlmIChjb3B5X2Z1bmMpIHsKKyAgICAgICAgICAgICgqY29weV9mdW5jKSh0YXNrLT5zaGFyZWRzLCBkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWZfY29uZCkgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2soJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgICAgICBmdW5jKGRhdGEpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFzayBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLV0FJVCkodm9pZCkKK3sKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2t3YWl0Iik7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0KCZsb2MsIGd0aWQpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrd2FpdCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKworLyoMKi8KKy8vCisvLyBTZWN0aW9ucyB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworCisvLworLy8gRm9yIHRoZSBzZWN0aW9ucyBjb25zdHJ1Y3QsIHdlIGluaXRpYWxpemUgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgbG9vcAorLy8gd29ya3NoYXJpbmcgY29uc3RydWN0IHdpdGggbGIgMSBhbmQgc3RyaWRlIDEsIGFuZCB1c2UgdGhlIGl0ZXJhdGlvbiAjJ3MKKy8vIHRoYXQgaXRzIHJldHVybnMgYXMgc2VjdGlvbnMgaWRzLgorLy8KKy8vIFRoZXJlIGFyZSBubyBzcGVjaWFsIGVudHJ5IHBvaW50cyBmb3Igb3JkZXJlZCBzZWN0aW9ucywgc28gd2UgYWx3YXlzIHVzZQorLy8gdGhlIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCB3b3Jrc2hhcmUsIGV2ZW4gaWYgdGhlIHNlY3Rpb25zIGFyZW4ndCBvcmRlcmVkLgorLy8KKwordW5zaWduZWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQpKHVuc2lnbmVkIGNvdW50KQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2ludCBsYiwgdWIsIHN0cmlkZTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgJmxiLCAmdWIsICZzdHJpZGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gMSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGIgPiAwKTsKKyAgICAgICAgS01QX0FTU0VSVChsYiA9PSB1Yik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsYiA9IDA7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordW5zaWduZWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCkodm9pZCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2VjdGlvbnNfbmV4dCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgJmxiLCAmdWIsICZzdHJpZGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gMSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGIgPiAwKTsKKyAgICAgICAgS01QX0FTU0VSVChsYiA9PSB1Yik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsYiA9IDA7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19uZXh0IGV4aXQ6IFQjJWQgcmV0dXJuaW5nICV1XG4iLCBndGlkLAorICAgICAgKHVuc2lnbmVkKWxiKSk7CisgICAgcmV0dXJuICh1bnNpZ25lZClsYjsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJUKSh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBpbnQgbGFzdCA9IEZBTFNFOworICAgIE1LTE9DKGxvYywgIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7CisgICAgICAgIGlmIChudW1fdGhyZWFkcyAhPSAwKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLAorICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCB0YXNrLCBkYXRhLAorICAgICAgICAgIG51bV90aHJlYWRzLCAmbG9jLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLCAoa21wX2ludCkxLAorICAgICAgICAgIChrbXBfaW50KWNvdW50LCAoa21wX2ludCkxLCAoa21wX2ludCkxKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworICAgIH0KKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKQorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZF9ub3dhaXQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkpKQorfQorCisvLyBsaWJnb21wIGhhcyBhbiBlbXB0eSBmdW5jdGlvbiBmb3IgR09NUF90YXNreWllbGQgYXMgb2YgMjAxMy0xMC0xMAordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQpKHZvaWQpCit7CisKK30KKworLyoKKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIG9mIGNvZGUgY3JlYXRlIGFsaWFzZXMgZm9yIHRoZSBHT01QXyogZnVuY3Rpb25zLAorICAgIHRoZW4gY3JlYXRlIHZlcnNpb25lZCBzeW1ib2xzIHVzaW5nIHRoZSBhc3NlbWJsZXIgZGlyZWN0aXZlIC5zeW12ZXIuCisgICAgVGhpcyBpcyBvbmx5IHBlcnRpbmVudCBmb3IgRUxGIC5zbyBsaWJyYXJ5CisgICAgeGFsaWFzaWZ5IGFuZCB4dmVyc2lvbmlmeSBhcmUgZGVmaW5lZCBpbiBrbXBfZnRuX29zLmgKKyovCisKKyNpZiBLTVBfT1NfTElOVVgKKworLy8gR09NUF8xLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJULCAxMCk7CisKKy8vIEdPTVBfMi4wIGFsaWFzZXMKKyNpZiBPTVBfMzBfRU5BQkxFRAoreGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLV0FJVCwgMjApOworI2VuZGlmCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCwgMjApOworCisvLyBHT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxELCAzMCk7CisKKy8vIEdPTVBfNC4wIGFsaWFzZXMKKy8qIFRPRE86IGFkZCBHT01QXzQuMCBhbGlhc2VzIHdoZW4gY29ycmVzcG9uZGluZworICAgICAgICAgR09NUF8qIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQKKyovCisKKy8vIEdPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7CisKKy8vIEdPTVBfMi4wIHZlcnNpb25lZCBzeW1ib2xzCisjaWYgT01QXzMwX0VOQUJMRUQKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCwgIkdPTVBfMi4wIik7CisjZW5kaWYKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKKworLy8gR09NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCwgMzAsICJHT01QXzMuMCIpOworCisvLyBHT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scworLyogVE9ETzogYWRkIEdPTVBfNC4wIHZlcnNpb25lZCBzeW1ib2xzIHdoZW4gY29ycmVzcG9uZGluZworICAgICAgICAgR09NUF8qIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQKKyovCisKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvL2V4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfaTE4bi5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9pMThuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMTAyYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfaTE4bi5jCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICoga21wX2kxOG4uYworICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSAia21wX2RlYnVnLmgiCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIgICAgICAgICAgLy8gX19rbXBfcHJpbnRmLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAia21wX2kxOG5fZGVmYXVsdC5pbmMiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorCisjdW5kZWYgS01QX0kxOE5fT0sKKworI2RlZmluZSBnZXRfc2VjdGlvbiggaWQgKSAgKCAoaWQpID4+IDE2ICkKKyNkZWZpbmUgZ2V0X251bWJlciggaWQgKSAgICggKGlkKSAmIDB4RkZGRiApCisKK2ttcF9tc2dfdCAgICAgICAgICAgX19rbXBfbXNnX2VtcHR5ID0geyBrbXBfbXRfZHVtbXksIDAsICIiLCAwICB9Owora21wX21zZ190ICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgPSB7IGttcF9tdF9kdW1teSwgMCwgTlVMTCwgMCB9Oworc3RhdGljIGNoYXIgY29uc3QgKiBub19tZXNzYWdlX2F2YWlsYWJsZSA9ICIoTm8gbWVzc2FnZSBhdmFpbGFibGUpIjsKKworZW51bSBrbXBfaTE4bl9jYXRfc3RhdHVzIHsKKyAgICBLTVBfSTE4Tl9DTE9TRUQsICAgIC8vIE5vdCB5ZXQgb3BlbmVkIG9yIGNsb3NlZC4KKyAgICBLTVBfSTE4Tl9PUEVORUQsICAgIC8vIE9wZW5lZCBzdWNjZXNzZnVsbHksIHJlYWR5IHRvIHVzZS4KKyAgICBLTVBfSTE4Tl9BQlNFTlQgICAgIC8vIE9wZW5pbmcgZmFpbGVkLCBtZXNzYWdlIGNhdGFsb2cgc2hvdWxkIG5vdCBiZSB1c2VkLgorfTsgLy8gZW51bSBrbXBfaTE4bl9jYXRfc3RhdHVzCit0eXBlZGVmIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cyAga21wX2kxOG5fY2F0X3N0YXR1c190Oworc3RhdGljIHZvbGF0aWxlIGttcF9pMThuX2NhdF9zdGF0dXNfdCAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworCisvKgorICAgIE1lc3NhZ2UgY2F0YWxvZyBpcyBvcGVuZWQgYXQgZmlyc3QgdXNhZ2UsIHNvIHdlIGhhdmUgdG8gc3luY2hyb25pemUgb3BlbmluZyB0byBhdm9pZCByYWNlIGFuZAorICAgIG11bHRpcGxlIG9wZW5pbmdzLgorCisgICAgQ2xvc2luZyBkb2VzIG5vdCByZXF1aXJlIHN5bmNocm9uaXphdGlvbiwgYmVjYXVzZSBjYXRhbG9nIGlzIGNsb3NlZCB2ZXJ5IGxhdGUgYXQgbGlicmFyeQorICAgIHNodXR0aW5nIGRvd24sIHdoZW4gbm8gb3RoZXIgdGhyZWFkcyBhcmUgYWxpdmUuCisqLworCitzdGF0aWMgdm9pZCBfX2ttcF9pMThuX2RvX2NhdG9wZW4oKTsKK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggbG9jayApOworICAgIC8vIGBsb2NrJyB2YXJpYWJsZSBtYXkgYmUgcGxhY2VkIGludG8gX19rbXBfaTE4bl9jYXRvcGVuIGZ1bmN0aW9uIGJlY2F1c2UgaXQgaXMgdXNlZCBvbmx5IGJ5CisgICAgLy8gdGhhdCBmdW5jdGlvbi4gQnV0IHdlIGFmcmFpZCBhIChidWdneSkgY29tcGlsZXIgbWF5IHRyZWF0IGl0IHdyb25nbHkuIFNvIHdlIHB1dCBpdCBvdXRzaWRlIG9mCisgICAgLy8gZnVuY3Rpb24ganVzdCBpbiBjYXNlLgorCit2b2lkCitfX2ttcF9pMThuX2NhdG9wZW4oCispIHsKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOworICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICBfX2ttcF9pMThuX2RvX2NhdG9wZW4oKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7CisgICAgfTsgLy8gaWYKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdG9wZW4KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIExpbnV4KiBPUyBhbmQgT1MgWCogcGFydC4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZiBLTVBfT1NfVU5JWAorI2RlZmluZSBLTVBfSTE4Tl9PSworCisjaW5jbHVkZSA8bmxfdHlwZXMuaD4KKworI2RlZmluZSBLTVBfSTE4Tl9OVUxMQ0FUICgobmxfY2F0ZCkoIC0xICkpCitzdGF0aWMgbmxfY2F0ZCAgICAgICBjYXQgID0gS01QX0kxOE5fTlVMTENBVDsgICAgLy8gISEhIFNoYWxsIGl0IGJlIHZvbGF0aWxlPworc3RhdGljIGNoYXIgY29uc3QgKiAgbmFtZSA9ICggS01QX1ZFUlNJT05fTUFKT1IgPT0gNCA/ICJsaWJndWlkZS5jYXQiIDogImxpYmlvbXA1LmNhdCIgKTsKKworLyoKKyAgICBVc2VmdWwgbGlua3M6CisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9iYXNlZGVmcy94YmRfY2hhcDA4Lmh0bWwjdGFnXzA4XzAyCisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9mdW5jdGlvbnMvY2F0b3Blbi5odG1sCisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9mdW5jdGlvbnMvc2V0bG9jYWxlLmh0bWwKKyovCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworICAgIGludCAgICBlbmdsaXNoID0gMDsKKyAgICBjaGFyICogbGFuZyAgICA9IF9fa21wX2Vudl9nZXQoICJMQU5HIiApOworICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgTENfQUxMIG9yIExDX01FU1NBR0VTPworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBlbmdsaXNoID0KKwlsYW5nID09IE5VTEwgICAgICAgICAgICAgICAgICAgICAgIHx8ICAvLyBJbiBhbGwgdGhlc2UgY2FzZXMgRW5nbGlzaCBsYW5ndWFnZSBpcyB1c2VkLgorCXN0cmNtcCggbGFuZywgIiIgKSAgICAgICAgICAgID09IDAgfHwKKyAgICAgICAgc3RyY21wKCBsYW5nLCAiICIgKSAgICAgICAgICAgPT0gMCB8fAorICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBGb3J0cmFuIFJUTCBidWcgRFBEMjAwMTM3ODczICJGb3J0cmFuIHJ1bnRpbWUgcmVzZXRzIExBTkcgZW52IHZhcgorICAgICAgICAgICAgICAvLyB0byBzcGFjZSBpZiBpdCBpcyBub3Qgc2V0Ii4KKwlzdHJjbXAoIGxhbmcsICJDIiApICAgICAgICAgICA9PSAwIHx8CisJc3RyY21wKCBsYW5nLCAiUE9TSVgiICkgICAgICAgPT0gMDsKKworICAgIGlmICggISBlbmdsaXNoICkgeyAgLy8gRW5nbGlzaCBsYW5ndWFnZSBpcyBub3QgeWV0IGRldGVjdGVkLCBsZXQgdXMgY29udGludWUuCisgICAgICAgIC8vIEZvcm1hdCBvZiBMQU5HIGlzOiBbbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bLmNvZGVzZXRdW0Btb2RpZmllcl1dCisgICAgICAgIC8vIFN0cmlwIGFsbCBwYXJ0cyBleGNlcHQgbGFuZ3VhZ2UuCisgICAgICAgIGNoYXIgKiB0YWlsID0gTlVMTDsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnQCcsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJy4nLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICdfJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgZW5nbGlzaCA9ICggc3RyY21wKCBsYW5nLCAiZW4iICkgPT0gMCApOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggbGFuZyApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggZW5nbGlzaCApIHsKKwlzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKwlyZXR1cm47CisgICAgfQorCisgICAgY2F0ID0gY2F0b3BlbiggbmFtZSwgMCApOworICAgIC8vIFRPRE86IFdoeSBkbyB3ZSBwYXNzIDAgaW4gZmxhZ3M/CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworICAgICAgICBpbnQgICAgZXJyb3IgICA9IGVycm5vOyAvLyBTYXZlIGVycm5vIGltbWVkaWF0ZWxseS4KKwljaGFyICogbmxzcGF0aCA9IF9fa21wX2Vudl9nZXQoICJOTFNQQVRIIiApOworICAgICAgICBjaGFyICogbGFuZyAgICA9IF9fa21wX2Vudl9nZXQoICJMQU5HIiApOworCisJLy8gSW5maW5pdGUgcmVjdXJzaW9uIHdpbGwgbm90IG9jY3VyIC0tIHN0YXR1cyBpcyBLTVBfSTE4Tl9BQlNFTlQgbm93LCBzbworCS8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2csIGJ1dCB3aWxsIHJldHVybiBkZWZhdWx0IG1lc3NhZ2UuCisJX19rbXBfbXNnKAorCSAgICBrbXBfbXNfd2FybmluZywKKwkgICAgS01QX01TRyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgbmFtZSApLAorCSAgICBLTVBfRVJSKCBlcnJvciApLAorCSAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgIk5MU1BBVEgiLCBubHNwYXRoICksCisgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgIkxBTkciLCBsYW5nICksCisJICAgIF9fa21wX21zZ19udWxsCisJKTsKKwlLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBubHNwYXRoICk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc3RhdHVzID09IEtNUF9JMThOX09QRU5FRAorCisgICAgICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlcigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgY2hhciBjb25zdCAqIGV4cGVjdGVkID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAga21wX3N0cl9idWZfdCB2ZXJzaW9uOyAgIC8vIEFjdHVhbCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgdmVyc2lvbiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHZlcnNpb24sICIlcyIsIGNhdGdldHMoIGNhdCwgc2VjdGlvbiwgbnVtYmVyLCBOVUxMICkgKTsKKworICAgICAgICAgICAgLy8gU3RyaW5nIHJldHVybmVkIGJ5IGNhdGdldHMgaXMgaW52YWxpZCBhZnRlciBjbG9zaW5nIHRoZSBjYXRhbG9nLCBzbyBjb3B5IGl0LgorICAgICAgICBpZiAoIHN0cmNtcCggdmVyc2lvbi5zdHIsIGV4cGVjdGVkICkgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsgICAgIC8vIENsb3NlIGJhZCBjYXRhbG9nLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gQW5kIG1hcmsgaXQgYXMgYWJzZW50LgorICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworICAgICAgICAgICAgICAgIC8vIEFuZCBub3cgcHJpbnQgYSB3YXJuaW5nIHVzaW5nIGRlZmF1bHQgbWVzc2FnZXMuCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgICAgPSAiTkxTUEFUSCI7CisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggV3JvbmdNZXNzYWdlQ2F0YWxvZywgbmFtZSwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoZWNrRW52VmFyLCBuYW1lLCBubHNwYXRoICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG5sc3BhdGggKTsKKyAgICAgICAgICAgIH0gLy8gX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHZlcnNpb24gKTsKKworICAgIH07IC8vIGlmCisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2RvX2NhdG9wZW4KKworCit2b2lkCitfX2ttcF9pMThuX2NhdGNsb3NlKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgICAgICBjYXRjbG9zZSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisKK2NoYXIgY29uc3QgKgorX19rbXBfaTE4bl9jYXRnZXRzKAorICAgIGttcF9pMThuX2lkX3QgIGlkCispIHsKKworICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGlkICk7CisgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBpZCApOworICAgIGNoYXIgY29uc3QgKiBtZXNzYWdlID0gTlVMTDsKKworICAgIGlmICggMSA8PSBzZWN0aW9uICYmIHNlY3Rpb24gPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemUgKSB7CisgICAgICAgIGlmICggMSA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSApIHsKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIGNhdGdldHMoCisgICAgICAgICAgICAgICAgICAgICAgICBjYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfVU5JWAorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFdpbmRvd3MqIE9TIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2RlZmluZSBLTVBfSTE4Tl9OVUxMQ0FUICBOVUxMCitzdGF0aWMgSE1PRFVMRSAgICAgICBjYXQgID0gS01QX0kxOE5fTlVMTENBVDsgICAgLy8gISEhIFNoYWxsIGl0IGJlIHZvbGF0aWxlPworc3RhdGljIGNoYXIgY29uc3QgKiAgbmFtZSA9ICggS01QX1ZFUlNJT05fTUFKT1IgPT0gNCA/ICJsaWJndWlkZTQwdWkuZGxsIiA6ICJsaWJpb21wNXVpLmRsbCIgKTsKKworc3RhdGljIGttcF9pMThuX3RhYmxlX3QgIHRhYmxlICAgICAgICAgICAgID0geyAwLCBOVUxMIH07CisgICAgLy8gTWVzc2FnZXMgZm9ybWF0dGVkIGJ5IEZvcm1hdE1lc3NhZ2UoKSBzaG91bGQgYmUgZnJlZWQsIGJ1dCBjYXRnZXRzKCkgaW50ZXJmYWNlIGFzc3VtZXMKKyAgICAvLyB1c2VyIHdpbGwgbm90IGZyZWUgbWVzc2FnZXMuIFNvIHdlIGNhY2hlIGFsbCB0aGUgcmV0cmlldmVkIG1lc3NhZ2VzIGluIHRoZSB0YWJsZSwgd2hpY2gKKyAgICAvLyBhcmUgZnJlZWQgYXQgY2F0Y2xvc2UoKS4KK3N0YXRpYyBVSU5UIGNvbnN0ICAgICAgICBkZWZhdWx0X2NvZGVfcGFnZSA9IENQX09FTUNQOworc3RhdGljIFVJTlQgICAgICAgICAgICAgIGNvZGVfcGFnZSAgICAgICAgID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogX19fY2F0Z2V0cygga21wX2kxOG5faWRfdCAgaWQgKTsKK3N0YXRpYyBVSU5UICAgICAgICAgZ2V0X2NvZGVfcGFnZSgpOworc3RhdGljIHZvaWQgICAgICAgICBrbXBfaTE4bl90YWJsZV9mcmVlKCBrbXBfaTE4bl90YWJsZV90ICogdGFibGUgKTsKKworCitzdGF0aWMgVUlOVAorZ2V0X2NvZGVfcGFnZSgKKykgeworCisgICAgVUlOVCBjcCA9IGRlZmF1bHRfY29kZV9wYWdlOworICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoICJLTVBfQ09ERVBBR0UiICk7CisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIkFOU0kiICkgPT0gMCApIHsKKyAgICAgICAgICAgIGNwID0gQ1BfQUNQOworICAgICAgICB9IGVsc2UgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJPRU0iICkgPT0gMCApIHsKKyAgICAgICAgICAgIGNwID0gQ1BfT0VNQ1A7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIlVURi04IiApID09IDAgfHwgX3N0cmljbXAoIHZhbHVlLCAiVVRGOCIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9VVEY4OworICAgICAgICB9IGVsc2UgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJVVEYtNyIgKSA9PSAwIHx8IF9zdHJpY21wKCB2YWx1ZSwgIlVURjciICkgPT0gMCApIHsKKyAgICAgICAgICAgIGNwID0gQ1BfVVRGNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vICEhISBUT0RPOiBJc3N1ZSBhIHdhcm5pbmc/CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdmFsdWUgKTsKKyAgICByZXR1cm4gY3A7CisKK30gLy8gZnVuYyBnZXRfY29kZV9wYWdlCisKKworc3RhdGljIHZvaWQKK2ttcF9pMThuX3RhYmxlX2ZyZWUoCisgICAga21wX2kxOG5fdGFibGVfdCAqIHRhYmxlCispIHsKKyAgICBpbnQgczsKKyAgICBpbnQgbTsKKyAgICBmb3IgKCBzID0gMDsgcyA8IHRhYmxlLT5zaXplOyArKyBzICkgeworICAgICAgICBmb3IgKCBtID0gMDsgbSA8IHRhYmxlLT5zZWN0WyBzIF0uc2l6ZTsgKysgbSApIHsKKyAgICAgICAgICAgIC8vIEZyZWUgbWVzc2FnZS4KKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB0YWJsZS0+c2VjdFsgcyBdLnN0clsgbSBdICk7CisgICAgICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnN0clsgbSBdID0gTlVMTDsKKyAgICAgICAgfTsgLy8gZm9yIG0KKyAgICAgICAgdGFibGUtPnNlY3RbIHMgXS5zaXplID0gMDsKKyAgICAgICAgLy8gRnJlZSBzZWN0aW9uIGl0c2VsZi4KKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUgKCAodm9pZCAqKSB0YWJsZS0+c2VjdFsgcyBdLnN0ciApOworICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnN0ciA9IE5VTEw7CisgICAgfTsgLy8gZm9yIHMKKyAgICB0YWJsZS0+c2l6ZSA9IDA7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHRhYmxlLT5zZWN0ICk7CisgICAgdGFibGUtPnNlY3QgPSBOVUxMOworfSAvLyBrbXBfaThuX3RhYmxlX2ZyZWUKKworCit2b2lkCitfX2ttcF9pMThuX2RvX2NhdG9wZW4oCispIHsKKworICAgIExDSUQgICAgICAgICAgbG9jYWxlX2lkID0gR2V0VGhyZWFkTG9jYWxlKCk7CisgICAgV09SRCAJICBsYW5nX2lkID0gTEFOR0lERlJPTUxDSUQoIGxvY2FsZV9pZCApOworICAgIFdPUkQgICAgICAgICAgcHJpbWFyeV9sYW5nX2lkID0gUFJJTUFSWUxBTkdJRCggbGFuZ19pZCApOworICAgIGttcF9zdHJfYnVmX3QgcGF0aDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgICAgPT0gS01QX0kxOE5fTlVMTENBVCApOworCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHBhdGggKTsKKworICAgIC8vIERvIG5vdCB0cnkgdG8gb3BlbiBFbmdsaXNoIGNhdGFsb2cgYmVjYXVzZSBpbnRlcm5hbCBtZXNzYWdlcyBhcmUKKyAgICAvLyBleGFjdCBjb3B5IG9mIG1lc3NhZ2VzIGluIEVuZ2xpc2ggY2F0YWxvZy4KKyAgICBpZiAoIHByaW1hcnlfbGFuZ19pZCA9PSBMQU5HX0VOR0xJU0ggKSB7CisJc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisJZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKworICAgIC8vIENvbnN0cnVjdCByZXNvdXJjZSBETEwgbmFtZS4KKyAgICAvKgorICAgICAgICBTaW1wbGUKKyAgICAgICAgICAgIExvYWRMaWJyYXJ5KCBuYW1lICkKKyAgICAgICAgaXMgbm90IHN1aXRhYmxlIGR1ZSB0byBzZWN1cml0eSBpc3N1ZSAoc2VlCisgICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L3NlY3VyaXR5L2Fkdmlzb3J5LzIyNjk2MzcubXNweCkuIFdlIGhhdmUgdG8gc3BlY2lmeSBmdWxsCisgICAgICAgIHBhdGggdG8gdGhlIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAqLworICAgIHsKKworICAgICAgICAvLyBHZXQgaGFuZGxlIG9mIG91ciBETEwgZmlyc3QuCisgICAgICAgIEhNT0RVTEUgaGFuZGxlOworICAgICAgICBCT09MIGJyYyA9CisgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGVFeCgKKyAgICAgICAgICAgICAgICBHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX0ZST01fQUREUkVTUyB8IEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfVU5DSEFOR0VEX1JFRkNPVU5ULAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IExQQ1NUUiA+KCAmIF9fa21wX2kxOG5fZG9fY2F0b3BlbiApLAorICAgICAgICAgICAgICAgICYgaGFuZGxlCisgICAgICAgICAgICApOworICAgICAgICBpZiAoICEgYnJjICkgeyAgICAvLyBFcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAvLyBUT0RPOiBFbmFibGUgbXVsdGlwbGUgbWVzc2FnZXMgKEtNUF9NU0cpIHRvIGJlIHBhc3NlZCB0byBfX2ttcF9tc2c7IGFuZCBwcmludAorICAgICAgICAgICAgLy8gYSBwcm9wZXIgd2FybmluZy4KKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBOb3cgZ2V0IHBhdGggdG8gdGhlIG91ciBETEwuCisgICAgICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgICAgIERXT1JEIGRyYyA9IEdldE1vZHVsZUZpbGVOYW1lKCBoYW5kbGUsIHBhdGguc3RyLCBwYXRoLnNpemUgKTsKKyAgICAgICAgICAgIGlmICggZHJjID09IDAgKSB7ICAgIC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGRyYyA8IHBhdGguc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBwYXRoLnVzZWQgPSBkcmM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCAmIHBhdGgsIHBhdGguc2l6ZSAqIDIgKTsKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorCisgICAgICAgIC8vIE5vdyBjb25zdHJ1Y3QgdGhlIG5hbWUgb2YgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICBrbXBfc3RyX2ZuYW1lIGZuYW1lOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBmbmFtZSwgcGF0aC5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9jbGVhciggJiBwYXRoICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgcGF0aCwgIiVzJWx1LyVzIiwgZm5hbWUuZGlyLCAodW5zaWduZWQgbG9uZykoIGxvY2FsZV9pZCApLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGZuYW1lICk7CisKKyAgICB9CisKKyAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucywgdXNlIExvYWRMaWJyYXJ5RXgoKSBhbmQgbG9hZCBtZXNzYWdlIGNhdGFsb2cgYXMgYSBkYXRhIGZpbGUuCisgICAgY2F0ID0gTG9hZExpYnJhcnlFeCggcGF0aC5zdHIsIE5VTEwsIExPQURfTElCUkFSWV9BU19EQVRBRklMRSApOworICAgIHN0YXR1cyA9ICggY2F0ID09IEtNUF9JMThOX05VTExDQVQgPyBLTVBfSTE4Tl9BQlNFTlQgOiBLTVBfSTE4Tl9PUEVORUQgKTsKKworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0FCU0VOVCApIHsKKyAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKwlEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworCS8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKwkvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nIGJ1dCB3aWxsIHJldHVybiBkZWZhdWx0IG1lc3NhZ2UuCisgICAgICAgIC8qCisgICAgICAgICBJZiBtZXNzYWdlIGNhdGFsb2cgZm9yIGFub3RoZXIgYXJjaGl0ZWN0dXJlIGZvdW5kIChlLmcuIE9wZW5NUCBSVEwKKwkgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSBvcGVucyBsaWJpb21wNXVpLmRsbCBmb3IgSW50ZWwoUikgNjQpCisJIFdpbmRvd3MqIE9TIHJldHVybnMgZXJyb3IgMTkzIChFUlJPUl9CQURfRVhFX0ZPUk1BVCkuIEhvd2V2ZXIsCisgICAgICAgICBGb3JtYXRNZXNzYWdlIGZhaWxzIHRvIHJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IsIHNvIHVzZXIKKwkgd2lsbCBzZWU6CisKKyAgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICIxMDQxXGxpYmlvbXA1dWkuZGxsIjoKKyAgICAgICAgIE9NUDogU3lzdGVtIGVycm9yICMxOTM6IChObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpCisgICAgICAgICBPTVA6IEluZm8gIzM6IERlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLgorCisgICAgICAgICBJc3N1ZSBhIGhpbnQgaW4gdGhpcyBjYXNlIHRvIGxldCBjYXVzZSBvZiB0cm91YmxlIG1vcmUgdW5kZXJzdGFuZGFibGUuCisgICAgICAgICovCisJX19rbXBfbXNnKAorCSAgICBrbXBfbXNfd2FybmluZywKKwkgICAgS01QX01TRyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgcGF0aC5zdHIgKSwKKwkgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksCisgICAgICAgICAgICAoIGVycm9yID09IEVSUk9SX0JBRF9FWEVfRk9STUFUID8gS01QX0hOVCggQmFkRXhlRm9ybWF0LCBwYXRoLnN0ciwgS01QX0FSQ0hfU1RSICkgOiBfX2ttcF9tc2dfbnVsbCApLAorCSAgICBfX2ttcF9tc2dfbnVsbAorCSk7CisJS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAga21wX3N0cl9idWZfdCB2ZXJzaW9uOyAgIC8vIEFjdHVhbCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgdmVyc2lvbiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHZlcnNpb24sICIlcyIsIF9fX2NhdGdldHMoIGttcF9pMThuX3BycF9WZXJzaW9uICkgKTsKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsKKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyLCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgICAgICAgIH0gLy8gX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHZlcnNpb24gKTsKKworICAgIH07IC8vIGlmCisgICAgY29kZV9wYWdlID0gZ2V0X2NvZGVfcGFnZSgpOworCisgICAgZW5kOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgcGF0aCApOworICAgICAgICByZXR1cm47CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2RvX2NhdG9wZW4KKworCit2b2lkCitfX2ttcF9pMThuX2NhdGNsb3NlKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgICAgICBrbXBfaTE4bl90YWJsZV9mcmVlKCAmIHRhYmxlICk7CisgICAgICAgIEZyZWVMaWJyYXJ5KCBjYXQgKTsKKyAgICAgICAgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGRlZmF1bHRfY29kZV9wYWdlOworICAgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGNsb3NlCisKKy8qCisgICAgV2UgdXNlIEZvcm1hdE1lc3NhZ2UoKSB0byBnZXQgc3RyaW5ncyBmcm9tIGNhdGFsb2csIGdldCBzeXN0ZW0gZXJyb3IgbWVzc2FnZXMsIGV0Yy4KKyAgICBGb3JtYXRNZXNzYWdlKCkgdGVuZHMgdG8gcmV0dXJuIFdpbmRvd3MqIE9TLXN0eWxlIGVuZC1vZi1saW5lcywgIlxyXG4iLiBXaGVuIHN0cmluZyBpcyBwcmludGVkLAorICAgIHByaW50ZigpIGFsc28gcmVwbGFjZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiAiXG4iIHdpdGggIlxyXG4iIChhZ2FpbiEpLCBzbyBzZXF1ZW5jZXMgbGlrZQorICAgICJcclxyXHJcbiIgYXBwZWFyIGluIG91dHB1dC4gSXQgaXMgbm90IHRvbyBnb29kLgorCisgICAgQWRkaXRpb25hbCBtZXNzIGNvbWVzIGZyb20gbWVzc2FnZSBjYXRhbG9nOiBPdXIgY2F0YWxvZyBzb3VyY2UgZW5fVVMubWMgZmlsZSAoZ2VuZXJhdGVkIGJ5CisgICAgbWVzc2FnZS1jb252ZXJ0ZXIucGwpIGNvbnRhaW5zIG9ubHkgIlxuIiBjaGFyYWN0ZXJzLCBidXQgZW5fVVNfbXNnXzEwMzMuYmluIGZpbGUgKHByb2R1Y2VkIGJ5CisgICAgbWMuZXhlKSBtYXkgY29udGFpbiAiXHJcbiIgb3IganVzdCAiXG4iLiBUaGlzIG1lc3MgZ29lcyBmcm9tIGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIHRvCisgICAgbWVzc2FnZSBjYXRhbG9nLCBsaWJpb21wNXVpLmRsbC4gRm9yIGV4YW1wbGUsIG1lc3NhZ2UKKworICAgICAgICBFcnJvcgorCisgICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCkgaXMgY29tcGlsZWQgYnkgbWMuZXhlIHRvICJFcnJvclxyXG4iLCB3aGlsZQorCisgICAgICAgIE9NUDogRXJyb3IgJTEhZCE6ICUyIXMhXG4KKworICAgICh0aGVyZSBpcyAiXG4iIGF0IHRoZSBlbmQgYXMgd2VsbCkgaXMgY29tcGlsZWQgdG8gIk9NUDogRXJyb3IgJTEhZCE6ICUyIXMhXHJcblxuIi4KKworICAgIFRodXMsIHN0cmlwcGluZyBhbGwgIlxyIiBub3JtYWxpemVzIHN0cmluZyBhbmQgcmV0dXJucyBpdCB0byBjYW5vbmljYWwgZm9ybSwgc28gcHJpbnRmKCkgd2lsbAorICAgIHByb2R1Y2UgY29ycmVjdCBlbmQtb2YtbGluZSBzZXF1ZW5jZXMuCisKKyAgICBfX19zdHJpcF9jcnMoKSBzZXJ2ZXMgZm9yIHRoaXMgcHVycG9zZTogaXQgcmVtb3ZlcyBhbGwgdGhlIG9jY3VycmVuY2VzIG9mICJcciIgaW4tcGxhY2UgYW5kCisgICAgcmV0dXJucyBuZXcgbGVuZ3RoIG9mIHN0cmluZy4KKyovCitzdGF0aWMKK2ludAorX19fc3RyaXBfY3JzKAorICAgIGNoYXIgKiBzdHIKKykgeworICAgIGludCBpbiAgPSAwOyAgLy8gSW5wdXQgY2hhcmFjdGVyIGluZGV4LgorICAgIGludCBvdXQgPSAwOyAgLy8gT3V0cHV0IGNoYXJhY3RlciBpbmRleC4KKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGlmICggc3RyWyBpbiBdICE9ICdccicgKSB7CisgICAgICAgICAgICBzdHJbIG91dCBdID0gc3RyWyBpbiBdOworICAgICAgICAgICAgKysgb3V0OworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIHN0clsgaW4gXSA9PSAwICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgICsrIGluOworICAgIH07IC8vIGZvcmV2ZXIKKyAgICByZXR1cm4gb3V0IC0gMTsKK30gLy8gZnVuYyBfX3N0cmlwX2NycworCisKK3N0YXRpYworY2hhciBjb25zdCAqCitfX19jYXRnZXRzKAorICAgIGttcF9pMThuX2lkX3QgIGlkCispIHsKKworICAgIGNoYXIgKiAgICByZXN1bHQgPSBOVUxMOworICAgIFBWT0lEICAgICBhZGRyICAgPSBOVUxMOworICAgIHdjaGFyX3QgKiB3bXNnICAgPSBOVUxMOworICAgIERXT1JEICAgICB3bGVuICAgPSAwOworICAgIGNoYXIgKiAgICBtc2cgICAgPSBOVUxMOworICAgIGludCAgICAgICBsZW4gICAgPSAwOworICAgIGludCAgICAgICByYzsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAhPSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisgICAgd2xlbiA9ICAgIC8vIHdsZW4gZG9lcyAqbm90KiBpbmNsdWRlIHRlcm1pbmF0aW5nIG51bGwuCisgICAgICAgIEZvcm1hdE1lc3NhZ2VXKAorICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9ITU9EVUxFIHwKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgIGNhdCwKKyAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgLy8gTGFuZ0lkCisgICAgICAgICAgICAoTFBXU1RSKSAmIGFkZHIsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBTaXplIGluIGVsZW1lbnRzLCBub3QgaW4gYnl0ZXMuCisgICAgICAgICAgICBOVUxMCisgICAgICAgICk7CisgICAgaWYgKCB3bGVuIDw9IDAgKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH07IC8vIGlmCisgICAgd21zZyA9ICh3Y2hhcl90ICopIGFkZHI7ICAvLyBXYXJuaW5nOiB3bXNnIG1heSBiZSBub3QgbnVsLXRlcm1pbmF0ZWQhCisKKyAgICAvLyBDYWxjdWxhdGUgbGVuZ3RoIG9mIG11bHRpYnl0ZSBtZXNzYWdlLgorICAgIGxlbiA9ICAgICAvLyBTaW5jZSB3bGVuIGRvZXMgbm90IGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbCwgbGVuIGRvZXMgbm90IGluY2x1ZGUgaXQgYWxzby4KKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgICAgICAgIGNvZGVfcGFnZSwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIEZsYWdzLgorICAgICAgICAgICAgd21zZywgd2xlbiwgICAgICAgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCAwLCAgICAgICAgICAvLyBCdWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCBOVUxMICAgICAgICAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICApOworICAgIGlmICggbGVuIDw9IDAgKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH07IC8vIGlmCisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkuCisgICAgbXNnID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICsgMSApOworCisgICAgLy8gQ29udmVydCB3aWRlIG1lc3NhZ2UgdG8gbXVsdGlieXRlIG9uZS4KKyAgICByYyA9CisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoCisgICAgICAgICAgICBjb2RlX3BhZ2UsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBGbGFncy4KKyAgICAgICAgICAgIHdtc2csIHdsZW4sICAgICAgIC8vIFdpZGUgYnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgbXNnLCBsZW4sICAgICAgICAgLy8gQnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgTlVMTCwgTlVMTCAgICAgICAgLy8gRGVmYXVsdCBjaGFyIGFuZCB1c2VkIGRlZmF1bHQgY2hhci4KKyAgICAgICAgKTsKKyAgICBpZiAoIHJjIDw9IDAgfHwgcmMgPiBsZW4gKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH07IC8vIGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggcmMgPT0gbGVuICk7CisgICAgbGVuID0gcmM7CisgICAgbXNnWyBsZW4gXSA9IDA7ICAgICAgICAgICAvLyBQdXQgdGVybWluYXRpbmcgbnVsbCB0byB0aGUgZW5kLgorCisgICAgLy8gU3RyaXBwaW5nIGFsbCAiXHIiIGJlZm9yZSBzdHJpcHBpbmcgbGFzdCBlbmQtb2YtbGluZSBzaW1wbGlmaWVzIHRoZSB0YXNrLgorICAgIGxlbiA9IF9fX3N0cmlwX2NycyggbXNnICk7CisKKyAgICAvLyBFdmVyeSBtZXNzYWdlIGluIGNhdGFsb2cgaXMgdGVybWluYXRlZCB3aXRoICJcbiIuIFN0cmlwIGl0LgorICAgIGlmICggbGVuID49IDEgJiYgbXNnWyBsZW4gLSAxIF0gPT0gJ1xuJyApIHsKKyAgICAgICAgLS0gbGVuOworICAgICAgICBtc2dbIGxlbiBdID0gMDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRXZlcnl0aGluZyBsb29rcyBvay4KKyAgICByZXN1bHQgPSBtc2c7CisgICAgbXNnICAgID0gTlVMTDsKKworICAgIGVuZDoKKworICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBtc2cgKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggd21zZyAhPSBOVUxMICkgeworICAgICAgICBMb2NhbEZyZWUoIHdtc2cgKTsKKyAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBfX19jYXRnZXRzCisKKworY2hhciBjb25zdCAqCitfX2ttcF9pMThuX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbiggaWQgKTsKKyAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGlkICk7CisgICAgY2hhciBjb25zdCAqIG1lc3NhZ2UgPSBOVUxMOworCisgICAgaWYgKCAxIDw9IHNlY3Rpb24gJiYgc2VjdGlvbiA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSApIHsKKyAgICAgICAgaWYgKCAxIDw9IG51bWJlciAmJiBudW1iZXIgPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICkgeworICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0b3BlbigpOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKSB7CisgICAgICAgICAgICAgICAgaWYgKCB0YWJsZS5zaXplID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3QgPSAoa21wX2kxOG5fc2VjdGlvbl90ICopCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfQ0FMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemUgKyAyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBrbXBfaTE4bl9zZWN0aW9uX3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2l6ZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgaWYgKCB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyID0gKGNvbnN0IGNoYXIgKiopCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfQ0FMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBjaGFyIGNvbnN0ICogKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemU7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdID0gX19fY2F0Z2V0cyggaWQgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBDYXRhbG9nIGlzIG5vdCBvcGVuZWQgb3IgbWVzc2FnZSBpcyBub3QgZm91bmQsIHJldHVybiBkZWZhdWx0IG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworCisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEtNUF9JMThOX09LCisgICAgI2Vycm9yIEkxOG4gc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgT1MuCisjZW5kaWYgLy8gS01QX0kxOE5fT0sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKworICAgIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHsKKyAgICAgICAga21wX2kxOG5faWRfdCAgZmlyc3Q7CisgICAgICAgIGttcF9pMThuX2lkX3QgIGxhc3Q7CisgICAgfTsgLy8gc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QKKworICAgIHN0YXRpYyBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCByYW5nZXNbXSA9IHsKKyAgICAgICAgeyBrbXBfaTE4bl9wcnBfZmlyc3QsIGttcF9pMThuX3BycF9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fc3RyX2ZpcnN0LCBrbXBfaTE4bl9zdHJfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX2ZtdF9maXJzdCwga21wX2kxOG5fZm10X2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9tc2dfZmlyc3QsIGttcF9pMThuX21zZ19sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5faG50X2ZpcnN0LCBrbXBfaTE4bl9obnRfbGFzdCB9CisgICAgfTsgLy8gcmFuZ2VzCisKKyAgICBpbnQgICAgICAgICAgIG51bV9vZl9yYW5nZXMgPSBzaXplb2YoIHJhbmdlcyApIC8gc2l6ZW9mKCBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCApOworICAgIGludCAgICAgICAgICAgcmFuZ2U7CisgICAga21wX2kxOG5faWRfdCBpZDsKKworICAgIGZvciAoIHJhbmdlID0gMDsgcmFuZ2UgPCBudW1fb2ZfcmFuZ2VzOyArKyByYW5nZSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiKioqIFNldCAjJWQgKioqXG4iLCByYW5nZSArIDEgKTsKKyAgICAgICAgZm9yICggaWQgPSAoa21wX2kxOG5faWRfdCkoIHJhbmdlc1sgcmFuZ2UgXS5maXJzdCArIDEgKTsKKyAgICAgICAgICAgICAgaWQgPCByYW5nZXNbIHJhbmdlIF0ubGFzdDsKKyAgICAgICAgICAgICAgaWQgPSAoa21wX2kxOG5faWRfdCkoIGlkICsgMSApICkgeworICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVkOiA8PCVzPj5cbiIsIGlkLCBfX2ttcF9pMThuX2NhdGdldHMoIGlkICkgKTsKKyAgICAgICAgfTsgLy8gZm9yIGlkCisgICAgfTsgLy8gZm9yIHJhbmdlCisKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci0+c3RyICk7CisKK30gLy8gX19rbXBfaTE4bl9kdW1wX2NhdGFsb2cKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbXBfbXNnX3QKK19fa21wX21zZ19mb3JtYXQoCisgICAga21wX2kxOG5faWRfdCBpZCwKKyAgICAuLi4KKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIHZhX2xpc3QgICAgICAgIGFyZ3M7CisgICAga21wX3N0cl9idWZfdCAgYnVmZmVyOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIHZhX3N0YXJ0KCBhcmdzLCBpZCApOworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAvLyBPbiBMaW51eCogT1MgYW5kIE9TIFgqLCBwcmludGYoKSBmYW1pbHkgZnVuY3Rpb25zIHByb2Nlc3MgcGFyYW1ldGVyIG51bWJlcnMsIGZvciBleGFtcGxlOgorICAgICAgICAvLyAiJTIkcyAlMSRzIi4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoICYgYnVmZmVyLCBfX2ttcF9pMThuX2NhdGdldHMoIGlkICksIGFyZ3MgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvLyBPbiBXaW5vZHdzLCBwcmludGYoKSBmYW1pbHkgZnVuY3Rpb25zIGRvZXMgbm90IHJlY29nbml6ZSBHTlUgc3R5bGUgcGFyYW1ldGVyIG51bWJlcnMsCisgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gdXNlIEZvcm1hdE1lc3NhZ2UoKSBpbnN0ZWFkLiBJdCByZWNvZ25pemVzIHBhcmFtZXRlciBudW1iZXJzLCBlLiBnLjoKKyAgICAgICAgLy8gIiUyIXMhICIlMSFzISIuCisgICAgICAgIHsKKyAgICAgICAgICAgIExQVFNUUiBzdHIgPSBOVUxMOworICAgICAgICAgICAgaW50ICAgIGxlbjsKKyAgICAgICAgICAgIEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TVFJJTkcgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBpZCApLAorICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgKExQVFNUUikoICYgc3RyICksCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAmIGFyZ3MKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBsZW4gPSBfX19zdHJpcF9jcnMoIHN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBzdHIsIGxlbiApOworICAgICAgICAgICAgTG9jYWxGcmVlKCBzdHIgKTsKKyAgICAgICAgfQorICAgICNlbHNlCisgICAgICAgICNlcnJvcgorICAgICNlbmRpZgorICAgIHZhX2VuZCggYXJncyApOworICAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCAmIGJ1ZmZlciApOworCisgICAgbXNnLnR5cGUgPSAoa21wX21zZ190eXBlX3QpKCBpZCA+PiAxNiApOworICAgIG1zZy5udW0gID0gaWQgJiAweEZGRkY7CisgICAgbXNnLnN0ciAgPSBidWZmZXIuc3RyOworICAgIG1zZy5sZW4gID0gYnVmZmVyLnVzZWQ7CisKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19mb3JtYXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMKK2NoYXIgKgorc3lzX2Vycm9yKAorICAgIGludCBlcnIKKykgeworCisgICAgY2hhciAqIG1lc3NhZ2UgPSBOVUxMOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisKKyAgICAgICAgTFBWT0lEICBidWZmZXIgPSBOVUxMOworICAgICAgICBpbnQgICAgIGxlbjsKKyAgICAgICAgRFdPUkQgICByYzsKKyAgICAgICAgcmMgPQorICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgIGVyciwKKyAgICAgICAgICAgICAgICBNQUtFTEFOR0lEKCBMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCApLCAvLyBEZWZhdWx0IGxhbmd1YWdlLgorICAgICAgICAgICAgICAgIChMUFRTVFIpICYgYnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCByYyA+IDAgKSB7CisgICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdHRlZC4gQ29weSBpdCAoc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIgd2l0aCBub3JtYWwgZnJlZSgpLgorICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIChjaGFyICopIGJ1ZmZlciApOworICAgICAgICAgICAgbGVuID0gX19fc3RyaXBfY3JzKCBtZXNzYWdlICk7IC8vIERlbGV0ZSBjYXJyaWFnZSByZXR1cm5zIGlmIGFueS4KKyAgICAgICAgICAgIC8vIFN0cmlwIHRyYWlsaW5nIG5ld2xpbmVzLgorICAgICAgICAgICAgd2hpbGUgKCBsZW4gPiAwICYmIG1lc3NhZ2VbIGxlbiAtIDEgXSA9PSAnXG4nICkgeworICAgICAgICAgICAgICAgIC0tIGxlbjsKKyAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICBtZXNzYWdlWyBsZW4gXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGb3JtYXRNZXNzYWdlKCkgZmFpbGVkIHRvIGZvcm1hdCBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4gR2V0TGFzdEVycm9yKCkgd291bGQgZ2l2ZSB1cworICAgICAgICAgICAgLy8gZXJyb3IgY29kZSwgd2hpY2ggd2Ugd291bGQgY29udmVydCB0byBtZXNzYWdlLi4uIHRoaXMgaXQgZGFuZ2Vyb3VzIHJlY3Vyc2lvbiwgd2hpY2gKKyAgICAgICAgICAgIC8vIGNhbm5vdCBjbGFyaWZ5IG9yaWdpbmFsIGVycm9yLCBzbyB3ZSB3aWxsIG5vdCBldmVuIHN0YXJ0IGl0LgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIGJ1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgTG9jYWxGcmVlKCBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICNlbHNlIC8vIE5vbi1XaW5kb3dzKiBPUzogTGludXgqIE9TIG9yIE9TIFgqCisKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFRoZXJlIGFyZSAyIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiBzdHJlcnJvcl9yOgorCisgICAgICAgICAgICAgICAgY2hhciAqIHN0cmVycm9yX3IoIGludCwgY2hhciAqLCBzaXplX3QgKTsgIC8vIEdOVSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgaW50ICAgIHN0cmVycm9yX3IoIGludCwgY2hhciAqLCBzaXplX3QgKTsgIC8vIFhTSSB2ZXJzaW9uCisgICAgICAgICovCisKKyAgICAgICAgI2lmIEtNUF9PU19MSU5VWAorCisgICAgICAgICAgICAvLyBHTlUgdmVyc2lvbiBvZiBzdHJlcnJvcl9yLgorCisgICAgICAgICAgICBjaGFyICAgYnVmZmVyWyAyMDQ4IF07CisgICAgICAgICAgICBjaGFyICogY29uc3QgZXJyX21zZyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IGVsaW1pbmF0ZSB0aGlzIGFzc2lnbm1lbnQgdG8gdGVtcG9yYXJ5IHZhcmlhYmxlLCBvdGhlcndpc2UgY29tcGlsZXIgd291bGQKKyAgICAgICAgICAgICAgICAvLyBub3QgaXNzdWUgd2FybmluZyBpZiBzdHJlcnJvcl9yKCkgcmV0dXJucyBgaW50JyBpbnN0ZWFkIG9mIGV4cGVjdGVkIGBjaGFyIConLgorICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGVycl9tc2cgKTsKKworICAgICAgICAjZWxzZSAvLyBPUyBYKiwgRnJlZUJTRCBldGMuCisKKyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGludCAgICBzaXplICAgPSAyMDQ4OworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoZWNraW5nIHJlc3VsdCBvZiBtYWxsb2MoKS4KKyAgICAgICAgICAgIGNoYXIgKiBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICBpbnQgICAgcmM7CisgICAgICAgICAgICByYyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplICk7CisgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB3aGlsZSAoIHJjID09IEVSQU5HRSApIHsgICAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IHN0cmxlbiggbXNnLnN0ciApOworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Vycm9yX2NvZGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbXBfbXNnX3QKK19fa21wX21zZ19lcnJvcl9tZXNnKAorICAgIGNoYXIgY29uc3QgKiBtZXNnCispIHsKKworICAgIGttcF9tc2dfdCAgICAgIG1zZzsKKyAgICBtc2cudHlwZSA9IGttcF9tdF9zeXNlcnI7CisgICAgbXNnLm51bSAgPSAwOworICAgIG1zZy5zdHIgID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgbWVzZyApOworICAgIG1zZy5sZW4gID0gc3RybGVuKCBtc2cuc3RyICk7CisgICAgcmV0dXJuIG1zZzsKKworfSAvLyBfX2ttcF9tc2dfZXJyb3JfbWVzZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX21zZygKKyAgICBrbXBfbXNnX3NldmVyaXR5X3QgIHNldmVyaXR5LAorICAgIGttcF9tc2dfdCAgICAgICAgICAgbWVzc2FnZSwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfaTE4bl9pZF90ICBmb3JtYXQ7ICAgICAgLy8gZm9ybWF0IGlkZW50aWZpZXIKKyAgICBrbXBfbXNnX3QgICAgICBmbXNnOyAgICAgICAgLy8gZm9ybWF0dGVkIG1lc3NhZ2UKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisKKyAgICBpZiAoIHNldmVyaXR5ICE9IGttcF9tc19mYXRhbCAmJiBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmICkKKyAgICAgICAgcmV0dXJuOyAvLyBubyByZWFzb24gdG8gZm9ybSBhIHN0cmluZyBpbiBvcmRlciB0byBub3QgcHJpbnQgaXQKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIC8vIEZvcm1hdCB0aGUgcHJpbWFyeSBtZXNzYWdlLgorICAgIHN3aXRjaCAoIHNldmVyaXR5ICkgeworICAgICAgICBjYXNlIGttcF9tc19pbmZvcm0gOiB7CisgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSW5mbzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBrbXBfbXNfd2FybmluZyA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9XYXJuaW5nOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc19mYXRhbCA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9GYXRhbDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgICBmbXNnID0gX19rbXBfbXNnX2Zvcm1hdCggZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbWVzc2FnZS5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIGZtc2cuc3RyLCBmbXNnLmxlbiApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBmbXNnLnN0ciApOworCisgICAgLy8gRm9ybWF0IG90aGVyIG1lc3NhZ2VzLgorICAgIHZhX3N0YXJ0KCBhcmdzLCBtZXNzYWdlICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBtZXNzYWdlID0gdmFfYXJnKCBhcmdzLCBrbXBfbXNnX3QgKTsKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IE5VTEwgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IF9fa21wX21zZ19lbXB0eS5zdHIgKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3dpdGNoICggbWVzc2FnZS50eXBlICkgeworICAgICAgICAgICAgY2FzZSBrbXBfbXRfaGludCA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSGludDsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9zeXNlcnIgOiB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1N5c0VycjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgICAgICBmbXNnID0gX19rbXBfbXNnX2Zvcm1hdCggZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG1lc3NhZ2Uuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuICk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBmbXNnLnN0ciApOworICAgIH07IC8vIGZvcmV2ZXIKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgIC8vIFByaW50IGZvcm1hdHRlZCBtZXNzYWdlcy4KKyAgICAvLyBUaGlzIGxvY2sgcHJldmVudHMgbXVsdGlwbGUgZmF0YWwgZXJyb3JzIG9uIHRoZSBzYW1lIHByb2JsZW0uCisgICAgLy8gX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7ICAgIC8vIEdFSCAtIFRoaXMgbG9jayBjYXVzaW5nIHRlc3RzIHRvIGhhbmcgb24gT1MgWCouCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgaWYgKCBzZXZlcml0eSA9PSBrbXBfbXNfZmF0YWwgKSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF90aHJlYWRfc2xlZXAoIDUwMCApOyAgIC8qIERlbGF5IHRvIGdpdmUgbWVzc2FnZSBhIGNoYW5jZSB0byBhcHBlYXIgYmVmb3JlIHJlYXBpbmcgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2Fib3J0X3Byb2Nlc3MoKTsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7ICAvLyBHRUggLSB0aGlzIGxvY2sgY2F1c2luZyB0ZXN0cyB0byBoYW5nIG9uIE9TIFgqLgorCit9IC8vIF9fa21wX21zZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2kxOG4uaCBiL3JjMS9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYThkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2kxOG4uaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIGttcF9pMThuLmgKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSTE4Tl9ICisjZGVmaW5lIEtNUF9JMThOX0gKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAgICBrbXBfaTE4bl9pZC5pbmMgZGVmaW5lcyBrbXBfaTE4bl9pZF90IHR5cGUuIEl0IGlzIGFuIGVudW1lcmF0aW9uIHdpdGggaWRlbnRpZmllcnMgb2YgYWxsIHRoZQorICAgIG1lc3NhZ2VzIGluIHRoZSBjYXRhbG9nLiBUaGVyZSBpcyBvbmUgc3BlY2lhbCBpZGVudGlmaWVyOiBrbXBfaTE4bl9udWxsLCB3aGljaCBkZW5vdGVzIGFic2VuY2UKKyAgICBvZiBtZXNzYWdlLgorKi8KKyNpbmNsdWRlICJrbXBfaTE4bl9pZC5pbmMiIC8vIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4KKworLyoKKyAgICBMb3ctbGV2ZWwgZnVuY3Rpb25zIGhhbmRsaW5nIG1lc3NhZ2UgY2F0YWxvZy4gX19rbXBfaTE4bl9vcGVuKCkgb3BlbnMgbWVzc2FnZSBjYXRhbG9nLAorICAgIF9fa21wX2kxOG5fY2xvc2VzKCkgaXQuIEV4cGxpY2l0IG9wZW5pbmcgaXMgbm90IHJlcXVpcmVkOiBpZiBtZXNzYWdlIGNhdGFsb2cgaXMgbm90IHlldCBvcGVuLAorICAgIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgb3BlbiBpdCBpbXBsaWNpdGx5LiBIb3dldmVyLCBjYXRhbG9nIHNob3VsZCBiZSBleHBsaWNpdGx5IGNsb3NlZCwKKyAgICBvdGhlcndpc2UgcmVzb3VyY2VzIChtYW1vcnksIGhhbmRsZXMpIG1heSBsZWFrLgorCisgICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgcmV0dXJucyByZWFkLW9ubHkgc3RyaW5nLiBJdCBzaG91bGQgbm90IGJlIGZyZWVkLgorCisgICAgS01QX0kxOE5fU1RSIG1hY3JvIHNpbXBsaWZpZXMgYWNjZXMgdG8gc3RyaW5ncyBpbiBtZXNzYWdlIGNhdGFsb2cgYSBiaXQuIEZvbGxvd2luZyB0d28gbGluZXMgYXJlCisgICAgZXF1aXZhbGVudDoKKworICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX3N0cl9XYXJuaW5nICkKKyAgICAgICAgS01QX0kxOE5fU1RSKCBXYXJuaW5nICkKKyovCisKK3ZvaWQgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKK3ZvaWQgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CitjaGFyIGNvbnN0ICogICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9pZF90IGlkICk7CisKKyNkZWZpbmUgS01QX0kxOE5fU1RSKCBpZCApICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyXyAjIyBpZCApCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGZvciBwcmludGluZyBzdHJpbmdzIHRhcmdldGVkIHRvIHRoZSB1c2VyLgorCisgICAgQWxsIHRoZSBzdHJpbmdzIGFyZSBkaXZpZGVkIGludG8gMyB0eXBlczoKKworICAgICAgICAqIG1lc3NhZ2VzLAorICAgICAgICAqIGhpbnRzLAorICAgICAgICAqIHN5c3RlbSBlcnJvcnMuCisKKyAgICBUaGVyZSBhcmUgMyBraW5kIG9mIG1lc3NhZ2Ugc2V2ZXJpdGllczoKKworICAgICAgICAqIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsCisgICAgICAgICogd2FybmluZ3MgKG5vbi1mYXRhbCBlcnJvcnMpLAorICAgICAgICAqIGZhdGFsIGVycm9ycy4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICJsaWJndWlkZS5jYXQiOiAgICgxKQorICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAoMikKKyAgICAgICAgT01QOiBIaW50OiBQbGVhc2UgY2hlY2sgTkxTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICAgICAgICAgKDMpCisgICAgICAgIE9NUDogSW5mbyAjMzogRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICg0KQorCisgICAgd2hlcmUKKworICAgICAgICAoMSkgaXMgYSBtZXNzYWdlIG9mIHdhcm5pbmcgc2V2ZXJpdHksCisgICAgICAgICgyKSBpcyBhIHN5c3RlbSBlcnJvciBjYXVzZWQgdGhlIHByZXZpb3Mgd2FybmluZywKKyAgICAgICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICAgICAgKDQpIGlzIGEgbWVzc2FnZSBvZiBpbmZvcm1hdGlvbmFsIHNldmVyaXR5LgorCisgICBVc2FnZSBpbiBjb21wbGV4IGNhc2VzIChtZXNzYWdlIGlzIGFjY29tcGFuaWVkIHdpdGggaGludHMgYW5kIHN5c3RlbSBlcnJvcnMpOgorCisgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgLy8gV2UgbmVlZCBzYXZlIGVycm5vIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGl0IG1heSBiZSBjaGFuZ2VkLgorICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwgICAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBlcnJvcgorICAgICAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAgICAgLy8gSGludAorICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgICAgICk7CisKKyAgICBVc2FnZSBpbiBzaW1wbGUgY2FzZXMgKGp1c3QgYSBtZXNzYWdlLCBubyBzeXN0ZW0gZXJyb3JzIG9yIGhpbnRzKToKKworICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICk7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVybGFwICk7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgICAga21wX210X2R1bW15ICA9ICAwLCAvLyBTcGVjaWFsIHR5cGUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIGttcF9tdF9tZXNnICAgPSAgNCwgLy8gUHJpbWFyeSBPcGVuTVAgbWVzc2FnZSwgY291bGQgYmUgaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGZhdGFsLgorICAgIGttcF9tdF9oaW50ICAgPSAgNSwgLy8gSGludCB0byB0aGUgdXNlci4KKyAgICBrbXBfbXRfc3lzZXJyID0gLTEgIC8vIFN5c3RlbSBlcnJvciBtZXNzYWdlLgorfTsgLy8gZW51bSBrbXBfbXNnX3R5cGUKK3R5cGVkZWYgZW51bSBrbXBfbXNnX3R5cGUgIGttcF9tc2dfdHlwZV90OworCitzdHJ1Y3Qga21wX21zZyB7CisgICAga21wX21zZ190eXBlX3QgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG51bTsKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyOworICAgIGludCAgICAgICAgICAgICBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cgIGttcF9tc2dfdDsKKworLy8gVHdvIHNwZWNpYWwgbWVzc2FnZXMuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19lbXB0eTsgIC8vIENhbiBiZSB1c2VkIGluIHBsYWNlIHdoZXJlIG1lc3NhZ2UgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseS4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX251bGw7ICAgLy8gRGVub3RlcyB0aGUgZW5kIG9mIHZhcmlhZGljIGxpc3Qgb2YgYXJndW1lbnRzLgorCisvLyBIZWxwZXIgZnVuY3Rpb25zLiBDcmVhdGVzIG1lc3NhZ2VzIGVpdGhlciBmcm9tIG1lc3NhZ2UgY2F0YWxvZyBvciBmcm9tIHN5c3RlbS4gTm90ZTogdGhlc2UKKy8vIGZ1bmN0aW9ucyBhbGxvY2F0ZSBtZW1vcnkuIFlvdSBzaG91bGQgcGFzcyBjcmVhdGVkIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsCisvLyBwcmludCBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGVtLgora21wX21zZ190ICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9pZF90IGlkLCAuLi4gKTsKK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGludCBjb2RlICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBjaGFyIGNvbnN0ICogbWVzZyApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyggLi4uICApICAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fbXNnXyAjIyBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEtNUF9ITlQoIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2hudF8gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERSggY29kZSApICBfX2ttcF9tc2dfZXJyb3JfY29kZSggY29kZSApCisjZGVmaW5lIEtNUF9TWVNFUlJNRVNHKCBtZXNnICkgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBtZXNnICkKKyNkZWZpbmUgS01QX0VSUiBLTVBfU1lTRVJSQ09ERQorCisvLyBNZXNzYWdlIHNldmVyaXR5LgorZW51bSBrbXBfbXNnX3NldmVyaXR5IHsKKyAgICBrbXBfbXNfaW5mb3JtLCAgICAgIC8vIEp1c3QgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLgorICAgIGttcF9tc193YXJuaW5nLCAgICAgLy8gTm9uLWZhdGFsIGVycm9yLCBleGVjdXRpb24gY29udGludWVzLgorICAgIGttcF9tc19mYXRhbCAgICAgICAgLy8gRmF0YWwgZXJyb3IsIHByb2dyYW0gYWJvcnRzLgorfTsgLy8gZW51bSBrbXBfbXNnX3NldmVyaXR5Cit0eXBlZGVmIGVudW0ga21wX21zZ19zZXZlcml0eSAga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIG1hbmRhdG9yeS4gQW55IG51bWJlcgorLy8gb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQgbGlzdCBtdXN0IGJlIGZpbmlzaGVkIHdpdGggX19rbXBfbXNnX251bGwuCit2b2lkICAgIF9fa21wX21zZygga21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uICk7CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gbWFrZSBjYWxscyBzaG9ydGVyIGluIHNpbXBsZSBjYXNlcy4KKyNkZWZpbmUgS01QX0lORk9STSggLi4uICApIF9fa21wX21zZygga21wX21zX2luZm9ybSwgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1dBUk5JTkcoIC4uLiApIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX0ZBVEFMKCAgIC4uLiApIF9fa21wX21zZygga21wX21zX2ZhdGFsLCAgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9tc2coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgZnVuYyApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKy8vIENoZWNrIGVycm9yLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZS4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBlcnJvciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIENoZWNrIHN0YXR1cywgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UgdXNpbmcgZXJybm8uCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCBmdW5jLCBzdGF0dXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgdm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9OyAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9JMThOX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmMgYi9yYzEvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDlhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBrbXBfaW1wb3J0LmMKKyAqICRSZXZpc2lvbjogNDIyODYgJAorICogJERhdGU6IDIwMTMtMDQtMTggMTA6NTM6MjYgLTA1MDAgKFRodSwgMTggQXByIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJpb21wNW1kLmxpYikKKyAgICBvbmx5ISBJdCBpcyBub3QgYSBwYXJ0IG9mIHJlZ3VsYXIgc3RhdGljIG9yIGR5bmFtaWMgT3Blbk1QIFJUTC4gQW55IGNvZGUgdGhhdCBqdXN0IG5lZWRzIHRvIGdvCisgICAgaW4gdGhlIGxpYmlvbXA1bWQubGliIChidXQgbm90IGluIGxpYmlvbXA1bXQubGliIGFuZCBsaWJpb21wNW1kLmRsbCkgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGlzCisgICAgZmlsZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAgICBUaGVzZSBzeW1ib2xzIGFyZSByZXF1aXJlZCBmb3IgbXV0dWFsIGV4Y2x1c2lvbiB3aXRoIE1pY3Jvc29mdCBPcGVuTVAgUlRMIChhbmQgY29tcGF0aWJpbGl0eQorICAgIHdpdGggTVMgQ29tcGlsZXIpLgorKi8KKworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgICAgICAgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ID0gMTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfaW8uYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I2MDgxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9pby5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICoga21wX2lvLmMgLS0gUlRMIElPCisgKiAkUmV2aXNpb246IDQyMTUwICQKKyAqICREYXRlOiAyMDEzLTAzLTE1IDE1OjQwOjM4IC0wNTAwIChGcmksIDE1IE1hciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfX0FCU09GVF9XSU4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcC5oIiAvLyBLTVBfR1RJRF9ETkUsIF9fa21wX2RlYnVnX2J1ZiwgZXRjCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBwcmFnbWEgd2FybmluZyggcHVzaCApCisjIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAyNzEgMzEwICkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9zdGRpb19sb2NrICAgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX3N0ZGlvX2xvY2sgICApOyAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9jb25zb2xlX2xvY2sgKTsgLyogQ29udHJvbCBjb25zb2xlIGluaXRpYWxpemF0aW9uICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworCisgICAgIyBpZmRlZiBLTVBfREVCVUcgCisgICAgLyogX19rbXBfc3Rkb3V0IGlzIHVzZWQgb25seSBmb3IgZGV2IGJ1aWxkICovCisgICAgc3RhdGljIEhBTkRMRSAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworICAgICMgZW5kaWYKKyAgICBzdGF0aWMgSEFORExFICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gRkFMU0U7CisgICAgc3RhdGljIGttcF9zdHJfYnVmX3QgX19rbXBfY29uc29sZV9idWY7CisKKyAgICBzdGF0aWMgaW50CisgICAgaXNfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsgMTI4IF07CisgICAgICAgIERXT1JEIHJjICA9IDA7CisgICAgICAgIERXT1JEIGVyciA9IDA7CisgICAgICAgIC8vIFRyeSB0byBnZXQgY29uc29sZSB0aXRsZS4KKyAgICAgICAgU2V0TGFzdEVycm9yKCAwICk7CisgICAgICAgICAgICAvLyBHZXRDb25zb2xlVGl0bGUgZG9lcyBub3QgcmVzZXQgbGFzdCBlcnJvciBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3Igc2hvcnQgYnVmZmVyLAorICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjbGVhciBpdCBleHBsaWNpdGx5LgorICAgICAgICByYyA9IEdldENvbnNvbGVUaXRsZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHJjID09IDAgbWVhbnMgZ2V0dGluZyBjb25zb2xlIHRpdGxlIGZhaWxlZC4gTGV0IHVzIGZpbmQgb3V0IHdoeS4KKyAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgLy8gZXJyID09IDAgbWVhbnMgYnVmZmVyIHRvbyBzaG9ydCAod2Ugc3VwcG9zZSBjb25zb2xlIGV4aXN0cykuCisgICAgICAgICAgICAvLyBJbiBXaW5kb3cgYXBwbGljYXRpb25zIHdlIHVzdWFsbHkgaGF2ZSBlcnIgPT0gNiAoaW52YWxpZCBoYW5kbGUpLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gcmMgPiAwIHx8IGVyciA9PSAwOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICkKKyAgICB7CisgICAgICAgIC8qIHdhaXQgdW50aWwgdXNlciBwcmVzc2VzIHJldHVybiBiZWZvcmUgY2xvc2luZyB3aW5kb3cgKi8KKyAgICAgICAgLyogVE9ETyBvbmx5IGNsb3NlIGlmIGEgd2luZG93IHdhcyBvcGVuZWQgKi8KKyAgICAgICAgaWYoIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRyAKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGb3Igd2luZG93cywgY2FsbCB0aGlzIGJlZm9yZSBzdGRvdXQsIHN0ZGVyciwgb3Igc3RkaW4gYXJlIHVzZWQuCisgICAgICogSXQgb3BlbnMgYSBjb25zb2xlIHdpbmRvdyBhbmQgc3RhcnRzIHByb2Nlc3NpbmcgKi8KKyAgICBzdGF0aWMgdm9pZAorICAgIF9fa21wX3JlZGlyZWN0X291dHB1dCggdm9pZCApCisgICAgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisKKyAgICAgICAgaWYoICEgX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHIAorICAgICAgICAgICAgLyogc3RhbmRhcmQgb3V0IGlzIHVzZWQgb25seSBpbiBkZXYgYnVpbGQgKi8KKyAgICAgICAgICAgIEhBTkRMRSBobzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgSEFORExFIGhlOworCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZfX2ttcF9jb25zb2xlX2J1ZiApOworCisgICAgICAgICAgICBBbGxvY0NvbnNvbGUoKTsKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBjaGVjayB0aGUgcmVzdWx0IG9mIEFsbG9jQ29uc29sZSBiZWNhdXNlCisgICAgICAgICAgICAvLyAgMS4gdGhlIGNhbGwgaXMgaGFybWxlc3MKKyAgICAgICAgICAgIC8vICAyLiBpdCBpcyBub3QgY2xlYXIgaG93IHRvIGNvbW11bmljYXRlIGZhaWx1ZQorICAgICAgICAgICAgLy8gIDMuIHdlIHdpbGwgZGV0ZWN0IGZhaWx1cmUgbGF0ZXIgd2hlbiB3ZSBnZXQgaGFuZGxlKHMpCisKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICBobyA9IEdldFN0ZEhhbmRsZSggU1REX09VVFBVVF9IQU5ETEUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGhvID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IGhvID09IE5VTEwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IGhvOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsIGZvciBobworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBoZSA9IEdldFN0ZEhhbmRsZSggU1REX0VSUk9SX0hBTkRMRSApOworICAgICAgICAgICAgaWYgKCBoZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBoZSA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG91dHB1dCBlcnJvciBzb21laG93IChtYXliZSBtZXNzYWdlIGJveCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gaGU7IC8vIHRlbXBvcmFyeSBjb2RlLCBuZWVkIG5ldyBnbG9iYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisgICAgfQorCisjZWxzZQorICAgICNkZWZpbmUgICAgICAgX19rbXBfc3RkZXJyICAgICAoc3RkZXJyKQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK3ZvaWQKK19fa21wX3ZwcmludGYoIGVudW0ga21wX2lvIF9fa21wX2lvLCBjaGFyIGNvbnN0ICogZm9ybWF0LCB2YV9saXN0IGFwICkKK3sKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYoICFfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgIF9fa21wX3JlZGlyZWN0X291dHB1dCgpOworICAgICAgICB9CisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRlcnIgJiYgX19rbXBfaW8gPT0ga21wX2VyciApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRvdXQgJiYgX19rbXBfaW8gPT0ga21wX291dCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgJiYgX19rbXBfZGVidWdfYnVmZmVyICE9IE5VTEwgKSB7CisKKyAgICAgICAgaW50IGRjID0gKCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID8KKyAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2RlYnVnX2NvdW50KSA6IF9fa21wX2RlYnVnX2NvdW50KysgKQorICAgICAgICAgICAgICAgICAgICUgX19rbXBfZGVidWdfYnVmX2xpbmVzOworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBkYyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBpbnQgY2hhcnMgPSAwOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgY2hhcnMgPSBzcHJpbnRmKCBkYiwgInBpZD0lZDogIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGNoYXJzICs9IHZzcHJpbnRmKCBkYiwgZm9ybWF0LCBhcCApOworCisgICAgICAgIGlmICggY2hhcnMgKyAxID4gX19rbXBfZGVidWdfYnVmX2NoYXJzICkgeworICAgICAgICAgICAgaWYgKCBjaGFycyArIDEgPiBfX2ttcF9kZWJ1Z19idWZfd2Fybl9jaGFycyApIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgY291bnQ7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZfX2ttcF9jb25zb2xlX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPTVAgd2FybmluZzogRGVidWdnaW5nIGJ1ZmZlciBvdmVyZmxvdzsgaW5jcmVhc2UgS01QX0RFQlVHX0JVRl9DSEFSUyB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSApOworICAgICAgICAgICAgICAgICAgICBXcml0ZUZpbGUoIF9fa21wX3N0ZGVyciwgX19rbXBfY29uc29sZV9idWYuc3RyLCBfX2ttcF9jb25zb2xlX2J1Zi51c2VkLCAmY291bnQsIE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jbGVhciggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZiggX19rbXBfc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJPTVAgd2FybmluZzogRGVidWdnaW5nIGJ1ZmZlciBvdmVyZmxvdzsgaW5jcmVhc2UgS01QX0RFQlVHX0JVRl9DSEFSUyB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKCBfX2ttcF9zdGRlcnIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBfX2ttcF9kZWJ1Z19idWZfd2Fybl9jaGFycyA9IGNoYXJzICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHRlcm1pbmF0ZSBzdHJpbmcgaWYgb3ZlcmZsb3cgb2NjdXJyZWQgKi8KKyAgICAgICAgICAgIGRiWyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAyIF0gPSAnXG4nOworICAgICAgICAgICAgZGJbIF9fa21wX2RlYnVnX2J1Zl9jaGFycyAtIDEgXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIERXT1JEIGNvdW50OworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVR19QSURTCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJl9fa21wX2NvbnNvbGVfYnVmLCAicGlkPSVkOiAiLCBnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggJl9fa21wX2NvbnNvbGVfYnVmLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBXcml0ZUZpbGUoCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyLAorICAgICAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfYnVmLnN0ciwKKyAgICAgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2J1Zi51c2VkLAorICAgICAgICAgICAgICAgICZjb3VudCwKKyAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jbGVhciggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBfX2ttcF9zdGRlcnIsICJwaWQ9JWQ6ICIsIGdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHZmcHJpbnRmKCBfX2ttcF9zdGRlcnIsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIGZmbHVzaCggX19rbXBfc3RkZXJyICk7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordm9pZAorX19rbXBfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKwordm9pZAorX19rbXBfcHJpbnRmX25vX2xvY2soIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2lvLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGttcF9pby5oIC0tIFJUTCBJTyBoZWFkZXIgZmlsZS4KKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSU9fSAorI2RlZmluZSBLTVBfSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0ga21wX2lvIHsKKyAgICBrbXBfb3V0ID0gMCwKKyAgICBrbXBfZXJyCit9OworCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jazsgICAgIC8qIENvbnRyb2wgc3RkaW8gZnVuY3Rpb25zICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrOyAgIC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCitleHRlcm4gdm9pZCBfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApOworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Nsb3NlX2NvbnNvbGUoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9JT19IICovCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfaXR0LmMgYi9yYzEvcnVudGltZS9zcmMva21wX2l0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2l0dC5jCkBAIC0wLDAgKzEsMTM5IEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuYyAtLSBJVFQgTm90aWZ5IGludGVyZmFjZS4KKyAqICRSZXZpc2lvbjogNDI0ODkgJAorICogJERhdGU6IDIwMTMtMDctMDggMTE6MDA6MDkgLTA1MDAgKE1vbiwgMDggSnVsIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9pdHQuaCIKKworI2lmIEtNUF9ERUJVRworICAgICNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisKKyNpZiBVU0VfSVRUX05PVElGWQorCisgICAga21wX2ludDMyIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCA9IDA7CisgICAgX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworCisgICAgI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisgICAgI2luY2x1ZGUgImttcF9pMThuLmgiCisgICAgI2luY2x1ZGUgImttcF9zdHIuaCIKKworICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX2l0dF9tYXJrX3QgKSA9PSBzaXplb2YoIF9faXR0X21hcmtfdHlwZSApICk7CisKKyAgICAvKgorICAgICAgICBQcmV2aW91c2x5IHVzZWQgd2FybmluZ3M6CisKKyAgICAgICAgS01QX1dBUk5JTkcoIEl0dEFsbE5vdGlmRGlzYWJsZWQgKTsKKyAgICAgICAgS01QX1dBUk5JTkcoIEl0dE9iak5vdGlmRGlzYWJsZWQgKTsKKyAgICAgICAgS01QX1dBUk5JTkcoIEl0dE1hcmtOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmxvYWRMaWJGYWlsZWQsIGxpYml0dG5vdGlmeSApOworICAgICovCisKKworICAgIGttcF9pbnQzMiBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSA9IDA7CisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaXR0X2RlYnVnX2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX2l0dF9kZWJ1Z19sb2NrICk7CisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorCit2b2lkIF9fa21wX2l0dF9pbml0aWFsaXplKCkgeworCisgICAgLy8gSVRUTm90aWZ5IGxpYnJhcnkgaXMgbG9hZGVkIGFuZCBpbml0aWFsaXplZCBhdCBmaXJzdCBjYWxsIHRvIGFueSBpdHRub3RpZnkgZnVuY3Rpb24sCisgICAgLy8gc28gd2UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBsb2FkIGl0IGFueSBtb3JlLgorICAgIC8vIEp1c3IgcmVwb3J0IE9NUCBSVEwgdmVyc2lvbiB0byBJVFROb3RpZnkuCisKKyAgICAjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgLy8gUmVwb3J0IE9wZW5NUCBSVEwgdmVyc2lvbi4KKyAgICAgICAga21wX3N0cl9idWZfdCAgICAgICBidWY7CisgICAgICAgIF9faXR0X21hcmtfdHlwZSAgICAgdmVyc2lvbjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgICAgICAgJiBidWYsCisgICAgICAgICAgICAiT01QIFJUTCBWZXJzaW9uICVkLiVkLiVkIiwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fbWFqb3IsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21pbm9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9idWlsZAorICAgICAgICApOworICAgICAgICBpZiAoIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWYsICI6JXMiLCBfX2l0dF9hcGlfdmVyc2lvbigpICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHZlcnNpb24gPSBfX2l0dF9tYXJrX2NyZWF0ZSggYnVmLnN0ciApOworICAgICAgICBfX2l0dF9tYXJrKCB2ZXJzaW9uLCBOVUxMICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWYgKTsKKyAgICAjZW5kaWYKKworfSAvLyBfX2ttcF9pdHRfaW5pdGlhbGl6ZQorCisKK3ZvaWQgX19rbXBfaXR0X2Rlc3Ryb3koKSB7CisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYigpOworICAgICNlbmRpZgorfSAvLyBfX2ttcF9pdHRfZGVzdHJveQorCisKK2V4dGVybiAiQyIKK3ZvaWQKK19faXR0X2Vycm9yX2hhbmRsZXIoCisgICAgX19pdHRfZXJyb3JfY29kZSBlcnIsCisgICAgdmFfbGlzdCBhcmdzCispIHsKKworICAgIHN3aXRjaCAoIGVyciApIHsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9ub19tb2R1bGUgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbGlicmFyeSA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICBpbnQgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSXR0TG9hZExpYkZhaWxlZCwgbGlicmFyeSApLCBLTVBfU1lTRVJSQ09ERSggc3lzX2VyciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICogc3lzX2VyciA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSXR0TG9hZExpYkZhaWxlZCwgbGlicmFyeSApLCBLTVBfU1lTRVJSTUVTRyggc3lzX2VyciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fc3ltYm9sIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5bWJvbCAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEl0dExvb2t1cEZhaWxlZCwgc3ltYm9sLCBsaWJyYXJ5ICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXIgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZ3JvdXAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEl0dFVua25vd25Hcm91cCwgdmFyLCBncm91cCApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXIgICAgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICBhY3RfbGVuID0gdmFfYXJnKCBhcmdzLCBzaXplX3QgKTsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICBtYXhfbGVuID0gdmFfYXJnKCBhcmdzLCBzaXplX3QgKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRFbnZWYXJUb29Mb25nLCB2YXIsICh1bnNpZ25lZCBsb25nKSBhY3RfbGVuLCAodW5zaWduZWQgbG9uZykgbWF4X2xlbiApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCB2YXIgKSwgS01QX0VSUiggc3lzX2VyciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3N5c3RlbSA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBmdW5jICAgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGludCAgICAgICAgICBzeXNfZXJyID0gdmFfYXJnKCBhcmdzLCBpbnQgKTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dEZ1bmN0aW9uRXJyb3IsIGZ1bmMgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duRXJyb3IsIGVyciApOworICAgICAgICB9OworICAgIH07IC8vIHN3aXRjaAorCit9IC8vIF9faXR0X2Vycm9yX2hhbmRsZXIKKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9yYzEvcnVudGltZS9zcmMva21wX2l0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTc5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2l0dC5oCkBAIC0wLDAgKzEsMjczIEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuaCAtLSBJVFQgTm90aWZ5IGludGVyZmFjZS4KKyAqICRSZXZpc2lvbjogNDI4MjkgJAorICogJERhdGU6IDIwMTMtMTEtMjEgMDU6NDQ6MDEgLTA2MDAgKFRodSwgMjEgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSVRUX0gKKyNkZWZpbmUgS01QX0lUVF9ICisKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorCisjZGVmaW5lIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorI2luY2x1ZGUgIml0dG5vdGlmeS5oIgorI2luY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKworI2lmIEtNUF9ERUJVRworICAgICNkZWZpbmUgX19rbXBfaW5saW5lICAgICAgICAgICAvLyBUdXJuIG9mZiBpbmxpbmluZyBpbiBkZWJ1ZyBtb2RlLgorI2Vsc2UKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSBzdGF0aWMgaW5saW5lCisjZW5kaWYKKworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXk7CisjIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB2b2lkIF9fa21wX2l0dF9maW5pX2l0dGxpYih2b2lkKTsKKyMgZWxzZQorICAgIGV4dGVybiB2b2lkIF9fa21wX2l0dF9maW5pX2l0dGxpYih2b2lkKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBTaW1wbGlmeSB0aGUgaGFuZGxpbmcgb2YgYW4gYXJndW1lbnQgdGhhdCBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gVVNFX0lUVF9CVUlMRCBpcyBlbmFibGVkLgorI2RlZmluZSBVU0VfSVRUX0JVSUxEX0FSRyh4KSAseAorCit2b2lkIF9fa21wX2l0dF9pbml0aWFsaXplKCk7Cit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5ldyBzdHVmZiBmb3IgcmVwb3J0aW5nIGhpZ2gtbGV2ZWwgY29uc3RydWN0cy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZSB0aGUgbmFtaW5nIGNvbnZlbnRpb246CisvLyAgICAgX19rbXBfaXR0X3h4eGluZygpIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFjdGlvbiwgd2hpbGUKKy8vICAgICBfX2ttcF9pdHRfeHh4ZWQoKSAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhY3Rpb24uCisKKy8vIC0tLSBQYXJhbGxlbCByZWdpb24gcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKCAgaW50IGd0aWQsIGludCBzZXJpYWxpemVkID0gMCApOyAvLyBNYXN0ZXIgb25seSwgYmVmb3JlIGZvcmtpbmcgdGhyZWFkcy4KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCAgIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCA9IDAgKTsgLy8gTWFzdGVyIG9ubHksIGFmdGVyIGpvaW5pbmcgdGhyZWFkcy4KKyAgICAvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCwgaW50IGltYmFsYW5jZSwgaWRlbnRfdCAqbG9jICk7CisKKy8vIC0tLSBCYXJyaWVyIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICogX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBpbnQgZ3RpZCwgaW50IGJ0LCBpbnQgc2V0X25hbWUgPSAwLCBpbnQgZGVsdGEgPSAwICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoICAgaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBUYXNrd2FpdCByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBUYXNrIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIHZvaWQgKiBvYmplY3QgKTsKKworLy8gLS0tIExvY2sgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworCisvLyAtLS0gQ3JpdGljYWwgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworCisvLyAtLS0gU2luZ2xlIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3NpbmdsZV9zdGFydCggaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3NpbmdsZV9lbmQoICAgaW50IGd0aWQgKTsKKworLy8gLS0tIE9yZGVyZWQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9pbml0KCAgaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfcHJlcCggIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9lbmQoICAgaW50IGd0aWQgKTsKKworLy8gLS0tIFRocmVhZHMgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7CitfX2ttcF9pbmxpbmUgdm9pZCAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBpbnQgZ3RpZCApOworCisvLyAtLS0gU3lzdGVtIG9iamVjdHMgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIHZvaWQgKiBvYmplY3QsIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKy8vIC0tLSBTdGFjayBzdGl0Y2hpbmcgLS0tCitfX2ttcF9pbmxpbmUgX19pdHRfY2FsbGVyIF9fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKHZvaWQpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KF9faXR0X2NhbGxlcik7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKF9faXR0X2NhbGxlcik7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKF9faXR0X2NhbGxlcik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9sZCBzdHVmZiBmb3IgcmVwb3J0aW5nIGxvdy1sZXZlbCBpbnRlcm5hbCBzeW5jaHJvbml6YXRpb24uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBVU0VfSVRUX05PVElGWQorCisgICAgLyoKKyAgICAgKiBTdXBwb3J0IGZvciBTU0MgbWFya3MsIHdoaWNoIGFyZSB1c2VkIGJ5IFNERQorICAgICAqIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvaW50ZWwtc29mdHdhcmUtZGV2ZWxvcG1lbnQtZW11bGF0b3IKKyAgICAgKiB0byBtYXJrIHBvaW50cyBpbiBpbnN0cnVjdGlvbiB0cmFjZXMgdGhhdCByZXByZXNlbnQgc3Bpbi1sb29wcyBhbmQgYXJlCisgICAgICogdGhlcmVmb3JlIHVuaW50ZXJlc3Rpbmcgd2hlbiBjb2xsZWN0aW5nIHRyYWNlcyBmb3IgYXJjaGl0ZWN0dXJlIHNpbXVsYXRpb24uCisgICAgICovCisgICAgI2lmbmRlZiBJTkNMVURFX1NTQ19NQVJLUworICAgICMgZGVmaW5lIElOQ0xVREVfU1NDX01BUktTIChLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfWDg2XzY0KQorICAgICNlbmRpZgorCisgICAgLyogTGludXggNjQgb25seSBmb3Igbm93ICovCisgICAgI2lmIChJTkNMVURFX1NTQ19NQVJLUyAmJiBLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfWDg2XzY0KQorICAgIC8vIFBvcnRhYmxlIChhdCBsZWFzdCBmb3IgZ2NjIGFuZCBpY2MpIGNvZGUgdG8gaW5zZXJ0IHRoZSBuZWNlc3NhcnkgaW5zdHJ1Y3Rpb25zCisgICAgLy8gdG8gc2V0ICVlYnggYW5kIGV4ZWN1dGUgdGhlIHVubGlrZWx5IG5vLW9wLgorICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZsICUwLCAlJWVieDsgLmJ5dGUgMHg2NCwgMHg2NywgMHg5MCAiIDo6ImkiKHRhZyk6IiVlYngiKQorICAgICNlbHNlCisgICAgIyBkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgKCh2b2lkKTApCisgICAgI2VuZGlmCisKKyAgICAvKiBNYXJrZXJzIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiByZWdpb25zIHRoYXQgcmVwcmVzZW50IHBvbGxpbmcgYW5kCisgICAgICogYXJlIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHRvIGFyY2hpdGVjdHVyYWwgc2ltdWxhdGlvbnMgMHg0Mzc2IGFuZAorICAgICAqIDB4NDM3NyBhcmUgYXJiaXRyYXJ5IG51bWJlcnMgdGhhdCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzcGFjZSBvZgorICAgICAqIFNTQyB0YWdzLCBidXQgdGhlcmUgaXMgbm8gY2VudHJhbCBpc3N1aW5nIGF1dGhvcml0eSByYXRoZXIKKyAgICAgKiByYW5kb21uZXNzIGlzIGV4cGVjdGVkIHRvIHdvcmsuCisgICAgICovCisgICAgI2RlZmluZSBTU0NfTUFSS19TUElOX1NUQVJUKCkgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fRU5EKCkgICBJTlNFUlRfU1NDX01BUksoMHg0Mzc3KQorCisgICAgLy8gVGhlIG9iamVjdCBpcyBhbiBhZGRyZXNzIHRoYXQgYXNzb2NpYXRlcyBhIHNwZWNpZmljIHNldCBvZiB0aGUgcHJlcGFyZSwgYWNxdWlyZSwgcmVsZWFzZSwKKyAgICAvLyBhbmQgY2FuY2VsIG9wZXJhdGlvbnMuCisKKyAgICAvKiBTeW5jIHByZXBhcmUgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkCisgICAgICAgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQuICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSB0aGUgdGhyZWFkCisgICAgICAgYmVnaW5zIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSByZWxlYXNlIGV2ZW50ICovCisKKyAgICAvKiBTeW5jIGNhbmNlbCBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgY2FuY2VsbGluZyBhIHdhaXQgb24gYW5vdGhlciB0aHJlYWQgYW5jCisgICAgICAgY29udGludWluZyBleGVjdXRpb24gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHJlbGVhc2UgaXQgKi8KKworICAgIC8qIFN5bmMgYWNxdWlyZWQgaW5kaWNhdGVzIGEgdGhyZWFkIGhhcyByZWNlaXZlZCBhIHJlbGVhc2UgZXZlbnQgZnJvbSBhbm90aGVyCisgICAgICAgdGhyZWFkIGFuZCBoYXMgc3RvcHBlZCB3YWl0aW5nLiAgVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IGFmdGVyIHRoZSByZWxlYXNlCisgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuICovCisKKyAgICAvKiBTeW5jIHJlbGVhc2UgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHNlbmQgYSByZWxlYXNlIGV2ZW50IHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgc28gaXQgd2lsbCBzdG9wIHdhaXRpbmcgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBqdXN0IGhhcHBlbiBiZWZvcmUKKyAgICAgICB0aGUgcmVsZWFzZSBldmVudC4gKi8KKworICAgICNkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgIF9faXR0X2ZzeW5jX3ByZXBhcmUoICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICBfX2l0dF9mc3luY19jYW5jZWwoICAgICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgX19pdHRfZnN5bmNfYWNxdWlyZWQoICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgIF9faXR0X2ZzeW5jX3JlbGVhc2luZyggKHZvaWQgKikoIG9iaiApICkKKworICAgIC8qCisgICAgICAgIEluIGNhc2Ugb2Ygd2FpdGluZyBpbiBhIHNwaW4gbG9vcCwgSVRUIHdhbnRzIEtNUF9GU1lOQ19QUkVQQVJFKCkgdG8gYmUgY2FsbGVkIHdpdGggYSBkZWxheQorICAgICAgICAoYW5kIG5vdCBjYWxsZWQgYXQgYWxsIGlmIHdhaXRpbmcgdGltZSBpcyBzbWFsbCkuIFNvLCBpbiBzcGluIGxvb3BzLCBkbyBub3QgdXNlCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCksIGJ1dCB1c2UgS01QX0ZTWU5DX1NQSU5fSU5JVCgpIChiZWZvcmUgc3BpbiBsb29wKSwKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSgpICh3aGl0aGluIHRoZSBzcGluIGxvb3ApLCBhbmQgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoKS4KKyAgICAgICAgU2VlIEtNUF9XQUlUX1lJRUxEKCkgZm9yIGV4YW1wbGUuCisgICAgKi8KKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fSU5JVAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICAgXAorICAgICAgICBpbnQgc3luY19pdGVycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICkgeyAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBvYmogPT0gTlVMTCApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9iaiA9IHNwaW47ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX1NUQVJUKCkKKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICYmIHN5bmNfaXRlcnMgPCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgXAorICAgICAgICAgICAgKysgc3luY19pdGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCAodm9pZCopIG9iaiApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9IHdoaWxlICgwKQorICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSBkbyB7ICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX0VORCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggKHZvaWQqKSBvYmogKTsgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisKKyAgICAvKiBJVFQgd2lsbCBub3QgcmVwb3J0IG9iamVjdHMgY3JlYXRlZCB3aXRoaW4gS01QX0lUVF9JR05PUkUoKSwgZS4gZy46CisgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgICAgcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgICAgICAgICk7CisgICAgKi8KKyAgICAjZGVmaW5lIEtNUF9JVFRfSUdOT1JFKCBzdGF0ZW1lbnQgKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9faXR0X3N0YXRlX3QgX19pdHRfc3RhdGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV8gPSBfX2l0dF9zdGF0ZV9nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9vYmpfbW9kZV9zZXQoIF9faXR0X29ial9wcm9wX2lnbm9yZSwgX19pdHRfb2JqX3N0YXRlX3NldCApOyBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IHN0YXRlbWVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9faXR0X3N0YXRlX2dldF9wdHIgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfc3RhdGVfc2V0KCBfX2l0dF9zdGF0ZV8gKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGNvbnN0IGludCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTI7IC8vIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGRvbWFpbnMgdG8gdXNlIChtYXBzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IE9wZW5NUCByZWdpb25zIGluIHRoZSB1c2VyIHNvdXJjZSBjb2RlKS4KKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudDsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworI2Vsc2UKKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisKKyNpZiAhIEtNUF9ERUJVRworICAgIC8vIEluIHJlbGVhc2UgbW9kZSBpbmNsdWRlIGRlZmluaXRpb25zIG9mIGlubGluZSBmdW5jdGlvbnMuCisgICAgI2luY2x1ZGUgImttcF9pdHQuaW5sIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfSVRUX0gKKworI2Vsc2UgIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorLy8gSWYgVVNFX0lUVF9CVUxJRCBpcyBub3QgZW5hYmxlZCwgVVNFX0lUVF9OT1RJRlkgY2Fubm90IGJlIGVpdGhlci4KKy8vIEJ5IGRlZmluaW5nIHRoZXNlIHdlIGF2b2lkIHVucGxlYXNhbnQgaWZkZWYgdGVzdHMgaW4gbWFueSBwbGFjZXMuCisjIGRlZmluZSBLTVBfRlNZTkNfUFJFUEFSRSggICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKCAgICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKCBvYmogKSAgICAgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoICBvYmogKSAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0lUVF9JR05PUkUoc3RtdCApIGRvIHsgc3RtdCB9IHdoaWxlICgwKQorCisjIGRlZmluZSBVU0VfSVRUX0JVSUxEX0FSRyh4KQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2l0dC5pbmwKQEAgLTAsMCArMSw4NTEgQEAKKyNpZiBVU0VfSVRUX0JVSUxECisvKgorICoga21wX2l0dC5pbmwgLS0gSW5saW5lIGZ1bmN0aW9ucyBvZiBJVFQgTm90aWZ5LgorICogJFJldmlzaW9uOiA0Mjg2NiAkCisgKiAkRGF0ZTogMjAxMy0xMi0xMCAxNToxNTo1OCAtMDYwMCAoVHVlLCAxMCBEZWMgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBJbmxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgaW50byBrbXBfaXR0LmggZmlsZSBmb3IgcHJvZGljdGlvbgorLy8gYnVpbGQgKHRvIGxldCBjb21wbGlsZXIgaW5saW5lIGZ1bmN0aW9ucykgb3IgaW50byBrbXBfaXR0LmMgZmlsZSBmb3IgZGVidWcgYnVpbGQgKHRvIHJlZHVjZQorLy8gdGhlIG51bWJlciBvZiBmaWxlcyB0byByZWNvbXBpbGUgYW5kIHNhdmUgYnVpbGQgdGltZSkuCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmIEtNUF9JVFRfREVCVUcKKyAgICBleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaXR0X2RlYnVnX2xvY2s7CisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX0xPQ0soKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfaXR0X2RlYnVnX2xvY2sgKTsgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19QUklOVCggLi4uICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIjJTAyZDogIiwgX19rbXBfZ2V0X2d0aWQoKSApOyAgICAgICAgICAgICAgXAorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIF9fVkFfQVJHU19fICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZmx1c2goIHN0ZGVyciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2l0dF9kZWJ1Z19sb2NrICk7ICAgICAgXAorICAgIH0KKyNlbHNlCisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX0xPQ0soKQorICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19QUklOVCggLi4uICkKKyNlbmRpZiAvLyBLTVBfSVRUX0RFQlVHCisKKy8vIEVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbnMgYXJlIHN0YXRpYyBpZiB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlCisvLyBiZWluZyBpbmxpbmVkLiBPdGhlcndpc2UgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBtb3JlIHRoYW4gb25lIGZpbGUsCisvLyBzaW5jZSB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIGRlZmluaXRpb25zLgorI2lmIEtNUF9ERUJVRworIyBkZWZpbmUgTElOS0FHRQorI2Vsc2UKKyMgZGVmaW5lIExJTktBR0Ugc3RhdGljIGlubGluZQorI2VuZGlmCisKKy8vIFpDQSBpbnRlcmZhY2UgdXNlZCBieSBJbnRlbChSKSBJbnNwZWN0b3IuIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciB1c2VzIHRoaXMKKy8vIEFQSSB0byBzdXBwb3J0IHVzZXItZGVmaW5lZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcywgYnV0IGRvZXMgbm90IHVzZSBaQ0E7CisvLyBpdCB3b3VsZCBiZSBzYWZlIHRvIHR1cm4gdGhpcyBvZmYgdW50aWwgd2lkZXIgc3VwcG9ydCBiZWNvbWVzIGF2YWlsYWJsZS4KKyNpZiBVU0VfSVRUX1pDQQorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyMgICBpZiBfX0lOVEVMX0NPTVBJTEVSID49IDEyMDAKKyMgICAgICAgdW5kZWYgX19pdHRfc3luY19hY3F1aXJlZAorIyAgICAgICB1bmRlZiBfX2l0dF9zeW5jX3JlbGVhc2luZworIyAgICAgICBkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZChhZGRyKSAgICBfX25vdGlmeV96Y19pbnRyaW5zaWMoKGNoYXIgKikic3luY19hY3F1aXJlZCIsIGFkZHIpCisjICAgICAgIGRlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZyhhZGRyKSAgIF9fbm90aWZ5X2ludHJpbnNpYygoY2hhciAqKSJzeW5jX3JlbGVhc2luZyIsIGFkZHIpCisjICAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZy4KKworICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyBzaG91bGQgYmUgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgb2YgYSB0ZWFtLiBFeGFjdCBtb21lbnQgb2YKKyAgICAgICAgICBjYWxsIGRvZXMgbm90IG1hdHRlciwgYnV0IGl0IHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIGFueSB0aHJlYWQgb2YgdGhpcyB0ZWFtIGNhbGxzCisgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZy4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIGp1c3QgYmVmb3JlIGVudGVyaW5nCisgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSByaWdodCBhZnRlciByZXR1cm5pbmcKKyAgICAgICAgICBmcm9tIHBhcmFsbGVsIHJlZ2lvbiBib2R5LgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fam9pbmVkIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0sIGFmdGVyIGFsbCB0aHJlYWRzCisgICAgICAgICAgY2FsbGVkIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQuCisKKyAgICBOb3RlOiBUaHJlYWQgd2FpdGluZyBhdCBqb2luIGJhcnJpZXIgKGFmdGVyIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQpIGNhbiBleGVjdXRlIHNvbWUgbW9yZQorICAgIHVzZXIgY29kZSAtLSBzdWNoIGEgdGhyZWFkIGNhbiBleGVjdXRlIHRhc2tzLgorCisgICAgTm90ZTogVGhlIG92ZXJoZWFkIG9mIGxvZ2dpbmcgcmVnaW9uX3N0YXJ0aW5nIGFuZCByZWdpb25fZmluaXNoZWQgaW4gZWFjaCB0aHJlYWQgaXMgdG9vIGxhcmdlLAorICAgIHNvIHRoZXNlIGNhbGxzIGFyZSBub3QgdXNlZC4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZm9ya2luZyggaW50IGd0aWQsIGludCBzZXJpYWxpemVkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIHNlcmlhbGl6ZWQgPiAxKQorI2VuZGlmCisgICAgeworICAgICAgICAvLyBUaGUgZnJhbWUgbm90aWZpY2F0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBvdXRlcm1vc3QgdGVhbXMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWRlbnRfdCAqICAgICAgICAgbG9jICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKS0+dGgudGhfaWRlbnQ7CisgICAgaWYgKGxvYykgeworICAgICAgICAvLyBVc2UgdGhlIHJlc2VydmVkXzIgZmllbGQgdG8gc3RvcmUgdGhlIGluZGV4IHRvIHRoZSByZWdpb24gZG9tYWluLgorICAgICAgICAvLyBBc3N1bWUgdGhhdCByZXNlcnZlZF8yIGNvbnRhaW5zIHplcm8gaW5pdGlhbGx5LiAgU2luY2UgemVybyBpcyBzcGVjaWFsCisgICAgICAgIC8vIHZhbHVlIGhlcmUsIHN0b3JlIHRoZSBpbmRleCBpbnRvIGRvbWFpbiBhcnJheSBpbmNyZWFzZWQgYnkgMS4KKyAgICAgICAgaWYgKGxvYy0+cmVzZXJ2ZWRfMiA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZnJhbWVfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfZnJhbWVfZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfZnJhbWVfZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2lmICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmbG9jLT5yZXNlcnZlZF8yLCAwLCBmcm0gKyAxICkpIHsKKyAgICAgICAgICAgICAgICAvLyAgICBmcm0gPSBsb2MtPnJlc2VydmVkXzIgLSAxOyAgIC8vIGdldCB2YWx1ZSBzYXZlZCBieSBvdGhlciB0aHJlYWQgZm9yIHNhbWUgbG9jCisgICAgICAgICAgICAgICAgLy99IC8vIEFDOiB0aGlzIGJsb2NrIGlzIHRvIHJlcGxhY2UgbmV4dCB1bnN5bmNocm9uaXplZCBsaW5lCisgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yID0gZnJtICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb21waWxlci1nZW5lcmF0ZWQgcmVnaW9uIGxvY2F0aW9uIGludG8gdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxmdW5jPiRvbXAkcGFyYWxsZWxAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWxAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfYmVnaW5fdjMoX19rbXBfaXR0X2RvbWFpbnNbIGZybSBdLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gaWYgaXQgaXMgbm90IDAgdGhlbiBpdCBzaG91bGQgYmUgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TCisgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfZG9tYWluc1tsb2MtPnJlc2VydmVkXzIgLSAxXSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGJlZ10gZ3RpZD0lZCwgaWR4PSVkLCBzZXJpYWxpemVkOiVkLCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yIC0gMSwgc2VyaWFsaXplZCwgbG9jICk7CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCwgaW50IGltYmFsYW5jZSwgaWRlbnRfdCAqIGxvYyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAobG9jKSB7CisgICAgICAgICAgICBpZiAobG9jLT5yZXNlcnZlZF8yID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfZnJhbWVfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfZnJhbWVfZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaXQgYmUgc3luY2hyb25pemVkPyBTZWUgdGhlIGNvbW1lbnQgaW4gX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nCisgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiA9IGZybSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJGZyYW1lQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgICAgICBpZiggaW1iYWxhbmNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyLWltYmFsYW5jZUAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworCisgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiBpdCBpcyBub3QgMCB0aGVuIGl0IHNob3VsZCBiZSA8PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2RvbWFpbnNbbG9jLT5yZXNlcnZlZF8yIC0gMV0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfZnJhbWVfc3VibWl0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZmluaXNoZWQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MgJiYgbG9jLT5yZXNlcnZlZF8yICYmIGxvYy0+cmVzZXJ2ZWRfMiA8PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X2ZyYW1lX2VuZF92MyhfX2ttcF9pdHRfZG9tYWluc1tsb2MtPnJlc2VydmVkXzIgLSAxXSwgTlVMTCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGVuZF0gZ3RpZD0lZCwgaWR4PSVkLCBzZXJpYWxpemVkOiVkLCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yIC0gMSwgc2VyaWFsaXplZCwgbG9jICk7CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fam9pbmVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQmFycmllcnMgcmVwb3J0aW5nLgorCisgICAgQSBiYXJyaWVyIGNvbnNpc3RzIG9mIHR3byBwaGFzZXM6CisKKyAgICAgICAgMS4gR2F0aGVyIC0tIG1hc3RlciB3YWl0cyBmb3IgYXJyaXZpbmcgb2YgYWxsIHRoZSB3b3JrZXIgdGhyZWFkczsgZWFjaCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgIHJlZ2lzdGVycyBhcnJpdmFsIGFuZCBnb2VzIGZ1cnRoZXIuCisgICAgICAgIDIuIFJlbGVhc2UgLS0gZWFjaCB3b3JrZXIgdGhyZWFkcyB3YWl0cyB1bnRpbCBtYXN0ZXIgbGV0cyBpdCBnbzsgbWFzdGVyIGxldHMgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgZ28uCisKKyAgICBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkOgorCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoKSAtLSBiZWZvcmUgYXJyaXZpbmcgdG8gdGhlIGdhdGhlciBwaGFzZS4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoKSAgIC0tIGJldHdlZW4gZ2F0aGVyIGFuZCByZWxlYXNlIHBoYXNlcy4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCgpIC0tIGFmdGVyIHJlbGVhc2UgcGhhc2UuCisKKyAgICBOb3RlOiBDYWxsIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpIGJlZm9yZSBjYWxsIHRvIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgYW5kIHNhdmUKKyAgICByZXN1bHQgaW4gbG9jYWwgdmFyaWFibGUuIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpLCBiZWluZyBjYWxsZWQgdG9vIGxhdGUgKGUuIGcuIGFmdGVyIGdhdGhlcgorICAgIHBoYXNlKSB3b3VsZCByZXR1cm4gaXR0IHN5bmMgb2JqZWN0IGZvciB0aGUgbmV4dCBiYXJyaWVyIQorCisgICAgSVRUIG5lZWQgYW4gYWRkcmVzcyAodm9pZCAqKSB0byBiZSBzcGVjaWZpZWQgYXMgYSBzeW5jIG9iamVjdC4gT3Blbk1QIFJUTCBkb2VzIG5vdCBoYXZlCisgICAgYmFycmllciBvYmplY3Qgb3IgYmFycmllciBkYXRhIHN0cnVjdHVyZS4gQmFycmllciBpcyBqdXN0IGEgY291bnRlciBpbiB0ZWFtIGFuZCB0aHJlYWQKKyAgICBzdHJ1Y3R1cmVzLiBXZSBjb3VsZCB1c2UgYW4gYWRkcmVzcyBvZiB0ZWFtIHN0cnVjdHVyZSBhcyBhbiBiYXJyaWVyIHN5bmMgb2JqZWN0LCBidXQgSVRUIHdhbnRzCisgICAgZGlmZmVyZW50IG9iamVjdHMgZm9yIGRpZmZlcmVudCBiYXJyaWVycyAoZXZlbiB3aGl0aGluIHRoZSBzYW1lIHRlYW0pLiBTbyBsZXQgdXMgdXNlCisgICAgdGVhbSBhZGRyZXNzIGFzIGJhcnJpZXIgc3luYyBvYmplY3QgZm9yIHRoZSBmaXJzdCBiYXJyaWVyLCB0aGVuIGluY3JlYXNlIGl0IGJ5IG9uZSBmb3IgdGhlIG5leHQKKyAgICBiYXJyaWVyLCBhbmQgc28gb24gKGJ1dCB3cmFwIGl0IG5vdCB0byB1c2UgYWRkcmVzc2VzIG91dHNpZGUgb2YgdGVhbSBzdHJ1Y3R1cmUpLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkICoKK19fa21wX2l0dF9iYXJyaWVyX29iamVjdCgKKyAgICBpbnQgIGd0aWQsCisgICAgaW50ICBidCwKKyAgICBpbnQgIHNldF9uYW1lLAorICAgIGludCAgZGVsdGEgICAgLy8gMCAoY3VycmVudCBiYXJyaWVyKSBpcyBkZWZhdWx0IHZhbHVlOyBzcGVjaWZ5IC0xIHRvIGdldCBwcmV2aW91cyBiYXJyaWVyLgorKSB7CisgICAgdm9pZCAqIG9iamVjdCA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfaW5mb190ICogICAgdGhyICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGVhbV90ICogICAgdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKworICAgIC8vIE5PVEU6CisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIF9fa21wX2ZvcmtfYmFycmllciwgdGVhbSBwb2ludGVyIGNhbiBiZSBOVUxMLiBUaGlzICJpZiIKKyAgICAvLyBoZWxwcyB0byBhdm9pZCBjcmFzaC4gSG93ZXZlciwgdGhpcyBpcyBub3QgY29tcGxldGUgc29sdXRpb24sIGFuZCByZXBvcnRpbmcgZm9yay9qb2luCisgICAgLy8gYmFycmllcnMgdG8gSVRUIHNob3VsZCBiZSByZXZpc2l0ZWQuCisKKyAgICBpZiAoIHRlYW0gIT0gTlVMTCApIHsKKworICAgICAgICAvLyBNYXN0ZXIgdGhyZWFkIGluY3JlYXNlcyBiX2Fycml2ZWQgYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCBlYWNoIHRpbWUuIERpdmlkZSBiX2Fycml2ZWQKKyAgICAgICAgLy8gYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCB0byBnZXQgcGxhaW4gYmFycmllciBjb3VudGVyLgorICAgICAgICBrbXBfdWludCBjb3VudGVyID0gdGVhbS0+dC50X2JhclsgYnQgXS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgICAgIC8vIE5vdyBmb3JtIHRoZSBiYXJyaWVyIGlkLiBFbmNvZGUgYmFycmllciB0eXBlIChidCkgaW4gYmFycmllciBpZCB0b28sIHNvIGJhcnJpZXJzIG9mCisgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBpZHMuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gMiAqIGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gTW9yZSBzdHJvbmcgY29uZGl0aW9uOiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGF0IGxlYXN0IGZvciBmb3IgdHdvIGRpZmZlcnRlbnQgaWRzCisgICAgICAgICAgICAvLyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRlYW0gKQorICAgICAgICAgICAgICAgICAgICArIGNvdW50ZXIgJSAoIHNpemVvZigga21wX3RlYW1fdCApIC8gYnNfbGFzdF9iYXJyaWVyICkgKiBic19sYXN0X2JhcnJpZXIKKyAgICAgICAgICAgICAgICAgICAgKyBidAorICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG9ial0gdHlwZT0lZCwgY291bnRlcj0lZCwgb2JqZWN0PSVwXG4iLCBidCwgY291bnRlciwgb2JqZWN0ICk7CisKKyAgICAgICAgaWYgKCBzZXRfbmFtZSApIHsKKyAgICAgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiAgICB0eXBlID0gIk9NUCBCYXJyaWVyIjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGJ0ICkgeworICAgICAgICAgICAgICAgIGNhc2UgYnNfcGxhaW5fYmFycmllciA6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHBsYWluIGJhcnJpZXIgY29tcGlsZXIgY2FsbHMgX19rbXBjX2JhcnJpZXIoKSBmdW5jdGlvbiwgd2hpY2ggc2F2ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gaW4gdGhyLT50aC50aF9pZGVudC4KKyAgICAgICAgICAgICAgICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBiYXJyaWVyIHR5cGUgZnJvbSBmbGFncyBwcm92aWRlZCBieSBjb21waWxlci4KKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICAgZXhwbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgIGltcGwgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvYyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjICA9IGxvYy0+cHNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGwgPSAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9FWFBMICkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGwgPSAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9JTVBMICkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbXBsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfRk9SIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBGb3IgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0VDVElPTlMgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFNlY3Rpb25zIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NJTkdMRSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2luZ2xlIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1dPUktTSEFSRSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgV29ya3NoYXJlIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgSW1wbGljaXQgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfTsgLyogc3dpdGNoICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGV4cGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBFeHBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgfTsgLyogaWYgKi8KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgYnNfZm9ya2pvaW5fYmFycmllciA6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBmb3JrL2pvaW4gYmFycmllciB3ZSBjYW4gcmVhZCB0aHItPnRoLnRoX2lkZW50LCBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5zIGxvY2F0aW9uIG9mIGxhc3QgcGFzc2VkIGNvbnN0cnVjdCAod2hpbGUgam9pbiBiYXJyaWVyIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIG9uZSkuIFVzZSB0aF9pZGVudCBvZiBtYXN0ZXIgdGhyZWFkIGluc3RlYWQgLS0gX19rbXBfam9pbl9jYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHNhdmVzIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBQzogY2Fubm90IHJlYWQgZnJvbSBtYXN0ZXIgYmVjYXVzZSBfX2ttcF9qb2luX2NhbGwgbWF5IGJlIG5vdCBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgeWV0LCBzbyB3ZSByZWFkIHRoZSBsb2NhdGlvbiBmcm9tIHRlYW0uIFRoaXMgaXMgdGhlIHNhbWUgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vICAgIEFuZCB0ZWFtIGlzIHZhbGlkIGF0IHRoZSBlbnRlciB0byBqb2luIGJhcnJpZXIgd2hlcmUgdGhpcyBoYXBwZW5zLgorICAgICAgICAgICAgICAgICAgICBsb2MgID0gdGVhbS0+dC50X2lkZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvYyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjICA9IGxvYy0+cHNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgSm9pbiBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsIHR5cGUsIHNyYywgX19pdHRfYXR0cl9iYXJyaWVyICk7CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgX19pdHRfYXR0cl9iYXJyaWVyIClcbiIsIG9iamVjdCwgdHlwZSwgc3JjICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc3JlbCggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBtaWRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBtaWRdIHNyZWwoICVwIClcbiIsIG9iamVjdCApOworICAgIH0gZWxzZSB7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRhc2t3YWl0IHJlcG9ydGluZy4KKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZSB0YXNrd2FpdAorICAgIHN0cnVjdHVyZSwgc28gd2UgbmVlZCB0byBjb25zdHJ1Y3Qgc29tZXRoaW5nLgorCisqLworCit2b2lkICoKK19fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGludCBndGlkICkgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICBvYmplY3QgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgdm9pZCAqID4oCisgICAgICAgICAgICAgICAga21wX3VpbnRwdHJfdCggdGFza2RhdGEgKSArIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICUgc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApCisgICAgICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0CisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZygKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgICB0aHJlYWQgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBpZGVudF90IGNvbnN0ICogIGxvYyAgICAgID0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50OworICAgIGNoYXIgY29uc3QgKiAgICAgc3JjICAgICAgPSAoIGxvYyA9PSBOVUxMPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgIk9NUCBUYXNrd2FpdCIsIHNyYywgMCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc2NyZSggJXAsIFwiT01QIFRhc2t3YWl0XCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIHNyYyApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2Egc3RhXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcKKwordm9pZAorX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKAorICAgIGludCAgICAgZ3RpZCwKKyAgICB2b2lkICogIG9iamVjdAorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfZGVzdHJveSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzZGVzKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrIHJlcG9ydGluZy4KKworICAgIE9ubHkgdGhvc2UgdGFza3MgYXJlIHJlcG9ydGVkIHdoaWNoIGFyZSBleGVjdXRlZCBieSBhIHRocmVhZCBzcGlubmluZyBhdCBiYXJyaWVyIChvciB0YXNrd2FpdCkuCisgICAgU3luY2ggb2JqZWN0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gbXVzdCBiZSBiYXJyaWVyIG9mIHRhc2t3YWl0IHRoZSB0aHJlYWRzIHdhaXRpbmcgYXQuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGFza19zdGFydGluZygKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggb2JqZWN0ICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NhbmNlbCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHNrIHN0YV0gc2NhbiggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF90YXNrX2ZpbmlzaGVkKAorICAgIHZvaWQgKiBvYmplY3QgICAgIC8vIElUVCBzeW5jIG9iamVjdDogYmFycmllciBvciB0YXNrd2FpdC4KKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBlbmRdIHNwcmUoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTG9jayByZXBvcnRpbmcuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IGxvY2sgb3BlcmF0aW9uCisgICAgICAgICAgKHNldC91bnNldCkuIEl0IGlzIG5vdCBhIHJlYWwgZXZlbnQgc2hvd24gdG8gdGhlIHVzZXIgYnV0IGp1c3Qgc2V0dGluZyBhIG5hbWUgZm9yCisgICAgICAgICAgc3luY2hyb25pemF0aW9uIG9iamVjdC4gYGxvY2snIGlzIGFuIGFkZHJlc3Mgb2Ygc3luYyBvYmplY3QsIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdWxkIGJlCisgICAgICAgICAgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscy4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX3JlYWxlYXNpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1bnNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRocmVhZCBjYW5jZWxsZWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxvY2sgb3BlcmF0aW9uLiBBZnRlcgorICAgICAgICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgpIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBhZGRyZXNzIHdpbGwgYmUgY29uc2lkZXJlZAorICAgICAgICAgIGFzIGFub3RoZXIgc3luYyBvYmplY3QsIG5vdCByZWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIG9uZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbCBkaXJlY3RseS4KK19fa21wX2lubGluZQordm9pZAorX19fa21wX2l0dF9sb2NrX2luaXQoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICogdHlwZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jID0gTlVMTDsKKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMICkKKyAgICAgICAgICAgIGxvYyA9IF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKCAobG9jaykgKTsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggbG9jaywgdHlwZSwgc3JjLCAwICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbbGNrIGluaV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCAwIClcbiIsIGxvY2ssIHR5cGUsIHNyYyApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2luaXQKKworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbCBkaXJlY3RseS4KK19fa21wX2lubGluZQordm9pZAorX19fa21wX2l0dF9sb2NrX2ZpbmkoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICogdHlwZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfZGVzdHJveSggbG9jayApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbbGNrIGRzdF0gc2RlcyggJXAgKVxuIiwgbG9jayApOworI2VuZGlmCit9IC8vIF9fX2ttcF9pdHRfbG9ja19maW5pCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfbG9ja19jcmVhdGluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgTG9jayIgKTsKK30gLy8gX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcKKwordm9pZAorX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2ZpbmkoIGxvY2ssICJPTVAgTG9jayIgKTsKK30gLy8gX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ3JpdGljYWwgcmVwb3J0aW5nLgorCisgICAgQ3JpdGljYWwgc2VjdGlvbnMgYXJlIHRyZWF0ZWQgZXhhY3RseSBhcyBsb2NrcyAoYnV0IGhhdmUgZGlmZmVyZW50IG9iamVjdCB0eXBlKS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2ZpbmkoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTaW5nbGUgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X21hcmtfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICBrbXBfaW5mb190ICogICB0aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCAoZ3RpZCkgKTsKKyAgICAgICAgaWRlbnRfdCAqICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAga21wX3N0cl9idWZfdCAgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFNpbmdsZS0lcyIsIHNyYyApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgPSBfX2l0dF9tYXJrX2NyZWF0ZSggbmFtZS5zdHIgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gc3RhXSBtY3JlKCBcIiVzXCIpIC0+ICVkXG4iLCBuYW1lLnN0ciwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X21hcmsoIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlLCBOVUxMICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWFyayggJWQsIE5VTEwgKVxuIiwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9lbmQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19pdHRfbWFya190eXBlICBtYXJrID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pdHRfbWFya19zaW5nbGU7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfbWFya19vZmYoIG1hcmsgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBlbmRdIG1vZmYoICVkIClcbiIsIG1hcmsgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX2VuZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE9yZGVyZWQgcmVwb3J0aW5nLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCBpcyBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgKmJlZm9yZSogZmlyc3QgdXNpbmcgc3luYworICAgIG9iamVjdC4gSVRUIHRlYW0gd291bGQgbGlrZSBpdCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGl0IHJlcXVpcmVzIGV4dHJhIHN5bmNocm9uaXphdGlvbi4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAgaXMgY2FsbGVkIHdoZW4gdGhyZWFkIGlzIGdvaW5nIHRvIGVudGVyIG9yZGVyZWQgc2VjdGlvbgorICAgIChiZWZvcmUgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBlbnRlcmluZyB1c2VyIGNvZGUgKGFmdGVyCisgICAgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCBpcyBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdXNlciBjb2RlLgorCisgICAgU3luYyBvYmplY3QgaXMgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LgorCisgICAgRXZlbnRzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGNhc2Ugb2Ygc2VyaWFsaXplZCB0ZWFtLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfaW5pdCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSgKKyAgICAgICAgICAgIHRoci0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQsICJPTVAgT3JkZXJlZCIsIHNyYywgMAorICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfaW5pdAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2VuZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhyZWFkcyByZXBvcnRpbmcuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpIHsKKyAgICBfX2l0dF90aHJfaWdub3JlKCk7Cit9IC8vIF9fa21wX2l0dF90aHJlYWRfaWdub3JlCisKK3ZvaWQKK19fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFdvcmtlciBUaHJlYWQgIyVkIiwgZ3RpZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfdGhyX25hbWVfc2V0KCBuYW1lLnN0ciwgbmFtZS51c2VkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdGhyIG5hbV0gbmFtZSggXCIlc1wiKVxuIiwgbmFtZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF90aHJlYWRfbmFtZQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTeXN0ZW0gb2JqZWN0IHJlcG9ydGluZy4KKworICAgIElUVCBjYXRjaGVzIG9wZXJhdGlvbnMgd2l0aCBzeXN0ZW0gc3luYyBvYmplY3RzIChsaWtlIFdpbmRvd3MqIE9TIG9uIElBLTMyCisgICAgYXJjaGl0ZWN0dXJlIEFQSSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgZXZlbnRzKS4gV2Ugb25seSBuZWVkIHRvIHNwZWNpZnkKKyAgICBuYW1lICgiT01QIFNjaGVkdWxlciIpIGZvciB0aGUgb2JqZWN0IHRvIGxldCBJVFQga25vdyBpdCBpcyBhbiBvYmplY3QgdXNlZAorICAgIGJ5IE9wZW5NUCBSVEwgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgU2NoZWR1bGVyIiwgbmFtZSwgMCApOworICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzeXMgb2JqXSBzY3JlKCAlcCwgXCJPTVAgU2NoZWR1bGVyXCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIG5hbWUgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGFjayBzdGl0Y2hpbmcgYXBpLgorCisgICAgTWFzdGVyIGNhbGxzICJjcmVhdGUiIGFuZCBwdXQgdGhlIHN0aXRjaGluZyBpZCBpbnRvIHRlYW0gc3RydWN0dXJlLgorICAgIFdvcmtlcnMgcmVhZCB0aGUgc3RpdGNoaW5nIGlkIGFuZCBjYWxsICJlbnRlciIgLyAibGVhdmUiIGFwaS4KKyAgICBNYXN0ZXIgY2FsbHMgImRlc3Ryb3kiIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK19faXR0X2NhbGxlcgorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9jYWxsZXIgaWQgPSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgY3JlXSAlcFxuIiwgaWQgKTsKKyAgICByZXR1cm4gaWQ7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZGVzXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlciggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZW50XSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgbGVhXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAgYi9yYzEvcnVudGltZS9zcmMva21wX2xvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTI0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2xvY2suY3BwCkBAIC0wLDAgKzEsMzgzNCBAQAorLyoKKyAqIGttcF9sb2NrLmNwcCAtLSBsb2NrLXJlbGF0ZWQgZnVuY3Rpb25zCisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUICAgIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFICAgIDEKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZm5kZWYgS01QX0RFQlVHCisjIGRlZmluZSBfX2ttcF9zdGF0aWNfZGVsYXkoIGFyZyApICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZWxzZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX2RlbGF5KCBpbnQgYXJnICkKK3sKKy8qIFdvcmsgYXJvdW5kIHdlaXJkIGNvZGUtZ2VuIGJ1ZyB0aGF0IGNhdXNlcyBhc3NlcnQgdG8gdHJpcCAqLworIyBpZiBLTVBfQVJDSF9YODZfNjQgJiYgS01QX09TX0xJTlVYCisgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyMgZWxzZQorICAgIEtNUF9BU1NFUlQoIGFyZyA+PSAwICk7CisjIGVuZGlmCit9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfeWllbGQoIGludCBhcmcgKQoreworICAgIF9fa21wX3lpZWxkKCBhcmcgKTsKK30KKworLyogSW1wbGVtZW50IHNwaW4gbG9ja3MgZm9yIGludGVybmFsIGxpYnJhcnkgdXNlLiAgICAgICAgICAgICAqLworLyogVGhlIGFsZ29yaXRobSBpbXBsZW1lbnRlZCBpcyBMYW1wb3J0J3MgYmFrZXJ5IGxvY2sgWzE5NzRdLiAqLworCit2b2lkCitfX2ttcF92YWxpZGF0ZV9sb2Nrcyggdm9pZCApCit7CisgICAgaW50IGk7CisgICAga21wX3VpbnQzMiAgeCwgeTsKKworICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB1bnNpZ25lZCBhcml0aG1ldGljIGRvZXMgd3JhcHMgcHJvcGVybHkgKi8KKyAgICB4ID0gfigoa21wX3VpbnQzMikgMCkgLSAyOworICAgIHkgPSB4IC0gMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2ksICsreCwgKyt5KSB7CisgICAgICAgIGttcF91aW50MzIgeiA9ICh4IC0geSk7CisgICAgICAgIEtNUF9BU1NFUlQoIHogPT0gMiApOworICAgIH0KKworICAgIEtNUF9BU1NFUlQoIG9mZnNldG9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2ssIHRhaWxfaWQgKSAlIDggPT0gMCApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGVzdCBhbmQgc2V0IGxvY2tzICovCisKKy8vCisvLyBGb3IgdGhlIG5vbi1uZXN0ZWQgbG9ja3MsIHdlIGNhbiBvbmx5IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCA0IGJ5dGVzIHdlcmUKKy8vIGFsbG9jYXRlZCwgc2luY2UgZ2NjIG9ubHkgYWxsb2NhdGVzIDQgYnl0ZXMgZm9yIG9tcF9sb2NrX3QsIGFuZCB0aGUgSW50ZWwKKy8vIGNvbXBpbGVyIG9ubHkgYWxsb2NhdGVzIGEgNCBieXRlIHBvaW50ZXIgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAgT24KKy8vIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgYWxsIDggYnl0ZXMgd2VyZSBhbGxvY2F0ZWQuCisvLworLy8gZ2NjIHJlc2VydmVzID49IDggYnl0ZXMgZm9yIG5lc3RlZCBsb2Nrcywgc28gd2UgY2FuIGFzc3VtZSB0aGF0IHRoZQorLy8gZW50aXJlIDggYnl0ZXMgd2VyZSBhbGxvY2F0ZWQgZm9yIG5lc3RlZCBsb2NrcyBvbiBhbGwgNjQtYml0IHBsYXRmb3Jtcy4KKy8vCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2dldF90YXNfbG9ja19vd25lcigga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLnBvbGwgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9NQigpOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGttcF91aW50MzIgY3VyciA9IFRDUl80KCBsY2stPmxrLnBvbGwgKTsKKyAgICBpZiAoICggY3VyciAhPSAwICkgJiYgKCBjdXJyICE9IGd0aWQgKyAxICkgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IDAgKQorICAgICAgJiYgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIDAsIGd0aWQgKyAxICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgIF9fa21wX3hwcm9jICkgKSB7CisgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgfQorCisgICAgd2hpbGUgKCAoIGxjay0+bGsucG9sbCAhPSAwICkgfHwKKyAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCwgZ3RpZCArIDEgKSApICkgeworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIHVzZSBleHBvbmVudGlhbCBiYWNrb2ZmIGhlcmUKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgICAgICBfX2ttcF94cHJvYyApICkgeworICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworfQorCit2b2lkCitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggKCBsY2stPmxrLnBvbGwgPT0gMCApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCwgZ3RpZCArIDEgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIEtNUF9TVF9SRUwzMiggJihsY2stPmxrLnBvbGwpLCAwICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICBfX2ttcF94cHJvYyApICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgICAgICYmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIDAgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3Rhc19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5wb2xsID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcworLy8KKwordm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgICAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgICAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90YXNfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jayggbGNrICk7Cit9CisKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZnV0ZXggbG9ja3MgKi8KKworLy8gZnV0ZXggbG9ja3MgYXJlIHJlYWxseSBqdXN0IHRlc3QgYW5kIHNldCBsb2Nrcywgd2l0aCBhIGRpZmZlcmVudCBtZXRob2QKKy8vIG9mIGhhbmRsaW5nIGNvbnRlbnRpb24uICBUaGV5IHRha2UgdGhlIHNhbWUgYW1vdW50IG9mIHNwYWNlIGFzIHRlc3QgYW5kCisvLyBzZXQgbG9ja3MsIGFuZCBhcmUgYWxsb2NhdGVkIHRoZSBzYW1lIHdheSAoaS5lLiB1c2UgdGhlIGFyZWEgYWxsb2NhdGVkIGJ5CisvLyB0aGUgY29tcGlsZXIgZm9yIG5vbi1uZXN0ZWQgbG9ja3MgLyBhbGxvY2F0ZSBuZXN0ZWQgbG9ja3Mgb24gdGhlIGhlYXApLgorCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcigga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gKCBUQ1JfNCggbGNrLT5say5wb2xsICkgPj4gMSApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKCBndGlkICsgMSApIDw8IDE7CisKKyAgICBLTVBfTUIoKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBrbXBfdWludDMyIGN1cnIgPSBUQ1JfNCggbGNrLT5say5wb2xsICk7CisgICAgaWYgKCAoIGN1cnIgIT0gMCApICYmICggY3VyciAhPSBndGlkX2NvZGUgKSApCisgICAgICAgIF9fa21wX3ByaW50ZiggIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayApOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBlbnRlcmluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIGttcF9pbnQzMiBwb2xsX3ZhbDsKKyAgICB3aGlsZSAoICggcG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCwKKyAgICAgIGd0aWRfY29kZSApICkgIT0gMCApIHsKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBwb2xsX3ZhbCAmIDE7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIHBvbGxfdmFsID0gMHgleCBjb25kID0gMHgleFxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCwgY29uZCApICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogaWYgeW91IHRyeSB0byB1c2UgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gZm9yIHRoaXMgYnJhbmNoCisgICAgICAgIC8vCisgICAgICAgIC8vIGlmICggcG9sbF92YWwgJiAxID09IDAgKQorICAgICAgICAvLworICAgICAgICAvLyBUaGVuIHRoZSAxMi4wIGNvbXBpbGVyIGhhcyBhIGJ1ZyB3aGVyZSB0aGUgZm9sbG93aW5nIGJsb2NrIHdpbGwKKyAgICAgICAgLy8gYWx3YXlzIGJlIHNraXBwZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZSBMU0Igb2YgcG9sbF92YWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBjb25kICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRyeSB0byBzZXQgdGhlIGxzYiBpbiB0aGUgcG9sbCB0byBpbmRpY2F0ZSB0byB0aGUgb3duZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCB0aGF0IHRoZXkgbmVlZCB0byB3YWtlIHRoaXMgdGhyZWFkIHVwLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoICYgKCBsY2stPmxrLnBvbGwgKSwKKyAgICAgICAgICAgICAgcG9sbF92YWwsIHBvbGxfdmFsIHwgMSApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGNhbid0IHNldCBiaXQgMFxuIiwKKyAgICAgICAgICAgICAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbGxfdmFsIHw9IDE7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGJpdCAwIHNldFxuIiwKKyAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgYmVmb3JlIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgICAgIGttcF9pbnQzMiByYzsKKyAgICAgICAgaWYgKCAoIHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUlULAorICAgICAgICAgIHBvbGxfdmFsLCBOVUxMLCBOVUxMLCAwICkgKSAhPSAwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FpdCgweCV4KSBmYWlsZWQgKHJjPSVkIGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIHJjLCBlcnJubyApICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGFmdGVyIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHRocmVhZCBoYXMgbm93IGRvbmUgYSBzdWNjZXNzZnVsIGZ1dGV4IHdhaXQgY2FsbCBhbmQgd2FzCisgICAgICAgIC8vIGVudGVyZWQgb24gdGhlIE9TIGZ1dGV4IHF1ZXVlLiAgV2UgbXVzdCBub3cgcGVyZm9ybSBhIGZ1dGV4CisgICAgICAgIC8vIHdha2UgY2FsbCB3aGVuIHJlbGVhc2luZyB0aGUgbG9jaywgYXMgd2UgaGF2ZSBubyBpZGVhIGhvdyBtYW55CisgICAgICAgIC8vIG90aGVyIHRocmVhZHMgYXJlIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgZ3RpZF9jb2RlIHw9IDE7CisgICAgfQorCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworfQorCit2b2lkCitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCAwLCAoIGd0aWQgKyAxICkgPDwgMSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGVudGVyaW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworCisgICAga21wX2ludDMyIHBvbGxfdmFsID0gS01QX1hDSEdfRklYRUQzMiggJiAoIGxjay0+bGsucG9sbCApLCAwICk7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCByZWxlYXNlZCBwb2xsX3ZhbCA9IDB4JXhcbiIsCisgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCApICk7CisKKyAgICBpZiAoIHBvbGxfdmFsICYgMSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FrZSAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkICkgKTsKKyAgICAgICAgc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUtFLCAxLCBOVUxMLCBOVUxMLCAwICk7CisgICAgfQorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgIF9fa21wX3hwcm9jICkgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAgICAgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBUQ1dfNCggbGNrLT5say5wb2xsLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgZnV0ZXggbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgICAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgICAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgICAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGxjayApOworfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRpY2tldCAoYmFrZXJ5KSBsb2NrcyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5vd25lcl9pZCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSgga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitzdGF0aWMga21wX3VpbnQzMgorX19rbXBfYmFrZXJ5X2NoZWNrKGttcF91aW50IHZhbHVlLCBrbXBfdWludCBjaGVja2VyKQoreworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgcGF1c2U7CisKKyAgICBpZiAodmFsdWUgPT0gY2hlY2tlcikgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZm9yIChwYXVzZSA9IGNoZWNrZXIgLSB2YWx1ZTsgcGF1c2UgIT0gMDsgLS1wYXVzZSkgeworICAgICAgICBfX2ttcF9zdGF0aWNfZGVsYXkoVFJVRSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0OworICAgIEtNUF9NQigpOworCisgICAgbXlfdGlja2V0ID0gS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmbGNrLT5say5uZXh0X3RpY2tldCApOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmICggVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSAhPSBteV90aWNrZXQgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfV0FJVF9ZSUVMRCggJmxjay0+bGsubm93X3NlcnZpbmcsIG15X3RpY2tldCwgX19rbXBfYmFrZXJ5X2NoZWNrLCBsY2sgKTsKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKK30KKwordm9pZAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9Cit9CisKK2ludAorX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0ID0gVENSXzQoIGxjay0+bGsubmV4dF90aWNrZXQgKTsKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBrbXBfdWludDMyIG5leHRfdGlja2V0ID0gbXlfdGlja2V0ICsgMTsKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIChrbXBfaW50MzIgKikgJmxjay0+bGsubmV4dF90aWNrZXQsCisgICAgICAgICAgbXlfdGlja2V0LCBuZXh0X3RpY2tldCApICkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQzMiAgZGlzdGFuY2U7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBkaXN0YW5jZSA9ICggVENSXzQoIGxjay0+bGsubmV4dF90aWNrZXQgKSAtIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgKTsKKworICAgIEtNUF9TVF9SRUwzMiggJihsY2stPmxrLm5vd19zZXJ2aW5nKSwgbGNrLT5say5ub3dfc2VydmluZyArIDEgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS01QX1lJRUxEKCBkaXN0YW5jZQorICAgICAgPiAoa21wX3VpbnQzMikgKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICAgICAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgVENXXzQoIGxjay0+bGsubmV4dF90aWNrZXQsIDAgKTsKKyAgICBUQ1dfNCggbGNrLT5say5ub3dfc2VydmluZywgMCApOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vIC0xID0+IG5vdCBhIG5lc3RlZCBsb2NrLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSAoa21wX3RpY2tldF9sb2NrICopbGNrOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uICAgID0gTlVMTDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHRpY2tldCBsb2NrcworLy8KKwordm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc190aWNrZXRfbG9ja19pbml0aWFsaXplZCgga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2ZsYWdzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcXVldWluZyBsb2NrcyAqLworCisvKgorICogRmlyc3QgdGhlIHN0YXRlcworICogKGhlYWQsdGFpbCkgPSAgMCwgMCAgbWVhbnMgbG9jayBpcyB1bmhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICBVSU5UX01BWCBvciAtMSwgMCAgbWVhbnMgbG9jayBpcyBoZWxkLCBub2JvZHkgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIGggIG1lYW5zIGxvY2sgaXMgaGVsZCBvciBhYm91dCB0byB0cmFuc2l0aW9uLCAxIGVsZW1lbnQgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIHQgIGggPD4gdCwgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sID4xIGVsZW1lbnRzIG9uIHF1ZXVlCisgKgorICogTm93IHRoZSB0cmFuc2l0aW9ucworICogICAgQWNxdWlyZSgwLDApICA9IC0xICwwCisgKiAgICBSZWxlYXNlKDAsMCkgID0gRXJyb3IKKyAqICAgIEFjcXVpcmUoLTEsMCkgPSAgaCAsaCAgICBoID4gMAorICogICAgUmVsZWFzZSgtMSwwKSA9ICAwICwwCisgKiAgICBBY3F1aXJlKGgsaCkgID0gIGggLHQgICAgaCA+IDAsIHQgPiAwLCBoIDw+IHQKKyAqICAgIFJlbGVhc2UoaCxoKSAgPSAtMSAsMCAgICBoID4gMAorICogICAgQWNxdWlyZShoLHQpICA9ICBoICx0JyAgIGggPiAwLCB0ID4gMCwgdCcgPiAwLCBoIDw+IHQsIGggPD4gdCcsIHQgPD4gdCcKKyAqICAgIFJlbGVhc2UoaCx0KSAgPSAgaCcsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdCwgaCA8PiBoJywgaCcgbWF5YmUgPSB0CisgKgorICogQW5kIHBpY3RvcmlhbGx5CisgKgorICoKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgMCwgMHwtLS0tLS0tIHJlbGVhc2UgLS0tLS0tLT4gRXJyb3IKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfC0xLCAwfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8IGgsIGh8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgdHwtLS0tLSBhY3F1aXJlLCByZWxlYXNlIGxvb3BiYWNrIC0tLSsKKyAqICAgICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKworLyogU3R1ZmYgZm9yIGNpcmN1bGFyIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZSBUUkFDRV9CVUZfRUxFCTEwMjQKK3N0YXRpYyBjaGFyIHRyYWNlc1tUUkFDRV9CVUZfRUxFXVsxMjhdID0geyAwIH0KK3N0YXRpYyBpbnQgdGMgPSAwOworI2RlZmluZSBUUkFDRV9MT0NLKFgsWSkgICAgICAgICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlc1xuIiwgWCwgWSApOworI2RlZmluZSBUUkFDRV9MT0NLX1QoWCxZLFopICAgICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlcyVkXG4iLCBYLFksWiApOworI2RlZmluZSBUUkFDRV9MT0NLX0hUKFgsWSxaLFEpICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlcyAlZCwlZFxuIiwgWCwgWSwgWiwgUSApOworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBoZWFkX2lkLCBrbXBfaW50MzIgdGFpbF9pZCApCit7CisgICAga21wX2ludDMyIHQsIGk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IFRSQUNFIEJFR0lOUyBIRVJFISBcbiIgKTsKKworICAgIGkgPSB0YyAlIFRSQUNFX0JVRl9FTEU7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICIlc1xuIiwgdHJhY2VzW2ldICk7CisgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB3aGlsZSAoIGkgIT0gKHRjICUgVFJBQ0VfQlVGX0VMRSkgKSB7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXMiLCB0cmFjZXNbaV0gKTsKKyAgICAgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB9CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBndGlkKzE6JWQsIHNwaW5faGVyZTolZCwgbmV4dF93YWl0OiVkLCBoZWFkX2lkOiVkLCB0YWlsX2lkOiVkXG4iLAorICAgICAgICAgICAgIGd0aWQrMSwgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSwgdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZywKKyAgICAgICAgICAgICBoZWFkX2lkLCB0YWlsX2lkICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlx0XHRoZWFkOiAlZCAiLCBsY2stPmxrLmhlYWRfaWQgKTsKKworICAgIGlmICggbGNrLT5say5oZWFkX2lkID49IDEgKSB7CisgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW2xjay0+bGsuaGVhZF9pZC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiLT4gJWQgIiwgdCApOworICAgICAgICAgICAgdCA9IF9fa21wX3RocmVhZHNbdC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkICk7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcblxuIiApOworfQorCisjZW5kaWYgLyogREVCVUdfUVVFVUlOR19MT0NLUyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworLyogQWNxdWlyZSBhIGxvY2sgdXNpbmcgYSB0aGUgcXVldWluZyBsb2NrIGltcGxlbWVudGF0aW9uICovCit0ZW1wbGF0ZSA8Ym9vbCB0YWtlVGltZT4KKy8qIFtUTFddIFRoZSB1bnVzZWQgdGVtcGxhdGUgYWJvdmUgaXMgbGVmdCBiZWhpbmQgYmVjYXVzZSBvZiB3aGF0IEJFQiBiZWxpZXZlcyBpcyBhCisgICBwb3RlbnRpYWwgY29tcGlsZXIgcHJvYmxlbSB3aXRoIF9fZm9yY2VpbmxpbmUuICovCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICpoZWFkX2lkX3AgICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKnRhaWxfaWRfcCAgID0gJiBsY2stPmxrLnRhaWxfaWQ7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3Bpbl9oZXJlX3A7CisgICAga21wX2ludDMyIG5lZWRfbWYgPSAxOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBlbnRlcmluZ1xuIiwgbGNrLCBndGlkICkpOworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBzcGluX2hlcmVfcCA9ICYgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZW50IiApOworICAgIGlmICggKnNwaW5faGVyZV9wICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgIT0gMCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhKnNwaW5faGVyZV9wICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3QucmVsIHRvIHNwaW5faGVyZV9wIG5lZWRzIHRvIHByZWNlZGUgdGhlIGNtcHhjaGcuYWNxIHRvIGhlYWRfaWRfcAorICAgICAgIHRoYXQgbWF5IGZvbGxvdywgbm90IGp1c3QgaW4gZXhlY3V0aW9uIG9yZGVyLCBidXQgYWxzbyBpbiB2aXNpYmlsaXR5IG9yZGVyLiAgVGhpcyB3YXksCisgICAgICAgd2hlbiBhIHJlbGVhc2luZyB0aHJlYWQgb2JzZXJ2ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHF1ZXVlIGJ5IHRoaXMgdGhyZWFkLCBpdCBjYW4KKyAgICAgICByaWdodGx5IGFzc3VtZSB0aGF0IHNwaW5faGVyZV9wIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIFRSVUUsIHNvIHRoYXQgd2hlbiBpdCBzZXRzCisgICAgICAgc3Bpbl9oZXJlX3AgdG8gRkFMU0UsIGl0IGlzIG5vdCBwcmVtYXR1cmUuICBJZiB0aGUgcmVsZWFzaW5nIHRocmVhZCBzZXRzIHNwaW5faGVyZV9wCisgICAgICAgdG8gRkFMU0UgYmVmb3JlIHRoaXMgdGhyZWFkIHNldHMgaXQgdG8gVFJVRSwgdGhpcyB0aHJlYWQgd2lsbCBoYW5nLgorICAgICovCisgICAgKnNwaW5faGVyZV9wID0gVFJVRTsgIC8qIGJlZm9yZSBlbnF1ZXVpbmcgdG8gcHJldmVudCByYWNlICovCisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGVucXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICAgICAgc3dpdGNoICggaGVhZCApIHsKKworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHRhaWwgPSAwOyAgLyogdG8gbWFrZSBzdXJlIG5leHQgbGluayBhc3luY2hyb25vdXNseSByZWFkIGlzIG5vdCBzZXQgYWNjaWRlbnRhbGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBhc3NpZ25tZW50IHByZXZlbnRzIHVzIGZyb20gZW50ZXJpbmcgdGhlIGlmICggdCA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uIGluIHRoZSBlbnF1ZXVlZCBjYXNlIGJlbG93LCB3aGljaCBpcyBub3QgbmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uICovCisKKyAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAvKiB0cnkgKC0xLDApLT4odGlkLHRpZCkgKi8KKyAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSB0YWlsX2lkX3AsCisgICAgICAgICAgICAgICAgICBLTVBfUEFDS182NCggLTEsIDAgKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBndGlkKzEsIGd0aWQrMSApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6ICgtMSwwKS0+KHRpZCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YWlsICE9IGd0aWQgKyAxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKCB0YWlsID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpIG9yIChoLGgpLT4oaCx0aWQpICovCisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCB0YWlsX2lkX3AsIHRhaWwsIGd0aWQrMSApOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6IChoLHQpLT4oaCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMDogLyogZW1wdHkgcXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3JhYmJlZF9sb2NrOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiB0cnkgKDAsMCktPigtMSwwKSAqLworCisgICAgICAgICAgICAgICAgLyogb25seSBsZWdhbCB0cmFuc2l0aW9uIG91dCBvZiBoZWFkID0gMCBpcyBoZWFkID0gLTEgd2l0aCBubyBjaGFuZ2UgdG8gdGFpbCAqLworICAgICAgICAgICAgICAgIGdyYWJiZWRfbG9jayA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggaGVhZF9pZF9wLCAwLCAtMSApOworCisgICAgICAgICAgICAgICAgaWYgKCBncmFiYmVkX2xvY2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgKnNwaW5faGVyZV9wID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBubyBxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIGV4aXQ6ICIsIGhlYWQsIDAgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8qIGxvY2sgaG9sZGVyIGNhbm5vdCBiZSBvbiBxdWV1ZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGVucXVldWVkICkgeworICAgICAgICAgICAgaWYgKCB0YWlsID4gMCApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0YWlsX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIHRhaWwgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdGFpbF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRhaWxfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSBndGlkKzE7CisgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyB3YWl0IGZvciB0aGlzIHdyaXRlIGluIHJlbGVhc2UgY29kZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCB3YWl0aW5nIGZvciBsb2NrXG4iLCBsY2ssIGd0aWQgKSk7CisKKworICAgICAgICAgICAgLyogVG9EbzogTWF5IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgX19rbXBfd2FpdF9zbGVlcCAgb3Igc29tZXRoaW5nIHRoYXQgc2xlZXBzIGZvcgorICAgICAgICAgICAgICogICAgICAgdGhyb3VnaHB1dCBvbmx5IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoc3Bpbl9oZXJlX3AsIEZBTFNFLCBLTVBfRVEsIGxjayk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3Egc3BpbiIgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciB3YWl0aW5nIG9uIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBleGl0IDIiICk7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIGdvdCBsb2NrLCB3ZSB3ZXJlIGRlcXVldWVkIGJ5IHRoZSB0aHJlYWQgdGhhdCByZWxlYXNlZCBsb2NrICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBZaWVsZCBpZiBudW1iZXIgb2YgdGhyZWFkcyA+IG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgKi8KKyAgICAgICAgLyogVG9EbzogTm90IHN1cmUgd2h5IHRoaXMgc2hvdWxkIG9ubHkgYmUgaW4gb3ZlcnN1YnNjcmlwdGlvbiBjYXNlLAorICAgICAgICAgICBtYXliZSBzaG91bGQgYmUgdHJhZGl0aW9uYWwgWUlFTERfSU5JVC9ZSUVMRF9XSEVOIGxvb3AgKi8KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgICAgIF9fa21wX3hwcm9jICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfQorICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKK30KKwordm9pZAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KK30KKworaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgKmhlYWRfaWRfcCAgPSAmIGxjay0+bGsuaGVhZF9pZDsKKyAgICBrbXBfaW50MzIgaGVhZDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZW50ZXJpbmdcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgdGhpc190aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisjZW5kaWYKKworICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisgICAgaWYgKCBoZWFkID09IDAgKSB7IC8qIG5vYm9keSBvbiBxdWV1ZSwgbm9ib2R5IGhvbGRpbmcgKi8KKworICAgICAgICAvKiB0cnkgKDAsMCktPigtMSwwKSAqLworCisgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCBoZWFkX2lkX3AsIDAsIC0xICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiBob2xkaW5nIGxvY2tcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZXhpdGluZzogd2l0aG91dCBsb2NrXG4iLCBndGlkICkpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqdGhpc190aHI7CisgICAgdm9sYXRpbGUga21wX2ludDMyICpoZWFkX2lkX3AgPSAmIGxjay0+bGsuaGVhZF9pZDsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgKnRhaWxfaWRfcCA9ICYgbGNrLT5say50YWlsX2lkOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBlbnRlcmluZ1xuIiwgbGNrLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworICAgIHRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGVudCIgKTsKKworICAgIGlmICggdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKworICAgIHdoaWxlKCAxICkgeworICAgICAgICBrbXBfaW50MzIgZGVxdWV1ZWQ7CisgICAgICAgIGttcF9pbnQzMiBoZWFkOworICAgICAgICBrbXBfaW50MzIgdGFpbDsKKworICAgICAgICBoZWFkID0gKmhlYWRfaWRfcDsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgInJlbCByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisgICAgICAgIGlmICggaGVhZCA9PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkICE9IDAgKTsgLyogaG9sZGluZyB0aGUgbG9jaywgaGVhZCBtdXN0IGJlIC0xIG9yIHF1ZXVlIGhlYWQgKi8KKworICAgICAgICBpZiAoIGhlYWQgPT0gLTEgKSB7IC8qIG5vYm9keSBvbiBxdWV1ZSAqLworCisgICAgICAgICAgICAvKiB0cnkgKC0xLDApLT4oMCwwKSAqLworICAgICAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoIGhlYWRfaWRfcCwgLTEsIDAgKSApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IHF1ZXVlIGVtcHR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgInJlbCBleGl0OiAiLCAwLCAwICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXF1ZXVlZCA9IEZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgaWYgKCBoZWFkID09IHRhaWwgKSB7ICAvKiBvbmx5IG9uZSB0aHJlYWQgb24gdGhlIHF1ZXVlICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCxoKS0+KC0xLDApICovCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQoIChrbXBfaW50NjQgKikgdGFpbF9pZF9wLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGhlYWQsIGhlYWQgKSwgS01QX1BBQ0tfNjQoIC0xLCAwICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsaCktPigtMSwwKSIgKTsKKyNlbmRpZgorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfaW50MzIgKndhaXRpbmdfaWRfcDsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgICAgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgd2FpdGluZ19pZF9wID0gJiBoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nOworCisgICAgICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkID4gMCAmJiB0YWlsID4gMCApOworCisgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpLT4oaCcsdCkgb3IgKHQsdCkgKi8KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBlbnF1ZXVpbmcgdGhyZWFkIGhhcyB0aW1lIHRvIHVwZGF0ZSBuZXh0IHdhaXRpbmcgdGhyZWFkIGZpZWxkICovCisgICAgICAgICAgICAgICAgKmhlYWRfaWRfcCA9IChrbXBfaW50MzIpIEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludCopIHdhaXRpbmdfaWRfcCwgMCwgS01QX05FUSwgTlVMTCk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBkZXE6IChoLHQpLT4oaCcsdCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZXF1ZXVlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlcXVldWVkICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqaGVhZF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBoZWFkIC0gMSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZF90aHIgIT0gTlVMTCApOworCisgICAgICAgICAgICAvKiBEb2VzIHRoaXMgcmVxdWlyZSBzeW5jaHJvbm91cyByZWFkcz8gKi8KKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBpZiAoIGhlYWQgPD0gMCB8fCB0YWlsIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkID4gMCAmJiB0YWlsID4gMCApOworCisgICAgICAgICAgICAvKiBGb3IgY2xlYW4gY29kZSBvbmx5LgorICAgICAgICAgICAgICogVGhyZWFkIG5vdCByZWxlYXNlZCB1bnRpbCBuZXh0IHN0YXRlbWVudCBwcmV2ZW50cyByYWNlIHdpdGggYWNxdWlyZSBjb2RlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gMDsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLX1QoIGd0aWQrMSwgInJlbCBudz0wIGZvciB0PSIsIGhlYWQgKTsKKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgIC8qIHJlc2V0IHNwaW4gdmFsdWUgKi8KKyAgICAgICAgICAgIGhlYWRfdGhyLT50aC50aF9zcGluX2hlcmUgPSBGQUxTRTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciBkZXF1ZXVpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBleGl0IDIiICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvKiBLTVBfQ1BVX1BBVVNFKCApOyAgZG9uJ3Qgd2FudCB0byBtYWtlIHJlbGVhc2luZyB0aHJlYWQgaG9sZCB1cCBhY3F1aXJpbmcgdGhyZWFkcyAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgcmV0cnkiICk7CisjZW5kaWYKKworICAgIH0gLyogd2hpbGUgKi8KKyAgICBLTVBfQVNTRVJUMiggMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgICAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5oZWFkX2lkID0gMDsKKyAgICBsY2stPmxrLnRhaWxfaWQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfcXVldWluZ19sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLmhlYWRfaWQgPSAwOworICAgIGxjay0+bGsudGFpbF9pZCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHF1ZXVpbmcgbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlPGZhbHNlPiggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbigga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbigga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9xdWV1aW5nX2xvY2tfZmxhZ3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8qCisgICAgUlRNIEFkYXB0aXZlIGxvY2tzCisqLworCisvLyBUT0RPOiBVc2UgdGhlIGhlYWRlciBmb3IgaW50cmluc2ljcyBiZWxvdyB3aXRoIHRoZSBjb21waWxlciAxMy4wCisvLyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKworLy8gVmFsdWVzIGZyb20gdGhlIHN0YXR1cyByZWdpc3RlciBhZnRlciBmYWlsZWQgc3BlY3VsYXRpb24uCisjZGVmaW5lIF9YQkVHSU5fU1RBUlRFRCAgICAgICAgICAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgX1hBQk9SVF9SRVRSWSAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIF9YQUJPUlRfQ09ORkxJQ1QgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgX1hBQk9SVF9ERUJVRyAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIF9YQUJPUlRfTkVTVEVEICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgoKHgpID4+IDI0KSAmIDB4RkYpKQorCisvLyBBYm9ydHMgZm9yIHdoaWNoIGl0J3Mgd29ydGggdHJ5aW5nIGFnYWluIGltbWVkaWF0ZWx5CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2RlZmluZSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKSAjYXJnCisjZGVmaW5lIFNUUklOR0laRShhcmcpIFNUUklOR0laRV9JTlRFUk5BTChhcmcpCisKKy8vIEFjY2VzcyB0byBSVE0gaW5zdHJ1Y3Rpb25zCisKKy8qCisgIEEgdmVyc2lvbiBvZiBYQmVnaW4gd2hpY2ggcmV0dXJucyAtMSBvbiBzcGVjdWxhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiBFQVggb24gYW4gYWJvcnQuCisgIFRoaXMgaXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgY29tcGlsZXIgaW50cmluc2ljIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXQgc29tZSBwb2ludC4KKyovCitzdGF0aWMgX19pbmxpbmUgaW50IF94YmVnaW4oKQoreworICAgIGludCByZXMgPSAtMTsKKworI2lmIEtNUF9PU19XSU5ET1dTCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgICAgfQorI2Vsc2UgLyogSUEzMiAqLworICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNlbHNlCisgICAgLyogTm90ZSB0aGF0ICVlYXggbXVzdCBiZSBub3RlZCBhcyBraWxsZWQgKGNsb2JiZXJlZCksIGJlY2F1c2UKKyAgICAgKiB0aGUgWFNSIGlzIHJldHVybmVkIGluICVlYXgoJXJheCkgb24gYWJvcnQuICBPdGhlciByZWdpc3RlcgorICAgICAqIHZhbHVlcyBhcmUgcmVzdG9yZWQsIHNvIGRvbid0IG5lZWQgdG8gYmUga2lsbGVkLgorICAgICAqCisgICAgICogV2UgbXVzdCBhbHNvIG1hcmsgJ3JlcycgYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgc2luY2Ugb3RoZXJ3aXNlCisgICAgICogJ3Jlcz0tMScgbWF5IGJlIGRyb3BwZWQgYXMgYmVpbmcgZGVhZCwgd2hlcmVhcyB3ZSBkbyBuZWVkIHRoZQorICAgICAqIGFzc2lnbm1lbnQgb24gdGhlIHN1Y2Nlc3NmdWwgKGkuZS4sIG5vbi1hYm9ydCkgcGF0aC4KKyAgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiMTogLmJ5dGUgIDB4Qzc7IC5ieXRlIDB4Rjg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nICAxZi0xYi02XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBqbXAgICAyZlxuIgorICAgICAgICAgICAgICAgICAgICAgICIxOiAgbW92bCAgJSVlYXgsJTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMjoiCisgICAgICAgICAgICAgICAgICAgICAgOiIrciIocmVzKTo6Im1lbW9yeSIsIiVlYXgiKTsKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgIHJldHVybiByZXM7Cit9CisKKy8qCisgIFRyYW5zYWN0aW9uIGVuZAorKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF94ZW5kKCkKK3sKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIF9fYXNtICB7CisgICAgICAgIF9lbWl0IDB4MGYKKyAgICAgICAgX2VtaXQgMHgwMQorICAgICAgICBfZW1pdCAweGQ1CisgICAgfQorI2Vsc2UKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHgwZjsgLmJ5dGUgMHgwMTsgLmJ5dGUgMHhkNSIgOjo6Im1lbW9yeSIpOworI2VuZGlmCit9CisKKy8qCisgIFRoaXMgaXMgYSBtYWNybywgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzaW5nbGUgYnl0ZSBjb25zdGFudCB3aGljaAorICBjYW4gYmUgZXZhbHVhdGVkIGJ5IHRoZSBpbmxpbmUgYXNzZW1ibGVyLCBzaW5jZSBpdCBpcyBlbWl0dGVkIGFzIGEKKyAgYnl0ZSBpbnRvIHRoZSBhc3NlbWJseSBjb2RlLgorKi8KKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBfeGFib3J0KEFSRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhjNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgQVJHCisjZWxzZQorI2RlZmluZSBfeGFib3J0KEFSRykgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweEM2OyAuYnl0ZSAweEY4OyAuYnl0ZSAiIFNUUklOR0laRShBUkcpIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorCisvLworLy8gICAgU3RhdGlzdGljcyBpcyBjb2xsZWN0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZQorLy8KKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworLy8gV2UgYWNjdW11bGF0ZSBzcGVjdWxhdGl2ZSBsb2NrIHN0YXRpc3RpY3Mgd2hlbiB0aGUgbG9jayBpcyBkZXN0cm95ZWQuCisvLyBXZSBrZWVwIGxvY2tzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlc3Ryb3llZCBpbiB0aGUgbGl2ZUxvY2tzIGxpc3QKKy8vIHNvIHRoYXQgd2UgY2FuIGdyYWIgdGhlaXIgc3RhdGlzdGljcyB0b28uCitzdGF0aWMga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IGRlc3Ryb3llZFN0YXRzOworCisvLyBUbyBob2xkIHRoZSBsaXN0IG9mIGxpdmUgbG9ja3MuCitzdGF0aWMga21wX2FkYXB0aXZlX2xvY2tfdCBsaXZlTG9ja3M7CisKKy8vIEEgbG9jayBzbyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0aGUgbGlzdCBvZiBsb2Nrcy4KK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBjaGFpbl9sb2NrOworCisvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIHN0YXRzLgordm9pZAorX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAga21wX2FkYXB0aXZlX2xvY2sgKmxjayA9ICZsaXZlTG9ja3M7CisKKyAgICBtZW1zZXQoICggdm9pZCAqICkgJiAoIGxjay0+c3RhdHMgKSwgMCwgc2l6ZW9mKCBsY2stPnN0YXRzICkgKTsKKyAgICBsY2stPnN0YXRzLm5leHQgPSBsY2s7CisgICAgbGNrLT5zdGF0cy5wcmV2ID0gbGNrOworCisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5uZXh0LT5zdGF0cy5wcmV2ID09IGxjayApOworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2sgKTsKKworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7CisKK30KKworLy8gSW5zZXJ0IHRoZSBsb2NrIGludG8gdGhlIGNpcmN1bGFyIGxpc3QKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1lbWJlcl9sb2NrKCBrbXBfYWRhcHRpdmVfbG9jayAqIGxjayApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIGxjay0+c3RhdHMubmV4dCA9IGxpdmVMb2Nrcy5zdGF0cy5uZXh0OworICAgIGxjay0+c3RhdHMucHJldiA9ICZsaXZlTG9ja3M7CisKKyAgICBsaXZlTG9ja3Muc3RhdHMubmV4dCA9IGxjazsKKyAgICBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgID0gbGNrOworCisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5uZXh0LT5zdGF0cy5wcmV2ID09IGxjayApOworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mb3JnZXRfbG9jaygga21wX2FkYXB0aXZlX2xvY2sgKiBsY2sgKQoreworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9jayAqIG4gPSBsY2stPnN0YXRzLm5leHQ7CisgICAga21wX2FkYXB0aXZlX2xvY2sgKiBwID0gbGNrLT5zdGF0cy5wcmV2OworCisgICAgbi0+c3RhdHMucHJldiA9IHA7CisgICAgcC0+c3RhdHMubmV4dCA9IG47Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9jayAqIGxjayApCit7CisgICAgbWVtc2V0KCAoIHZvaWQgKiApJmxjay0+c3RhdHMsIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgX19rbXBfcmVtZW1iZXJfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hZGRfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqIHQsIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBsY2sgKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSAqcyA9ICZsY2stPnN0YXRzOworCisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgKz0gbGNrLT5hY3F1aXJlX2F0dGVtcHRzOworICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKz0gcy0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9ucyArPSBzLT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKz0gcy0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICB0LT5sZW1taW5nWWllbGRzICAgICAgICAgICs9IHMtPmxlbW1pbmdZaWVsZHM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9jayAqIGxjaykKK3sKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmZGVzdHJveWVkU3RhdHM7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgX19rbXBfYWRkX3N0YXRzKCAmZGVzdHJveWVkU3RhdHMsIGxjayApOworICAgIF9fa21wX2ZvcmdldF9sb2NrKCBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyBmbG9hdAorcGVyY2VudCAoa21wX3VpbnQzMiBjb3VudCwga21wX3VpbnQzMiB0b3RhbCkKK3sKKyAgICByZXR1cm4gKHRvdGFsID09IDApID8gMC4wOiAoMTAwLjAgKiBjb3VudCkvdG90YWw7Cit9CisKK3N0YXRpYworRklMRSAqIF9fa21wX29wZW5fc3RhdHNfZmlsZSgpCit7CisgICAgaWYgKHN0cmNtcCAoX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCAiLSIpID09IDApCisgICAgICAgIHJldHVybiBzdGRvdXQ7CisKKyAgICBzaXplX3QgYnVmZkxlbiA9IHN0cmxlbiggX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICkgKyAyMDsKKyAgICBjaGFyIGJ1ZmZlcltidWZmTGVuXTsKKyAgICBzbnByaW50ZiAoJmJ1ZmZlclswXSwgYnVmZkxlbiwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCBnZXRwaWQoKSk7CisgICAgRklMRSAqIHJlc3VsdCA9IGZvcGVuKCZidWZmZXJbMF0sICJ3Iik7CisKKyAgICAvLyBNYXliZSB3ZSBzaG91bGQgaXNzdWUgYSB3YXJuaW5nIGhlcmUuLi4KKyAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogc3Rkb3V0OworfQorCit2b2lkCitfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kICE9IGxrX2FkYXB0aXZlKQorICAgICAgICByZXR1cm47CisKKyAgICBGSUxFICogc3RhdHNGaWxlID0gX19rbXBfb3Blbl9zdGF0c19maWxlKCk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgdG90YWwgPSBkZXN0cm95ZWRTdGF0czsKKyAgICBrbXBfYWRhcHRpdmVfbG9jayAqbGNrOworCisgICAgZm9yIChsY2sgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsgbGNrICE9ICZsaXZlTG9ja3M7IGxjayA9IGxjay0+c3RhdHMubmV4dCkgeworICAgICAgICBfX2ttcF9hZGRfc3RhdHMoICZ0b3RhbCwgbGNrICk7CisgICAgfQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqdCA9ICZ0b3RhbDsKKyAgICBrbXBfdWludDMyIHRvdGFsU2VjdGlvbnMgICAgID0gdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiB0b3RhbFNwZWN1bGF0aW9ucyA9IHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKyB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKworICAgIGZwcmludGYgKCBzdGF0c0ZpbGUsICJTcGVjdWxhdGl2ZSBsb2NrIHN0YXRpc3RpY3MgKGFsbCBhcHByb3hpbWF0ZSEpXG4iKTsKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiIExvY2sgcGFyYW1ldGVyczogXG4iCisgICAgICAgICAgICAgIiAgIG1heF9zb2Z0X3JldHJpZXMgICAgICAgICAgICAgICA6ICUxMGRcbiIKKyAgICAgICAgICAgICAiICAgbWF4X2JhZG5lc3MgICAgICAgICAgICAgICAgICAgIDogJTEwZFxuIiwKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdHMgOiAlMTBkXG4iLCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBUb3RhbCBjcml0aWNhbCBzZWN0aW9ucyAgICAgICAgICA6ICUxMGRcbiIsIHRvdGFsU2VjdGlvbnMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3VjY2Vzc2Z1bCBzcGVjdWxhdGlvbnMgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmVzICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCBwZXJjZW50KCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTGVtbWluZyB5aWVsZHMgICAgICAgICAgICAgICAgICAgOiAlMTBkXG5cbiIsIHQtPmxlbW1pbmdZaWVsZHMgKTsKKworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzICAgICA6ICUxMGRcbiIsIHRvdGFsU3BlY3VsYXRpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTb2Z0IGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgSGFyZCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisKKyAgICBpZiAoc3RhdHNGaWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNsb3NlKCBzdGF0c0ZpbGUgKTsKK30KKworIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KSAoIGxjay0+bGsuYWRhcHRpdmUuc3RhdHMuc3RhdCsrICkKKyNlbHNlCisjIGRlZmluZSBLTVBfSU5DX1NUQVQobGNrLHN0YXQpCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGUgaGVhZF9pZCBpcyB6ZXJvLgorICAgIC8vIFdlIGRvbid0IGFsc28gbmVlZCB0byBjaGVjayB0aGUgdGFpbC4KKyAgICBib29sIHJlcyA9IGxjay0+bGsuaGVhZF9pZCA9PSAwOworCisgICAgLy8gV2UgbmVlZCBhIGZlbmNlIGhlcmUsIHNpbmNlIHdlIG11c3QgZW5zdXJlIHRoYXQgbm8gbWVtb3J5IG9wZXJhdGlvbnMKKyAgICAvLyBmcm9tIGxhdGVyIGluIHRoaXMgdGhyZWFkIGZsb2F0IGFib3ZlIHRoYXQgcmVhZC4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgX21tX21mZW5jZSgpOworI2Vsc2UKKyAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJhZG5lc3MKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgLy8gUmVzZXQgdGhlIGJhZG5lc3MgdG8gemVybyBzbyB3ZSBlYWdlcmx5IHRyeSB0byBzcGVjdWxhdGUgYWdhaW4KKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIEtNUF9JTkNfU1RBVChsY2ssc3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyk7Cit9CisKKy8vIENyZWF0ZSBhIGJpdCBtYXNrIHdpdGggb25lIG1vcmUgc2V0IGJpdC4KK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF9zdGVwX2JhZG5lc3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBrbXBfdWludDMyIG5ld0JhZG5lc3MgPSAoIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA8PCAxICkgfCAxOworICAgIGlmICggbmV3QmFkbmVzcyA+IGxjay0+bGsuYWRhcHRpdmUubWF4X2JhZG5lc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IG5ld0JhZG5lc3M7CisgICAgfQorfQorCisvLyBDaGVjayB3aGV0aGVyIHNwZWN1bGF0aW9uIHNob3VsZCBiZSBhdHRlbXB0ZWQuCitzdGF0aWMgX19pbmxpbmUgaW50CitfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgYmFkbmVzcyA9IGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzczsKKyAgICBrbXBfdWludDMyIGF0dGVtcHRzPSBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgaW50IHJlcyA9IChhdHRlbXB0cyAmIGJhZG5lc3MpID09IDA7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIG9ubHkgdGhlIHNwZWN1bGF0aXZlIGxvY2suCisvLyBEb2VzIG5vdCBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisvLworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXRyaWVzID0gbGNrLT5say5hZGFwdGl2ZS5tYXhfc29mdF9yZXRyaWVzOworCisgICAgLy8gV2UgZG9uJ3QgZXhwbGljaXRseSBjb3VudCB0aGUgc3RhcnQgb2Ygc3BlY3VsYXRpb24sIHJhdGhlciB3ZSByZWNvcmQKKyAgICAvLyB0aGUgcmVzdWx0cyAoc3VjY2VzcywgaGFyZCBmYWlsLCBzb2Z0IGZhaWwpLiBUaGUgc3VtIG9mIGFsbCBvZiB0aG9zZQorICAgIC8vIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgd2Ugc3RhcnRlZCBzcGVjdWxhdGlvbiBzaW5jZSBhbGwKKyAgICAvLyBzcGVjdWxhdGlvbnMgbXVzdCBlbmQgb25lIG9mIHRob3NlIHdheXMuCisgICAgZG8KKyAgICB7CisgICAgICAgIGttcF91aW50MzIgc3RhdHVzID0gX3hiZWdpbigpOworICAgICAgICAvLyBTd2l0Y2ggdGhpcyBpbiB0byBkaXNhYmxlIGFjdHVhbCBzcGVjdWxhdGlvbiBidXQgZXhlcmNpc2UKKyAgICAgICAgLy8gYXQgbGVhc3Qgc29tZSBvZiB0aGUgcmVzdCBvZiB0aGUgY29kZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4KKyAgICAgICAgLy8ga21wX3VpbnQzMiBzdGF0dXMgPSBfWEFCT1JUX05FU1RFRDsKKworICAgICAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCApCisgICAgICAgIHsgLyogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBzcGVjdWxhdGlvbgorICAgICAgICAgICAqIENoZWNrIHRoYXQgbm8tb25lIGFjcXVpcmVkIHRoZSBsb2NrIGZvciByZWFsIGJldHdlZW4gd2hlbiB3ZSBsYXN0IGxvb2tlZAorICAgICAgICAgICAqIGFuZCBub3cuIFRoaXMgYWxzbyBnZXRzIHRoZSBsb2NrIGNhY2hlIGxpbmUgaW50byBvdXIgcmVhZC1zZXQsCisgICAgICAgICAgICogd2hpY2ggd2UgbmVlZCBzbyB0aGF0IHdlJ2xsIGFib3J0IGlmIGFueW9uZSBsYXRlciBjbGFpbXMgaXQgZm9yIHJlYWwuCisgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoISBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGxjayApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2NrIGlzIG5vdyB2aXNpYmx5IGFjcXVpcmVkLCBzbyBzb21lb25lIGJlYXQgdXMgdG8gaXQuCisgICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIHRyYW5zYWN0aW9uIHNvIHdlJ2xsIHJlc3RhcnQgZnJvbSBfeGJlZ2luIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgX3hhYm9ydCgweDAxKQorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOyAgIC8vIExvY2sgaGFzIGJlZW4gYWNxdWlyZWQgKHNwZWN1bGF0aXZlbHkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGFib3J0ZWQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAgICAgICAgaWYgKCBzdGF0dXMgJiBTT0ZUX0FCT1JUX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxzb2Z0RmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBhbmQgbG9vcCByb3VuZCB0byByZXRyeS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGhhcmRGYWlsZWRTcGVjdWxhdGlvbnMpOworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgaWYgd2UgaGFkIGEgaGFyZCBmYWlsdXJlLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgd2hpbGUoIHJldHJpZXMtLSApOyAvLyBMb29wIHdoaWxlIHdlIGhhdmUgcmV0cmllcywgYW5kIGRpZG4ndCBmYWlsIGhhcmQuCisKKyAgICAvLyBFaXRoZXIgd2UgaGFkIGEgaGFyZCBmYWlsdXJlIG9yIHdlIGRpZG4ndCBzdWNjZWVkIHNvZnRseSBhZnRlcgorICAgIC8vIHRoZSBmdWxsIHNldCBvZiBhdHRlbXB0cywgc28gYmFjayBvZmYgdGhlIGJhZG5lc3MuCisgICAgX19rbXBfc3RlcF9iYWRuZXNzKCBsY2sgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBzcGVjdWxhdGl2ZSBsb2NrLCBvciBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIG9uZQorLy8gaWYgdGhlIHNwZWN1bGF0aXZlIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLgorLy8gV2UgY2FuIHN1Y2NlZWQgc3BlY3VsYXRpdmVseSwgbm9uLXNwZWN1bGF0aXZlbHksIG9yIGZhaWwuCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8gRmlyc3QgdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseQorICAgIGlmICggX19rbXBfc2hvdWxkX3NwZWN1bGF0ZSggbGNrLCBndGlkICkgJiYgX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGxjaywgZ3RpZCApICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBTcGVjdWxhdGl2ZSBhY3F1aXNpdGlvbiBmYWlsZWQsIHNvIHRyeSB0byBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzKys7CisKKyAgICAvLyBVc2UgYmFzZSwgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisgICAgaWYgKCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICkgKQorICAgIHsKKyAgICAgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzKTsKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgIC8vIExvY2sgaXMgYWNxdWlyZWQgKG5vbi1zcGVjdWxhdGl2ZWx5KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsgICAgICAgLy8gRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGl0J3MgYWxyZWFkeSB2aXNpYmx5IGxvY2tlZC4KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgcmV0dmFsICkgeworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vIEJsb2NrIHVudGlsIHdlIGNhbiBhY3F1aXJlIGEgc3BlY3VsYXRpdmUsIGFkYXB0aXZlIGxvY2suCisvLyBXZSBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBiZSB0cnlpbmcgdG8gc3BlY3VsYXRlLgorLy8gSWYgd2Ugc2hvdWxkIGJlLCB3ZSBjaGVjayB0aGUgcmVhbCBsb2NrIHRvIHNlZSBpZiBpdCBpcyBmcmVlLAorLy8gYW5kLCBpZiBub3QsIHBhdXNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGl0IHVudGlsIGl0IGlzLgorLy8gVGhlbiB3ZSB0cnkgdGhlIHNwZWN1bGF0aXZlIGFjcXVpcmUuCisvLyBUaGlzIG1lYW5zIHRoYXQgYWx0aG91Z2ggd2Ugc3VmZmVyIGZyb20gbGVtbWluZ3MgYSBsaXR0bGUgKAorLy8gYmVjYXVzZSBhbGwgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5IHVudGlsCisvLyB0aGUgcXVldWUgb2YgdGhyZWFkcyB3YWl0aW5nIGhhcyBjbGVhcmVkKSwgd2UgZG9uJ3QgZ2V0IGludG8gYQorLy8gc3RhdGUgd2hlcmUgd2UgY2FuIG5ldmVyIGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSAoYmVjYXVzZSB3ZQorLy8gZm9yY2UgdGhlIHF1ZXVlIHRvIGNsZWFyIGJ5IHByZXZlbnRpbmcgbmV3IGFycml2YWxzIGZyb20gZW50ZXJpbmcgdGhlCisvLyBxdWV1ZSkuCisvLyBUaGlzIGRvZXMgbWVhbiB0aGF0IHdoZW4gd2UncmUgdHJ5aW5nIHRvIGJyZWFrIGxlbW1pbmdzLCB0aGUgbG9jaworLy8gaXMgbm8gbG9uZ2VyIGZhaXIuIEhvd2V2ZXIgT3Blbk1QIG1ha2VzIG5vIGd1YXJhbnRlZSB0aGF0IGl0cworLy8gbG9ja3MgYXJlIGZhaXIsIHNvIHRoaXMgaXNuJ3QgYSByZWFsIHByb2JsZW0uCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGxjaywgZ3RpZCApICkKKyAgICB7CisgICAgICAgIGlmICggX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBsY2sgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGxjayAsIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLy8gV2UgdHJpZWQgc3BlY3VsYXRpb24gYW5kIGZhaWxlZCwgc28gZ2l2ZSB1cC4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IHRyeSBzcGVjdWxhdGlvbiB1bnRpbCB0aGUgbG9jayBpcyBmcmVlLCBzbyB3ZQorICAgICAgICAgICAgLy8gcGF1c2UgaGVyZSAod2l0aG91dCBzdXNwZW5kaW5nIG9uIHRoZSBxdWV1ZWluZyBsb2NrLAorICAgICAgICAgICAgLy8gdG8gYWxsb3cgaXQgdG8gZHJhaW4sIHRoZW4gdHJ5IGFnYWluLgorICAgICAgICAgICAgLy8gQWxsIG90aGVyIHRocmVhZHMgd2lsbCBhbHNvIHNlZSB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgICAgICAvLyBzaG91bGRTcGVjdWxhdGUsIHNvIHdpbGwgYmUgZG9pbmcgdGhlIHNhbWUgaWYgdGhleQorICAgICAgICAgICAgLy8gdHJ5IHRvIGNsYWltIHRoZSBsb2NrIGZyb20gbm93IG9uLgorICAgICAgICAgICAgd2hpbGUgKCAhIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggbGNrICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssbGVtbWluZ1lpZWxkcyk7CisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQgKFRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzKys7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxGQUxTRT4oIGxjaywgZ3RpZCApOworICAgIC8vIFdlIGhhdmUgYWNxdWlyZWQgdGhlIGJhc2UgbG9jaywgc28gY291bnQgdGhhdC4KKyAgICBLTVBfSU5DX1NUQVQobGNrLG5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGxjayApICkKKyAgICB7ICAgLy8gSWYgdGhlIGxvY2sgZG9lc24ndCBsb29rIGNsYWltZWQgd2UgbXVzdCBiZSBzcGVjdWxhdGluZy4KKyAgICAgICAgLy8gKE9yIHRoZSB1c2VyJ3MgY29kZSBpcyBidWdneSBhbmQgdGhleSdyZSByZWxlYXNpbmcgd2l0aG91dCBsb2NraW5nOworICAgICAgICAvLyBpZiB3ZSBoYWQgWFRFU1Qgd2UnZCBiZSBhYmxlIHRvIGNoZWNrIHRoYXQgY2FzZS4uLikKKyAgICAgICAgX3hlbmQoKTsgICAgICAgIC8vIEV4aXQgc3BlY3VsYXRpb24KKyAgICAgICAgX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2VzcyggbGNrICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLy8gU2luY2UgdGhlIGxvY2sgKmlzKiB2aXNpYmx5IGxvY2tlZCB3ZSdyZSBub3Qgc3BlY3VsYXRpbmcsCisgICAgICAgIC8vIHNvIHNob3VsZCB1c2UgdGhlIHVuZGVybHlpbmcgbG9jaydzIHJlbGVhc2Ugc2NoZW1lLgorICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzID0gMDsgLy9ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfc29mdF9yZXRyaWVzID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllczsKKyAgICBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzICAgICAgPSBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzczsKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfYWRhcHRpdmVfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKGxjayk7CisgICAgLy8gTm90aGluZyBuZWVkZWQgZm9yIHRoZSBzcGVjdWxhdGl2ZSBwYXJ0LgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEUkRQQSB0aWNrZXQgbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIkRSRFBBIiBtZWFucyBEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50NjQgdGlja2V0ID0gS01QX1RFU1RfVEhFTl9JTkM2NCgoa21wX2ludDY0ICopJmxjay0+bGsubmV4dF90aWNrZXQpOworICAgIGttcF91aW50NjQgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAgaWYgKFRDUl84KHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpICE9IHRpY2tldCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2spOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIC8vCisgICAgLy8gTm93IHNwaW4td2FpdCwgYnV0IHJlbG9hZCB0aGUgcG9sbHMgcG9pbnRlciBhbmQgbWFzaywgaW4gY2FzZSB0aGUKKyAgICAvLyBwb2xsaW5nIGFyZWEgaGFzIGJlZW4gcmVjb25maWd1cmVkLiAgVW5sZXNzIGl0IGlzIHJlY29uZmlndXJlZCwgdGhlCisgICAgLy8gcmVsb2FkcyBzdGF5IGluIEwxIGNhY2hlIGFuZCBhcmUgY2hlYXAuCisgICAgLy8KKyAgICAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggS01QX1dBSVRfWUlFTEQsIGluIGttcF9kaXNwYXRjaC5jICEhIQorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgS01QX1dBSVRfWUlFTEQgZG9lc24ndCBhbGxvdyBmb3IgbWFzaworICAgIC8vIGFuZCBwb2xsIHRvIGJlIHJlLXJlYWQgZXZlcnkgc3BpbiBpdGVyYXRpb24uCisgICAgLy8KKyAgICBrbXBfdWludDMyIHNwaW5zOworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUobGNrKTsKKyAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisgICAgd2hpbGUgKFRDUl84KHBvbGxzW3RpY2tldCAmIG1hc2tdKS5wb2xsIDwgdGlja2V0KSB7IC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgX19rbXBfc3RhdGljX2RlbGF5KFRSVUUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10dXJuYXJvdW5kKSwgdGhlbiB5aWVsZC4KKyAgICAgICAgLy8gQ1BVIFBhdXNlIGlzIGluIHRoZSBtYWNyb3MgZm9yIHlpZWxkLgorICAgICAgICAvLworICAgICAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIFJlLXJlYWQgdGhlIG1hc2sgYW5kIHRoZSBwb2xsIHBvaW50ZXIgZnJvbSB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJtYXNrIiBpcyByZWFkIGJlZm9yZSAicG9sbHMiICEhIQorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyByZWNvbmZpZ3VyZXMgdGhlIHBvbGxpbmcgYXJlYSBhbmQgdXBkYXRlcworICAgICAgICAvLyB0aGVpciB2YWx1ZXMsIGFuZCB3ZSBnZXQgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkIHBvbGxzCisgICAgICAgIC8vIHBvaW50ZXIsIHdlIGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZCBwb2xsaW5nCisgICAgICAgIC8vIGFyZWEuCisgICAgICAgIC8vCisgICAgICAgIG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBzdGFydHMgaGVyZQorICAgIC8vCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCBhY3F1aXJlZCBsb2NrICVwXG4iLAorICAgICAgdGlja2V0LCBsY2spKTsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisKKyAgICAvLworICAgIC8vIERlYWxsb2NhdGUgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBsYXN0CisgICAgLy8gdGhyZWFkIHRoYXQgY291bGQgcG9zc2libHkgYWNjZXNzIGl0LgorICAgIC8vCisgICAgLy8gVGhlID49IGNoZWNrIGlzIGluIGNhc2UgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCkgYWxsb2NhdGVkIHRoZSBjbGVhbnVwCisgICAgLy8gdGlja2V0LgorICAgIC8vCisgICAgaWYgKChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSAmJiAodGlja2V0ID49IGxjay0+bGsuY2xlYW51cF90aWNrZXQpKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlY29uZmlndXJlIHRoZSBwb2xsaW5nIGFyZWEuCisgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSB0byBiZSBkZWFsbG9jYXRlZCBmcm9tIGEKKyAgICAvLyBwcmV2aW91cyByZWNvbmZpZ3VyYXRpb24sIGxldCBhIGxhdGVyIHRocmVhZCByZWNvbmZpZ3VyZSBpdC4KKyAgICAvLworICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyA9PSBOVUxMKSB7CisgICAgICAgIGJvb2wgcmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKm9sZF9wb2xscyA9IHBvbGxzOworICAgICAgICBrbXBfdWludDMyIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKworICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIG92ZXJzdWJzY3JpcHRpb24gbW9kZS4gIENvbnRyYWN0IHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIGRvd24gdG8gYSBzaW5nbGUgbG9jYXRpb24sIGlmIHRoYXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChudW1fcG9sbHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSAxOworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAgcG9sbHNbMF0ucG9sbCA9IHRpY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdW5kZXIvZnVsbHkgc3Vic2NyaWJlZCBtb2RlLiAgQ2hlY2sgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBsb2NrLiAgVGhlIHNpemUgb2YgdGhlIHBvbGxpbmcgYXJlYQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGttcF91aW50NjQgbnVtX3dhaXRpbmcgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KSAtIHRpY2tldCAtIDE7CisgICAgICAgICAgICBpZiAobnVtX3dhaXRpbmcgPiBudW1fcG9sbHMpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG9sZF9udW1fcG9sbHMgPSBudW1fcG9sbHM7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgbnVtX3BvbGxzICo9IDI7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobnVtX3BvbGxzIDw9IG51bV93YWl0aW5nKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIG5ldyBwb2xsaW5nIGFyZWEsIGFuZCBjb3B5IHRoZSByZWxldmFudCBwb3J0aW9uCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG9sZCBwb2xsaW5nIGFyZWEgdG8gdGhlIG5ldyBhcmVhLiAgX19rbXBfYWxsb2NhdGUoKQorICAgICAgICAgICAgICAgIC8vIHplcm9lcyB0aGUgbWVtb3J5IGl0IGFsbG9jYXRlcywgYW5kIG1vc3Qgb2YgdGhlIG9sZCBhcmVhIGlzCisgICAgICAgICAgICAgICAgLy8ganVzdCB6ZXJvIHBhZGRpbmcsIHNvIHdlIG9ubHkgY29weSB0aGUgcmVsZWFzZSBjb3VudGVycy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnVtX3BvbGxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHNbaV0ucG9sbCA9IG9sZF9wb2xsc1tpXS5wb2xsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdyB3cml0ZSB0aGUgdXBkYXRlZCBmaWVsZHMgYmFjayB0byB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFrZSBjZXJ0YWluIHRoYXQgInBvbGxzIiBpcyB3cml0dGVuIGJlZm9yZSAibWFzayIgISEhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkCisgICAgICAgICAgICAvLyBwb2xscyBwb2ludGVyICwgaXQgY291bGQgYWNjZXNzIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG9sZCBwb2xsaW5nIGFyZWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT24geDg2LCB3ZSBuZWVkIG1lbW9yeSBmZW5jZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWNvbmZpZ3VyaW5nIGxvY2sgJXAgdG8gJWQgcG9sbHNcbiIsCisgICAgICAgICAgICAgIHRpY2tldCwgbGNrLCBudW1fcG9sbHMpKTsKKworICAgICAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBvbGRfcG9sbHM7ICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIGxjay0+bGsucG9sbHMgPSBwb2xsczsgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIGxjay0+bGsubnVtX3BvbGxzID0gbnVtX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLm1hc2sgPSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgbmV3IHBvbGxpbmcgYXJlYSBhbmQgbWFzayBoYXZlIGJlZW4gZmx1c2hlZAorICAgICAgICAgICAgLy8gdG8gbWFpbiBtZW1vcnkgY2FuIHdlIHVwZGF0ZSB0aGUgY2xlYW51cCB0aWNrZXQgZmllbGQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZCAvIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBnZXQgYSB0aWNrZXQsIHRoZW4gcmVhZCB0aGUgcG9sbHMgcG9pbnRlciBhbmQgdGhlIG1hc2suCisgICAgLy8gVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUgbWFzayEhISAoU2VlIGFib3ZlKQorICAgIC8vCisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSA9PSB0aWNrZXQpIHsKKyAgICAgICAga21wX3VpbnQ2NCBuZXh0X3RpY2tldCA9IHRpY2tldCArIDE7CisgICAgICAgIGlmIChLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgIHRpY2tldCwgbmV4dF90aWNrZXQpKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfdGVzdF9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgIHRpY2tldCwgbGNrKSk7CisgICAgICAgICAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2luY2Ugbm8gdGhyZWFkcyBhcmUgd2FpdGluZywgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgdGhhdAorICAgICAgICAgICAgLy8gd2Ugd291bGQgd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLiAgV2UgbWlnaHQKKyAgICAgICAgICAgIC8vIGhhdmUgdGhlIGNsZWFudXAgdGlja2V0IHZhbHVlICh3aGljaCBzYXlzIHRoYXQgaXQgaXMgbm93CisgICAgICAgICAgICAvLyBzYWZlIHRvIGRlYWxsb2NhdGUgb2xkX3BvbGxzKSwgYnV0IHdlJ2xsIGxldCBhIGxhdGVyIHRocmVhZAorICAgICAgICAgICAgLy8gd2hpY2ggY2FsbHMgX19rbXBfYWNxdWlyZV9sb2NrIGRvIHRoYXQgLSB0aGlzIHJvdXRpbmUKKyAgICAgICAgICAgIC8vIGlzbid0IHN1cHBvc2VkIHRvIGJsb2NrLCBhbmQgd2Ugd291bGQgcmlzayBibG9ja3MgaWYgd2UKKyAgICAgICAgICAgIC8vIGNhbGxlZCBfX2ttcF9mcmVlKCkgdG8gZG8gdGhlIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gUmVhZCB0aGUgdGlja2V0IHZhbHVlIGZyb20gdGhlIGxvY2sgZGF0YSBzdHJ1Y3QsIHRoZW4gdGhlIHBvbGxzCisgICAgLy8gcG9pbnRlciBhbmQgdGhlIG1hc2suICBUaGUgcG9sbHMgcG9pbnRlciBtdXN0IGJlIHJlYWQgYmVmb3JlIHRoZQorICAgIC8vIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gbGNrLT5say5ub3dfc2VydmluZyArIDE7ICAgICAgICAvLyBub24tdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGttcF91aW50NjQgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWxlYXNlZCBsb2NrICVwXG4iLAorICAgICAgIHRpY2tldCAtIDEsIGxjaykpOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMNjQoJihwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSwgdGlja2V0KTsgLy8gdm9sYXRpbGUgc3RvcmUKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICAgICAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsubWFzayA9IDA7CisgICAgbGNrLT5say5udW1fcG9sbHMgPSAxOworICAgIGxjay0+bGsucG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKGxjay0+bGsubnVtX3BvbGxzICogc2l6ZW9mKCoobGNrLT5say5wb2xscykpKTsKKyAgICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm9sZF9wb2xscyA9IE5VTEw7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7ICAgICAgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MuCisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IGxjazsKKworICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9kcmRwYV9sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBOVUxMOworICAgIGxjay0+bGsubG9jYXRpb24gICAgPSBOVUxMOworICAgIGlmIChsY2stPmxrLnBvbGxzICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZSgodm9pZCAqKWxjay0+bGsucG9sbHMpOworICAgICAgICBsY2stPmxrLnBvbGxzID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGxjay0+bGsub2xkX3BvbGxzICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZSgodm9pZCAqKWxjay0+bGsub2xkX3BvbGxzKTsKKyAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIH0KKyAgICBsY2stPmxrLm1hc2sgPSAwOworICAgIGxjay0+bGsubnVtX3BvbGxzID0gMDsKKyAgICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCBkcmRwYSB0aWNrZXQgbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgICAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZHJkcGFfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfZHJkcGFfbG9ja19pbml0aWFsaXplZCgga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF9kcmRwYV9sb2NrX2xvY2F0aW9uKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X2RyZHBhX2xvY2tfZmxhZ3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKKworaW50ICggKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2NvbnN0IGlkZW50X3QgKiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKSA9IE5VTEw7CitrbXBfbG9ja19mbGFnc190ICggKl9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKSA9IE5VTEw7CisKK3ZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycygga21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kICkKK3sKKyAgICBzd2l0Y2ggKCB1c2VyX2xvY2tfa2luZCApIHsKKyAgICAgICAgY2FzZSBsa19kZWZhdWx0OgorICAgICAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisKKyAgICAgICAgY2FzZSBsa190YXM6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3Rhc19sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfdGFzX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF90YXNfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggaW50ICAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3Rlc3RfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90YXNfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggaW50ICAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKyAgICAgICAgY2FzZSBsa19mdXRleDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZnV0ZXhfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Z1dGV4X2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9mdXRleF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pbml0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKyAgICAgICAgY2FzZSBsa190aWNrZXQ6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfdGlja2V0X2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggaW50ICAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggaW50ICAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3F1ZXVpbmdfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbGtfYWRhcHRpdmU6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3F1ZXVpbmdfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyAgICAgICAgY2FzZSBsa19kcmRwYTogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZHJkcGFfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2RyZHBhX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX2RyZHBhX2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorCitrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZSA9IHsgMSwgMCwgTlVMTCB9Owora21wX3VzZXJfbG9ja19wIF9fa21wX2xvY2tfcG9vbCA9IE5VTEw7CisKKy8vIExvY2sgYmxvY2stYWxsb2NhdGlvbiBzdXBwb3J0Lgora21wX2Jsb2NrX29mX2xvY2tzKiBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CitpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrID0gMTsgICAgICAgICAgICAgLy8gRklYTUUgLSB0dW5lIHRoaXMgdmFsdWUKKworc3RhdGljIGttcF9sb2NrX2luZGV4X3QKK19fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID49IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3Qgc2l6ZTsKKyAgICAgICAga21wX3VzZXJfbG9ja19wICp0YWJsZTsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpOworICAgICAgICAvLyBSZWFsbG9jYXRlIGxvY2sgdGFibGUuCisgICAgICAgIGlmICggX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9PSAwICkgeworICAgICAgICAgICAgc2l6ZSA9IDEwMjQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaXplID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCAqIDI7CisgICAgICAgIH0KKyAgICAgICAgdGFibGUgPSAoa21wX3VzZXJfbG9ja19wICopX19rbXBfYWxsb2NhdGUoIHNpemVvZigga21wX3VzZXJfbG9ja19wICkgKiBzaXplICk7CisgICAgICAgIG1lbWNweSggdGFibGUgKyAxLCBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgKyAxLCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCAtIDEgKSApOworICAgICAgICB0YWJsZVsgMCBdID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGU7CisgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcHJldmlvcyB0YWJsZSBub3csIHNpbnNlIGl0IG1heSBiZSBpbiB1c2UgYnkgb3RoZXIKKyAgICAgICAgICAgIC8vIHRocmVhZHMuIFNvIHNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHRhYmxlIGluIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgICAgICAgICAgLy8gbmV3IHRhYmxlLiBBbGwgdGhlIHRhYmxlcyB3aWxsIGJlIG9yZ2FuaXplZCBpbnRvIGEgbGlzdCwgYW5kIGNvdWxkIGJlIGZyZWVkIHdoZW4KKyAgICAgICAgICAgIC8vIGxpYnJhcnkgc2h1dHRpbmcgZG93bi4KKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gdGFibGU7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSBzaXplOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKTsKKyAgICBpbmRleCA9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsgaW5kZXggXSA9IGxjazsKKyAgICArKyBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvY2tfYmxvY2tfYWxsb2NhdGUoKQoreworICAgIC8vIEFzc3VtZSB0aGF0IGttcF9nbG9iYWxfbG9jayBpcyBoZWxkIHVwb24gZW50cnkvZXhpdC4KKyAgICBzdGF0aWMgaW50IGxhc3RfaW5kZXggPSAwOworICAgIGlmICggKCBsYXN0X2luZGV4ID49IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApCisgICAgICB8fCAoIF9fa21wX2xvY2tfYmxvY2tzID09IE5VTEwgKSApIHsKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgaW5kZXguCisgICAgICAgIGxhc3RfaW5kZXggPSAwOworICAgICAgICAvLyBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgc2l6ZV90IHNwYWNlX2Zvcl9sb2NrcyA9IF9fa21wX3VzZXJfbG9ja19zaXplICogX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopX19rbXBfYWxsb2NhdGUoIHNwYWNlX2Zvcl9sb2NrcyArIHNpemVvZigga21wX2Jsb2NrX29mX2xvY2tzICkgKTsKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBuZXcgYmxvY2suCisgICAgICAgIGttcF9ibG9ja19vZl9sb2NrcyAqbmV3X2Jsb2NrID0gKGttcF9ibG9ja19vZl9sb2NrcyAqKSgmIGJ1ZmZlcltzcGFjZV9mb3JfbG9ja3NdKTsKKyAgICAgICAgbmV3X2Jsb2NrLT5uZXh0X2Jsb2NrID0gX19rbXBfbG9ja19ibG9ja3M7CisgICAgICAgIG5ld19ibG9jay0+bG9ja3MgPSAodm9pZCAqKWJ1ZmZlcjsKKyAgICAgICAgLy8gUHVibGlzaCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgX19rbXBfbG9ja19ibG9ja3MgPSBuZXdfYmxvY2s7CisgICAgfQorICAgIGttcF91c2VyX2xvY2tfcCByZXQgPSAoa21wX3VzZXJfbG9ja19wKSgmICggKCAoY2hhciAqKSggX19rbXBfbG9ja19ibG9ja3MtPmxvY2tzICkgKQorICAgICAgWyBsYXN0X2luZGV4ICogX19rbXBfdXNlcl9sb2NrX3NpemUgXSApICk7CisgICAgbGFzdF9pbmRleCsrOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vCisvLyBHZXQgbWVtb3J5IGZvciBhIGxvY2suIEl0IG1heSBiZSBmcmVzaGx5IGFsbG9jYXRlZCBtZW1vcnkgb3IgcmV1c2VkIG1lbW9yeQorLy8gZnJvbSBsb2NrIHBvb2wuCisvLwora21wX3VzZXJfbG9ja19wCitfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLAorICBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9sb2NrX3Bvb2wgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gTG9jayBwb29sIGlzIGVtcHR5LiBBbGxvY2F0ZSBuZXcgbWVtb3J5LgorICAgICAgICBpZiAoIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA8PSAxICkgeyAvLyBUdW5lIHRoaXMgY3V0b2ZmIHBvaW50LgorICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgX19rbXBfYWxsb2NhdGUoIF9fa21wX3VzZXJfbG9ja19zaXplICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsY2sgPSBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgbG9jayBpbiB0aGUgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgaW4gX19rbXBfY2xlYW51cCwKKyAgICAgICAgLy8gYW5kIGRlYnVnZ2VyIGhhcyBpbmZvIG9uIGFsbCBhbGxvY2F0ZWQgbG9ja3MuCisgICAgICAgIGluZGV4ID0gX19rbXBfbG9ja190YWJsZV9pbnNlcnQoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUGljayB1cCBsb2NrIGZyb20gcG9vbC4KKyAgICAgICAgbGNrID0gX19rbXBfbG9ja19wb29sOworICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5pbmRleDsKKyAgICAgICAgX19rbXBfbG9ja19wb29sID0gX19rbXBfbG9ja19wb29sLT5wb29sLm5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbmVzdGVkIGFuZCByZWd1bGFyIGxvY2tzCisgICAgLy8gaGVyZSwgYW5kIGRvIHRoZSBsb2NrIHRhYmxlIGxvb2t1cCBmb3IgcmVndWxhciBsb2NrcyBvbmx5LgorICAgIC8vCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAgKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApID0gaW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqICggKGttcF91c2VyX2xvY2tfcCAqKSB1c2VyX2xvY2sgKSA9IGxjazsKKyAgICB9CisKKyAgICAvLyBtYXJrIHRoZSBsb2NrIGlmIGl0IGlzIGNyaXRpY2FsIHNlY3Rpb24gbG9jay4KKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBsY2ssIGZsYWdzICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsgLy8gQUM6IFRPRE86IG1vdmUgdGhpcyBsaW5lIHVwcGVyCisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBQdXQgbG9jaydzIG1lbW9yeSB0byBwb29sIGZvciByZXVzaW5nLgordm9pZAorX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBrbXBfbG9ja19wb29sX3QgKiBsb2NrX3Bvb2w7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB1c2VyX2xvY2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGxjay0+cG9vbC5uZXh0ID0gX19rbXBfbG9ja19wb29sOworICAgIF9fa21wX2xvY2tfcG9vbCA9IGxjazsKKyAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IGluZGV4ID0gKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPD0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgbGNrLT5wb29sLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7Cit9CisKK2ttcF91c2VyX2xvY2tfcAorX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjayA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICooIChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrICk7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYgKCAhICggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlW2luZGV4XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKil1c2VyX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxjazsKK30KKwordm9pZAorX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCB2b2lkICkKK3sKKyAgICAvLworICAgIC8vIFJlc2V0IGxvY2sgcG9vbC4gRG8gbm90IHdvcnJ5IGFib3V0IGxvY2sgaW4gdGhlIHBvb2wgLS0gd2Ugd2lsbCBmcmVlCisgICAgLy8gdGhlbSB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIGxvY2sgdGFibGUgKGl0IGluY2x1ZGVzIGFsbCB0aGUgbG9ja3MsCisgICAgLy8gZGVhZCBvciBhbGl2ZSkuCisgICAgLy8KKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisjZGVmaW5lIElTX0NSSVRJQ0FMKGxjaykgXAorICAgICAgICAoICggX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gIT0gTlVMTCApICYmIFwKKyAgICAgICAgKCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2sgKSAmIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICkgKQorCisgICAgLy8KKyAgICAvLyBMb29wIHRocm91Z2ggbG9jayB0YWJsZSwgZnJlZSBhbGwgbG9ja3MuCisgICAgLy8KKyAgICAvLyBEbyBub3QgZnJlZSBpdGVtIFswXSwgaXQgaXMgcmVzZXJ2ZWQgZm9yIGxvY2sgdGFibGVzIGxpc3QuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgKHBvaW50ZXJzIHRvKSBvYmplY3RzIG9mCisgICAgLy8gdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrLCBidXQgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZQorICAgIC8vIGJhc2UgdHlwZSBpcyBjdXJyZW50bHkgInBvb2wiIG9yIHdoYXRldmVyIHRoZSBnbG9iYWwgdXNlciBsb2NrIHR5cGUKKyAgICAvLyBpcy4KKyAgICAvLworICAgIC8vIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgZm9yIGFsbCBvZiB0aGUgdXNlciBsb2NrIHR5cGVzCisgICAgLy8gKGV4Y2VwdCAidGFzIiksIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgbG9jayBzdHJ1Y3QgaXMgdGhlICJpbml0aWFsaXplZCIKKyAgICAvLyBmaWVsZCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NrIG9iamVjdCBpdHNlbGYgd2hlbgorICAgIC8vIHRoZSBsb2NrIGlzIGluaXRpYWxpemVkLiAgV2hlbiB0aGUgdW5pb24gaXMgb2YgdHlwZSAicG9vbCIsIHRoZQorICAgIC8vIGZpcnN0IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGZyZWUgbGlzdCwgd2hpY2gKKyAgICAvLyB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvYmplY3QgaXRzZWxmLgorICAgIC8vCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVjayAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApCisgICAgLy8gd2lsbCBmYWlsIGZvciAicG9vbCIgb2JqZWN0cyBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBtdXN0IGhhcHBlbiBhcworICAgIC8vIHRoZSAibG9jYXRpb24iIGZpZWxkIG9mIHJlYWwgdXNlciBsb2NrcyBvdmVybGFwcyB0aGUgImluZGV4IiBmaWVsZAorICAgIC8vIG9mICJwb29sIiBvYmplY3RzLgorICAgIC8vCisgICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHJ1biB0aHJvdWdoIHRoZSBmcmVlIGxpc3QsIGFuZCByZW1vdmUgYWxsICJwb29sIgorICAgIC8vIG9iamVjdHMgZnJvbSB0aGUgbG9jayB0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbG9vcC4gIEhvd2V2ZXIsCisgICAgLy8gInBvb2wiIG9iamVjdHMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZWlyIGluZGV4IGZpZWxkIHNldCAob25seSBvbgorICAgIC8vIGxpbl8zMmUpLCBhbmQgSSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aGUgbG9jayB0YWJsZSBmb3IgdGhlIGFkZHJlc3MKKyAgICAvLyBvZiBldmVyeSAicG9vbCIgb2JqZWN0IG9uIHRoZSBmcmVlIGxpc3QuCisgICAgLy8KKyAgICB3aGlsZSAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID4gMSApIHsKKyAgICAgICAgY29uc3QgaWRlbnQgKmxvYzsKKworICAgICAgICAvLworICAgICAgICAvLyByZWR1Y2UgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgYmVmb3JlIGZyZWVpbmcgdGhlIGxvY2ssCisgICAgICAgIC8vIHNvIHRoYXQgc3RhdGUgb2YgbG9ja3MgaXMgY29uc2lzdGVudAorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlWworICAgICAgICAgIC0tX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgXTsKKworICAgICAgICBpZiAoICggX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyAhPSBOVUxMICkgJiYKKyAgICAgICAgICAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElzc3VlIGEgd2FybmluZyBpZjogS01QX0NPTlNJU1RFTkNZX0NIRUNLIEFORCBsb2NrIGlzCisgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBBTkQgaXQgaXMgTk9UIGEgY3JpdGljYWwgc2VjdGlvbiAodXNlciBpcyBub3QKKyAgICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIGNyaXRpY2FscykgQU5EIHdlIGtub3cgc291cmNlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiB0byByZXBvcnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgKCAhIElTX0NSSVRJQ0FMKCBsY2sgKSApICYmCisgICAgICAgICAgICAgICggKCBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2sgKSApICE9IE5VTEwgKSAmJgorICAgICAgICAgICAgICAoIGxvYy0+cHNvdXJjZSAhPSBOVUxMICkgKSB7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQ25zTG9ja05vdERlc3Ryb3llZCwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmZ1bmMsCisgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmICggSVNfQ1JJVElDQUwoIGxjayApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3M6IGZyZWUgY3JpdGljYWwgc2VjdGlvbiBsb2NrICVwICglcClcbiIsIGxjaywgKih2b2lkKiopbGNrICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3M6IGZyZWUgbG9jayAlcCAoJXApXG4iLCBsY2ssICoodm9pZCoqKWxjayApICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDbGVhbnVwIGludGVybmFsIGxvY2sgZHluYW1pYyByZXNvdXJjZXMKKyAgICAgICAgICAgIC8vIChmb3IgZHJkcGEgbG9ja3MgcGFydGljdWxhcmx5KS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9jayggbGNrICk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGcmVlIHRoZSBsb2NrIGlmIGJsb2NrIGFsbG9jYXRpb24gb2YgbG9ja3MgaXMgbm90IHVzZWQuCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfbG9ja19ibG9ja3MgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIGxjayApOworICAgICAgICB9CisgICAgfQorCisjdW5kZWYgSVNfQ1JJVElDQUwKKworICAgIC8vCisgICAgLy8gZGVsZXRlIGxvY2sgdGFibGUocykuCisgICAgLy8KKyAgICBrbXBfdXNlcl9sb2NrX3AgKnRhYmxlX3B0ciA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgPSBOVUxMOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworCisgICAgd2hpbGUgKCB0YWJsZV9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gdGhlIGZpcnN0IGVsZW1lbnQgd2Ugc2F2ZWQgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzCisgICAgICAgIC8vIChzbWFsbGVyKSBsb2NrIHRhYmxlLgorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgKm5leHQgPSAoa21wX3VzZXJfbG9ja19wICopKCB0YWJsZV9wdHJbIDAgXSApOworICAgICAgICBfX2ttcF9mcmVlKCB0YWJsZV9wdHIgKTsKKyAgICAgICAgdGFibGVfcHRyID0gbmV4dDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZyZWUgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIGJsb2NrcyBvZiBsb2Nrcy4KKyAgICAvLworICAgIGttcF9ibG9ja19vZl9sb2Nrc190ICpibG9ja19wdHIgPSBfX2ttcF9sb2NrX2Jsb2NrczsKKyAgICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisKKyAgICB3aGlsZSAoIGJsb2NrX3B0ciAhPSBOVUxMICkgeworICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqbmV4dCA9IGJsb2NrX3B0ci0+bmV4dF9ibG9jazsKKyAgICAgICAgX19rbXBfZnJlZSggYmxvY2tfcHRyLT5sb2NrcyApOworICAgICAgICAvLworICAgICAgICAvLyAqYmxvY2tfcHRyIGl0c2VsZiB3YXMgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxvY2tzIHZlY3Rvci4KKyAgICAgICAgLy8KKwlibG9ja19wdHIgPSBuZXh0OworICAgIH0KKworICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworfQorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX2xvY2suaCBiL3JjMS9ydW50aW1lL3NyYy9rbXBfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDlkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX2xvY2suaApAQCAtMCwwICsxLDk4OSBAQAorLyoKKyAqIGttcF9sb2NrLmggLS0gbG9jayBoZWFkZXIgZmlsZQorICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9MT0NLX0gKKyNkZWZpbmUgS01QX0xPQ0tfSAorCisjaW5jbHVkZSA8bGltaXRzLmg+ICAgIC8vIENIQVJfQklUCisjaW5jbHVkZSA8c3RkZGVmLmg+ICAgIC8vIG9mZnNldG9mCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXZlIHRvIGNvcHkgdGhlc2UgZGVmaW5pdGlvbnMgZnJvbSBrbXAuaCBiZWNhdXNlIGttcC5oIGNhbm5vdCBiZSBpbmNsdWRlZAorLy8gZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4gIFdpbGwgdW5kZWYgdGhlc2UgYXQgZW5kIG9mIGZpbGUuCisKKyNkZWZpbmUgS01QX1BBRCh0eXBlLCBzeikgICAgIChzaXplb2YodHlwZSkgKyAoc3ogLSAoKHNpemVvZih0eXBlKSAtIDEpICUgKHN6KSkgLSAxKSkKKyNkZWZpbmUgS01QX0dUSURfRE5FICgtMikKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBpZGVudCBhbmQgaWRlbnRfdAorCitzdHJ1Y3QgaWRlbnQ7Cit0eXBlZGVmIHN0cnVjdCBpZGVudCBpZGVudF90OworCisvLyBFbmQgb2YgY29waWVkIGNvZGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBXZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIGFyZWEgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBjb21waWxlcihzKQorLy8gYWxsb2NhdGVkIGZvciBvYmVjdHMgb2YgdHlwZSBvbXBfbG9ja190IGFuZCBvbXBfbmVzdF9sb2NrX3QuICBUaGUgSW50ZWwKKy8vIGNvbXBpbGVyIGFsd2F5cyBhbGxvY2F0ZXMgYSBwb2ludGVyLXNpemVkIGFyZWEsIGFzIGRvZXMgdmlzdWFsIHN0dWRpby4KKy8vCisvLyBnY2MgaG93ZXZlciwgb25seSBhbGxvY2F0ZXMgNCBieXRlcyBmb3IgcmVndWxhciBsb2NrcywgZXZlbiBvbiA2NC1iaXQKKy8vIGludGVsIGFyY2hzLiAgSXQgYWxsb2NhdGVzIGF0IGxlYXN0IDggYnl0ZXMgZm9yIG5lc3RlZCBsb2NrIChtb3JlIG9uCisvLyByZWNlbnQgdmVyc2lvbnMpLCBidXQgd2UgYXJlIGJvdW5kZWQgYnkgdGhlIHBvaW50ZXItc2l6ZWQgY2h1bmtzIHRoYXQKKy8vIHRoZSBJbnRlbCBjb21waWxlciBhbGxvY2F0ZXMuCisvLworCisjaWYgS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2YoaW50KQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2Vsc2UKKyMgZGVmaW5lIE9NUF9MT0NLX1RfU0laRSAgICAgICAgc2l6ZW9mKHZvaWQgKikKKyMgZGVmaW5lIE9NUF9ORVNUX0xPQ0tfVF9TSVpFICAgc2l6ZW9mKHZvaWQgKikKKyNlbmRpZgorCisvLworLy8gVGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcyBhIDMyLWJ5dGUgY2h1bmsgZm9yIGEgY3JpdGljYWwgc2VjdGlvbi4KKy8vIEJvdGggZ2NjIGFuZCB2aXN1YWwgc3R1ZGlvIG9ubHkgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhIHBvaW50ZXIuCisvLyBTb21ldGltZXMgd2Uga25vdyB0aGF0IHRoZSBzcGFjZSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBJbnRlbCBjb21waWxlci4KKy8vCisjZGVmaW5lIE9NUF9DUklUSUNBTF9TSVpFICAgICAgIHNpemVvZih2b2lkICopCisjZGVmaW5lIElOVEVMX0NSSVRJQ0FMX1NJWkUgICAgIDMyCisKKy8vCisvLyBsb2NrIGZsYWdzCisvLwordHlwZWRlZiBrbXBfdWludDMyIGttcF9sb2NrX2ZsYWdzX3Q7CisKKyNkZWZpbmUga21wX2xmX2NyaXRpY2FsX3NlY3Rpb24gMQorCisvLworLy8gV2hlbiBhIGxvY2sgdGFibGUgaXMgdXNlZCwgdGhlIGluZGljZXMgYXJlIG9mIGttcF9sb2NrX2luZGV4X3QKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfaW5kZXhfdDsKKworLy8KKy8vIFdoZW4gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ja3MgYXJlIG9uIHRoZSBsb2NrIHBvb2wgKGZyZWUgbGlzdCksCisvLyBpdCBpcyB0cmVhdGVkIGFzIHN0cnVjdHMgb2YgdGhpcyB0eXBlLgorLy8KK3N0cnVjdCBrbXBfbG9ja19wb29sIHsKKyAgICB1bmlvbiBrbXBfdXNlcl9sb2NrICpuZXh0OworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9ja19wb29sIGttcF9sb2NrX3Bvb2xfdDsKKworCitleHRlcm4gdm9pZCBfX2ttcF92YWxpZGF0ZV9sb2Nrcyggdm9pZCApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVGhlcmUgYXJlIDUgbG9jayBpbXBsZW1lbnRhdGlvbnM6CisvLworLy8gICAgICAgMS4gVGVzdCBhbmQgc2V0IGxvY2tzLgorLy8gICAgICAgMi4gZnV0ZXggbG9ja3MgKExpbnV4KiBPUyBvbiB4ODYgYW5kIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGFyY2hpdGVjdHVyZSkKKy8vICAgICAgIDMuIFRpY2tldCAoTGFtcG9ydCBiYWtlcnkpIGxvY2tzLgorLy8gICAgICAgNC4gUXVldWluZyBsb2NrcyAod2l0aCBzZXBhcmF0ZSBzcGluIGZpZWxkcykuCisvLyAgICAgICA1LiBEUlBBIChEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEpIGxvY2tzCisvLworLy8gICBhbmQgMyBsb2NrIHB1cnBvc2VzOgorLy8KKy8vICAgICAgIDEuIEJvb3RzdHJhcCBsb2NrcyAtLSBVc2VkIGZvciBhIGZldyBsb2NrcyBhdmFpbGFibGUgYXQgbGlicmFyeSBzdGFydHVwLXNodXRkb3duIHRpbWUuCisvLyAgICAgICAgICBUaGVzZSBkbyBub3QgcmVxdWlyZSBub24tbmVnYXRpdmUgZ2xvYmFsIHRocmVhZCBJRCdzLgorLy8gICAgICAgMi4gSW50ZXJuYWwgUlRMIGxvY2tzIC0tIFVzZWQgZXZlcnl3aGVyZSBlbHNlIGluIHRoZSBSVEwKKy8vICAgICAgIDMuIFVzZXIgbG9ja3MgKGluY2x1ZGVzIGNyaXRpY2FsIHNlY3Rpb25zKQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMb2NrIGltcGxlbWVudGF0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLworLy8gTm9uLW5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9ja3MgZGlmZmVyIGZyb20gdGhlIG90aGVyIGxvY2sga2luZHMgKGV4Y2VwdAorLy8gZnV0ZXgpIGluIHRoYXQgd2UgdXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgdGhlIGxvY2ssCisvLyByYXRoZXIgdGhhbiBhIHBvaW50ZXIgdG8gaXQuCisvLworLy8gT24gbGluMzIsIGxpbl8zMmUsIGFuZCB3aW5fMzIsIHRoZSBzcGFjZSBhbGxvY2F0ZWQgbWF5IGJlIGFzIHNtYWxsIGFzIDQKKy8vIGJ5dGVzLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIGxvY2sgdGFibGUgZm9yIG5lc3RlZCBsb2NrcywgYW5kIGF2b2lkIGFjY2Vzc2luZworLy8gdGhlIGRlcHRoX2xvY2tlZCBmaWVsZCBmb3Igbm9uLW5lc3RlZCBsb2Nrcy4KKy8vCisvLyBJbmZvcm1hdGlvbiBub3JtYWxseSBhdmFpbGFibGUgdG8gdGhlIHRvb2xzLCBzdWNoIGFzIGxvY2sgbG9jYXRpb24sCisvLyBsb2NrIHVzYWdlIChub3JtYWwgbG9jayB2cy4gY3JpdGljYWwgc2VjdGlvbiksIGV0Yy4gaXMgbm90IGF2YWlsYWJsZSB3aXRoCisvLyB0ZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV90YXNfbG9jayB7CisgICAgdm9sYXRpbGUga21wX2ludDMyIHBvbGw7ICAgICAgICAgLy8gMCA9PiB1bmxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2tlZDogKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZAorICAgIGttcF9pbnQzMiAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNfbG9jayBrbXBfYmFzZV90YXNfbG9ja190OworCit1bmlvbiBrbXBfdGFzX2xvY2sgeworICAgIGttcF9iYXNlX3Rhc19sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7ICAgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgICBkb3VibGUgbGtfYWxpZ247ICAgICAgICAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjYWNoZSBsaW5lIHBhZGRpbmcKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3Rhc19sb2NrIGttcF90YXNfbG9ja190OworCisvLworLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciB0ZXN0IGFuZCBzZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3Rhc19sb2NrX3QgeGxvY2sgPSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLworI2RlZmluZSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgMCwgMCB9IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CisKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1dGV4IGxvY2tzLiAgZnV0ZXggbG9ja3MgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIExpbnV4KiBPUy4KKy8vCisvLyBMaWtlIG5vbi1uZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2ssIG5vbi1uZXN0ZWQgZnV0ZXggbG9ja3MgdXNlIHRoZSBtZW1vcnkKKy8vIGFsbG9jYXRlZCBieSB0aGUgY29tcGlsZXIgZm9yIHRoZSBsb2NrLCByYXRoZXIgdGhhbiBhIHBvaW50ZXIgdG8gaXQuCisvLworLy8gSW5mb3JtYXRpb24gbm9ybWFsbHkgYXZhaWxhYmxlIHRvIHRoZSB0b29scywgc3VjaCBhcyBsb2NrIGxvY2F0aW9uLAorLy8gbG9jayB1c2FnZSAobm9ybWFsIGxvY2sgdnMuIGNyaXRpY2FsIHNlY3Rpb24pLCBldGMuIGlzIG5vdCBhdmFpbGFibGUgd2l0aAorLy8gdGVzdCBhbmQgc2V0IGxvY2tzLiAgV2l0aCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzLCB0aGUgbG9jayBvd25lciBpcyBub3QKKy8vIGV2ZW4gYXZhaWxhYmxlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3Qga21wX2Jhc2VfZnV0ZXhfbG9jayB7CisgICAgdm9sYXRpbGUga21wX2ludDMyIHBvbGw7ICAgICAgICAgLy8gMCA9PiB1bmxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIqKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2tlZDogKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZAorICAgIGttcF9pbnQzMiAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9mdXRleF9sb2NrIGttcF9iYXNlX2Z1dGV4X2xvY2tfdDsKKwordW5pb24ga21wX2Z1dGV4X2xvY2sgeworICAgIGttcF9iYXNlX2Z1dGV4X2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsgICAvLyBtYWtlIGNlcnRhaW4gc3RydWN0IGlzIGxhcmdlIGVub3VnaAorICAgIGRvdWJsZSBsa19hbGlnbjsgICAgICAgIC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfZnV0ZXhfbG9jayBrbXBfZnV0ZXhfbG9ja190OworCisvLworLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciBmdXRleCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfZnV0ZXhfbG9ja190IHhsb2NrID0gS01QX0ZVVEVYX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLworI2RlZmluZSBLTVBfRlVURVhfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAwLCAwIH0gfQorCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIHsKKyAgICAvLyBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqIGluaXRpYWxpemVkOyAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sga21wX2Jhc2VfdGlja2V0X2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aWNrZXRfbG9jayB7CisgICAga21wX2Jhc2VfdGlja2V0X2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGlja2V0X2xvY2sga21wX3RpY2tldF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHNpbXBsZSB0aWNrZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3RpY2tldF9sb2NrX3QgeGxvY2sgPSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLyBOb3RlIHRoZSBtYWNybyBhcmd1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgdmFyIHByb3Blcmx5IGluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IChrbXBfdGlja2V0X2xvY2tfdCAqKSAmIChsb2NrKSwgTlVMTCwgMCwgMCwgMCwgLTEgfSB9CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVldWluZyBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrOworCit0eXBlZGVmIHN0cnVjdCBrbXBfYWRhcHRpdmVfbG9jayBrbXBfYWRhcHRpdmVfbG9ja190OworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIHsKKyAgICAvKiBTbyB3ZSBjYW4gZ2V0IHN0YXRzIGZyb20gbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkLiAqLworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBuZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBwcmV2OworCisgICAgLyogT3RoZXIgc3RhdGlzdGljcyAqLworICAgIGttcF91aW50MzIgc3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIGhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBzb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgbm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzOworICAgIGttcF91aW50MzIgbGVtbWluZ1lpZWxkczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3Mga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190OworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9jaworeworICAgIC8qIFZhbHVlcyB1c2VkIGZvciBhZGFwdGl2aXR5LgorICAgICAqIEFsdGhvdWdoIHRoZXNlIGFyZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2UgZG9uJ3QgYWNjZXNzIHRoZW0gYXRvbWljYWxseSwKKyAgICAgKiBiZWNhdXNlIGlmIHdlIG1pc3MgdXBkYXRlcyBpdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciBtdWNoLiAoSXQganVzdCBhZmZlY3RzIG91cgorICAgICAqIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgdG8gdHJ5IHNwZWN1bGF0aW9uIG9uIHRoZSBsb2NrKS4KKyAgICAgKi8KKyAgICBrbXBfdWludDMyIHZvbGF0aWxlIGJhZG5lc3M7CisgICAga21wX3VpbnQzMiB2b2xhdGlsZSBhY3F1aXJlX2F0dGVtcHRzOworICAgIC8qIFBhcmFtZXRlcnMgb2YgdGhlIGxvY2suICovCisgICAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKKyAgICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Qgdm9sYXRpbGUgc3RhdHM7CisjZW5kaWYKK307CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayB7CisKKyAgICAvLyAgYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfcXVldWluZ19sb2NrICppbml0aWFsaXplZDsgLy8gUG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlLgorCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKworICAgIEtNUF9BTElHTiggOCApICAgICAgICAgICAgICAgICAgICAvLyB0YWlsX2lkICBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkIQorCisgICAgdm9sYXRpbGUga21wX2ludDMyICB0YWlsX2lkOyAgICAgIC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCB0YWlsIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBubyBwYWRkaW5nIGhlcmUgc2luY2UgaGVhZC90YWlsIHVzZWQgaW4gOC1ieXRlIENBUworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgaGVhZF9pZDsgICAgICAvLyAoZ3RpZCsxKSBvZiB0aHJlYWQgYXQgaGVhZCBvZiB3YWl0IHF1ZXVlLCAwIGlmIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY2wgb3JkZXIgYXNzdW1lcyBsaXR0bGUgZW5kaWFuCisgICAgLy8gYmFrZXJ5LXN0eWxlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisKKyAgICBrbXBfbG9ja19mbGFnc190ICAgIGZsYWdzOyAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIEtNUF9BTElHTihDQUNIRV9MSU5FKQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX3QgYWRhcHRpdmU7ICAgICAvLyBJbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWN1bGF0aXZlIGFkYXB0aXZlIGxvY2sKKyNlbmRpZgorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190OworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIHRhaWxfaWQgKSAlIDggPT0gMCApOworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3F1ZXVpbmdfbG9jayB7CisgICAga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLgorICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfcXVldWluZ19sb2NrIGttcF9xdWV1aW5nX2xvY2tfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEUkRQQSB0aWNrZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIHsKKyAgICAvLworICAgIC8vIEFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBmaXJzdCBjYWNoZSBsaW5lIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbgorICAgIC8vIGluaXRpYWxpemluZyBvciByZWNvbmZpZ3VyaW5nIHRoZSBsb2NrLiAgVGhlc2UgYXJlIHJlbGF0aXZlbHkgcmFyZQorICAgIC8vIG9wZXJhdGlvbnMsIHNvIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2FjaGUgbGluZSB3aWxsIHVzdWFsbHkgc3RheQorICAgIC8vIHJlc2lkZW50IGluIHRoZSBjYWNoZSBvZiBlYWNoIHRocmVhZCB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAvLworICAgIC8vIGluaXRpYWxpemVkIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfZHJkcGFfbG9jayAqIGluaXRpYWxpemVkOyAgICAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUKKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgICAgICAgICAgIGxvY2F0aW9uOyAgICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9sb2NrX3BvbGwgeworICAgICAgICBrbXBfdWludDY0IHBvbGw7CisgICAgfSAqIHZvbGF0aWxlIHBvbGxzOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAgICAgbWFzazsgICAgICAgICAgIC8vIGlzIDIqKm51bV9wb2xscy0xIGZvciBtb2Qgb3AKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfdGlja2V0OyAvLyB0aHJlYWQgd2l0aCBjbGVhbnVwIHRpY2tldAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsICogb2xkX3BvbGxzOyAgICAgIC8vIHdpbGwgZGVhbGxvY2F0ZSBvbGRfcG9sbHMKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2xsczsgICAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDIKKworICAgIC8vCisgICAgLy8gbmV4dF90aWNrZXQgaXQgbmVlZHMgdG8gZXhpc3QgaW4gYSBzZXBhcmF0ZSBjYWNoZSBsaW5lLCBhcyBpdCBpcworICAgIC8vIGludmFsaWRhdGVkIGV2ZXJ5IHRpbWUgYSB0aHJlYWQgdGFrZXMgYSBuZXcgdGlja2V0LgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG5leHRfdGlja2V0OworCisgICAgLy8KKyAgICAvLyBub3dfc2VydmluZyBpcyB1c2VkIHRvIHN0b3JlIG91ciB0aWNrZXQgdmFsdWUgd2hpbGUgd2UgaG9sZCB0aGUgbG9jay4KKyAgICAvLyBJdCBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgbWVhbmluZyBpbiB0aGUgRFJEUEEgdGlja2V0IGxvY2tzICh3aGVyZQorICAgIC8vIGl0IGlzIHdyaXR0ZW4gYnkgdGhlIGFjcXVpcmluZyB0aHJlYWQpIHRoYW4gaXQgZG9lcyBpbiB0aGUgc2ltcGxlCisgICAgLy8gdGlja2V0IGxvY2tzICh3aGVyZSBpdCBpcyB3cml0dGVuIGJ5IHRoZSByZWxlYXNpbmcgdGhyZWFkKS4KKyAgICAvLworICAgIC8vIFNpbmNlIG5vd19zZXJ2aW5nIGlzIG9ubHkgcmVhZCBhbiB3cml0dGVuIGluIHRoZSBjcml0aWNhbCBzZWN0aW9uLAorICAgIC8vIGl0IGlzIG5vbi12b2xhdGlsZSwgYnV0IGl0IG5lZWRzIHRvIGV4aXN0IG9uIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwKKyAgICAvLyBhcyBpdCBpcyBpbnZhbGlkYXRlZCBhdCBldmVyeSBsb2NrIGFjcXVpcmUuCisgICAgLy8KKyAgICAvLyBMaWtld2lzZSwgdGhlIHZhcnMgdXNlZCBmb3IgbmVzdGVkIGxvY2tzIChvd25lcl9pZCBhbmQgZGVwdGhfbG9ja2VkKQorICAgIC8vIGFyZSBvbmx5IHdyaXR0ZW4gYnkgdGhlIHRocmVhZCBvd25pbmcgdGhlIGxvY2ssIHNvIHRoZXkgYXJlIHB1dCBpbgorICAgIC8vIHRoaXMgY2FjaGUgbGluZS4gIG93bmVyX2lkIGlzIHJlYWQgYnkgb3RoZXIgdGhyZWFkcywgc28gaXQgbXVzdCBiZQorICAgIC8vIGRlY2xhcmVkIHZvbGF0aWxlLgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIG5vd19zZXJ2aW5nOyAgICAvLyBkb2Vzbid0IGhhdmUgdG8gYmUgdm9sYXRpbGUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgICAgIG93bmVyX2lkOyAgICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9sb2NrZWQ7ICAgLy8gZGVwdGggbG9ja2VkCisgICAga21wX2xvY2tfZmxhZ3NfdCAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIGttcF9iYXNlX2RyZHBhX2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kcmRwYV9sb2NrIHsKKyAgICBrbXBfYmFzZV9kcmRwYV9sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLiAqLworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfZHJkcGFfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2RyZHBhX2xvY2sga21wX2RyZHBhX2xvY2tfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgcHVycG9zZXMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQm9vdHN0cmFwIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCb290c3RyYXAgbG9ja3MgLS0gdmVyeSBmZXcgbG9ja3MgdXNlZCBhdCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUuCisvLyBCb290c3RyYXAgbG9ja3MgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MuCisvLyBUaGV5IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgdGVzdCBhbmQgc2V0IGxvY2ssIGJ1dCBjYW5ub3QgYmUKKy8vIGltcGxlbWVudGVkIHdpdGggb3RoZXIgbG9jayBraW5kcyBhcyB0aGV5IHJlcXVpcmUgZ3RpZHMgd2hpY2ggYXJlIG5vdAorLy8gYXZhaWxhYmxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2Jvb3RzdHJhcF9sb2NrX3Q7CisKKyNkZWZpbmUgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCAobG9jaykgKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIFJUTCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIEludGVybmFsIFJUTCBsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MsIGZvciBub3cuCisvLworLy8gRklYTUUgLSBXZSBzaG91bGQgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGljaCBsb2NrIGtpbmQgd29ya3MgYmVzdCBmb3IKKy8vIGVhY2ggaW50ZXJuYWwgbG9jaywgYW5kIHVzZSB0aGUgdHlwZSBkZWVjbGFyYXRpb24gYW5kIGZ1bmN0aW9uIGNhbGxzIGZvcgorLy8gdGhhdCBleHBsaWNpdCBsb2NrIGtpbmQgKGFuZCBnZXQgcmlkIG9mIHRoaXMgc2VjdGlvbikuCisvLworCit0eXBlZGVmIGttcF90aWNrZXRfbG9ja190IGttcF9sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbG9jaygga21wX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRG8gbm90IGFsbG9jYXRlIG9iamVjdHMgb2YgdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrISEhCisvLyBUaGlzIHdpbGwgd2FzdGUgc3BhY2UgdW5sZXNzIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RyZHBhLgorLy8gSW5zdGVhZCwgY2hlY2sgdGhlIHZhbHVlIG9mIF9fa21wX3VzZXJfbG9ja19raW5kIGFuZCBhbGxvY2F0ZSBvYmplY3RzIG9mCisvLyB0aGUgdHlwZSBvZiB0aGUgYXBwcm9wcmlhdGUgdW5pb24gbWVtYmVyLCBhbmQgY2FzdCB0aGVpciBhZGRyZXNzZXMgdG8KKy8vIGttcF91c2VyX2xvY2tfcC4KKy8vCisKK2VudW0ga21wX2xvY2tfa2luZCB7CisgICAgbGtfZGVmYXVsdCA9IDAsCisgICAgbGtfdGFzLAorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgbGtfZnV0ZXgsCisjZW5kaWYKKyAgICBsa190aWNrZXQsCisgICAgbGtfcXVldWluZywKKyAgICBsa19kcmRwYSwKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgbGtfYWRhcHRpdmUKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCit9OworCit0eXBlZGVmIGVudW0ga21wX2xvY2tfa2luZCBrbXBfbG9ja19raW5kX3Q7CisKK2V4dGVybiBrbXBfbG9ja19raW5kX3QgX19rbXBfdXNlcl9sb2NrX2tpbmQ7CisKK3VuaW9uIGttcF91c2VyX2xvY2sgeworICAgIGttcF90YXNfbG9ja190ICAgICB0YXM7CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBrbXBfZnV0ZXhfbG9ja190ICAgZnV0ZXg7CisjZW5kaWYKKyAgICBrbXBfdGlja2V0X2xvY2tfdCAgdGlja2V0OworICAgIGttcF9xdWV1aW5nX2xvY2tfdCBxdWV1aW5nOworICAgIGttcF9kcmRwYV9sb2NrX3QgICBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfdCAgICAgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9sb2NrX3Bvb2xfdCAgICBwb29sOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdXNlcl9sb2NrICprbXBfdXNlcl9sb2NrX3A7CisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisjZGVmaW5lIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7ICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSAgeyAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisjaW5jbHVkZSAia21wX2kxOG4uaCIgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDOiBLTVBfRkFUQUwgZGVmaW5pdGlvbiAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiBBQzogY29weSBmcm9tIGttcC5oIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiB2b2lkICggKl9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSAoIGxjaywgZ3RpZCApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworLy8KKy8vIFdlIG5lZWQgYSBub24tY2hlY2tpbmcgdmVyc2lvbiBvZiBkZXN0cm95IGxvY2sgZm9yIHdoZW4gdGhlIFJUTCBpcworLy8gZG9pbmcgdGhlIGNsZWFudXAgYXMgaXQgY2FuJ3QgYWx3YXlzIHRlbGwgaWYgdGhlIGxvY2sgaXMgbmVzdGVkIG9yIG5vdC4KKy8vCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSB7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgIC8qIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCAqLworICAgICAgICAgICAgcmV0dXJuICsrbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkOyAgLyogc2FtZSBvd25lciwgZGVwdGggaW5jcmVhc2VkICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgICAgIGlmICggcmV0dmFsICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworICAgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKKy8vCisvLyB1c2VyIGxvY2sgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCBuZWNlc3NhcmlseSBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworLy8gVGhlICJzZXQiIGZ1bmN0aW9ucyB1c3VhbGx5IGhhdmUgd3JhcHBlciByb3V0aW5lcyB0aGF0IGNoZWNrIGZvciBhIE5VTEwgc2V0CisvLyBmdW5jdGlvbiBwb2ludGVyIGFuZCBjYWxsIGl0IGlmIG5vbi1OVUxMLgorLy8KKy8vIEluIHNvbWUgY2FzZXMsIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSAiZ2V0IiB3cmFwcGVyIGZ1bmN0aW9uIGNoZWNrIGZvciBhCisvLyBOVUxMIGdldCBmdW5jdGlvbiBwb2ludGVyIGFuZCByZXR1cm4gTlVMTCAvIGludmFsaWQgdmFsdWUgLyBlcnJvciBjb2RlIGlmCisvLyB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMLgorLy8KKy8vIEluIG90aGVyIGNhc2VzLCB0aGUgY2FsbGluZyBjb2RlIHJlYWxseSBzaG91bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuCisvLyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIGFuZCBvbmUgdGhhdCBpcyBpbXBsZW1lbnRlZCBidXQgcmV0dXJuaW5nIE5VTEwgLworLy8gaW52YWxpZWQgdmFsdWUuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBubyBnZXQgZnVuY3Rpb24gd3JhcHBlciBleGlzdHMuCisvLworCitleHRlcm4gaW50ICggKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCisvLyBubyBzZXQgZnVuY3Rpb247IGZpZWxkcyBzZXQgZHVyaW5pbmcgbG9jYWwgYWxsb2NhdGlvbgorCitleHRlcm4gY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb24oIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIGlmICggX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbigga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBpZiAoIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICAhPSBOVUxMICkgeworICAgICAgICAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2ssIGxvYyApOworICAgIH0KK30KKworZXh0ZXJuIGttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitleHRlcm4gdm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgaWYgKCBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyAgIT0gTlVMTCApIHsKKyAgICAgICAgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrLCBmbGFncyApOworICAgIH0KK30KKworLy8KKy8vIFRoZSBmdWN0aW9uIHdoaWNoIHNldHMgdXAgYWxsIG9mIHRoZSB2dGJsIHBvaW50ZXJzIGZvciBrbXBfdXNlcl9sb2NrX3QuCisvLworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycygga21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kICk7CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBPbiA2NC1iaXQgTGludXgqIE9TIChhbmQgT1MgWCopIEdOVSBjb21waWxlciBhbGxvY2F0ZXMgb25seSA0IGJ5dGVtcyBtZW1vcnkgZm9yIGxvY2sgdmFyaWFibGUsIHdoaWNoCisgICAgaXMgbm90IGVub3VnaCB0byBzdG9yZSBhIHBvaW50ZXIsIHNvIHdlIGhhdmUgdG8gdXNlIGxvY2sgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGFuZAorICAgIG1haW50YWluIGxvY2sgdGFibGUgdG8gbWFwIGluZGV4ZXMgdG8gcG9pbnRlcnMuCisKKworICAgIE5vdGU6IFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0YWJsZSBpcyBub3QgYSBwb2ludGVyIHRvIGxvY2shIEl0IGlzIGEgcG9pbnRlciB0byBwcmV2aW91c2x5CisgICAgYWxsb2NhdGVkIHRhYmxlIChvciBOVUxMIGlmIGl0IGlzIHRoZSBmaXJzdCB0YWJsZSkuCisKKyAgICBVc2FnZToKKworICAgICAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZiggPGxvY2s+ICkgKSB7IC8vIG9yIE9NUF9ORVNUX0xPQ0tfVF9TSVpFCisgICAgICAgICAgICBMb2NrIHRhYmxlIGlzIGZ1bGx5IHV0aWxpemVkLiBVc2VyIGxvY2tzIGFyZSBpbmRleGVzLCBzbyB0YWJsZSBpcworICAgICAgICAgICAgdXNlZCBvbiB1c2VyIGxvY2sgb3BlcmF0aW9uLgorICAgICAgICAgICAgTm90ZTogaXQgbWF5IGJlIHRoZSBjYXNlIChsaW5fMzIpIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB1c2UgYSBsb2NrCisgICAgICAgICAgICB0YWJsZSBmb3IgcmVndWxhciBsb2NrcywgYnV0IGRvIG5lZWQgdGhlIHRhYmxlIGZvciBuZXN0ZWQgbG9ja3MuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb2NrIHRhYmxlIGluaXRpYWxpemVkIGJ1dCBub3QgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgfQorKi8KKworc3RydWN0IGttcF9sb2NrX3RhYmxlIHsKKyAgICBrbXBfbG9ja19pbmRleF90ICB1c2VkOyAgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzCisgICAga21wX2xvY2tfaW5kZXhfdCAgYWxsb2NhdGVkOyAvLyBOdW1iZXIgb2YgYWxsb2NhdGVkIGVsZW1lbnRzCisgICAga21wX3VzZXJfbG9ja19wICogdGFibGU7ICAgICAvLyBMb2NrIHRhYmxlLgorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2xvY2tfdGFibGUga21wX2xvY2tfdGFibGVfdDsKKworZXh0ZXJuIGttcF9sb2NrX3RhYmxlX3QgX19rbXBfdXNlcl9sb2NrX3RhYmxlOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2w7CisKK3N0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgeworICAgIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgKiBuZXh0X2Jsb2NrOworICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICBsb2NrczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyBrbXBfYmxvY2tfb2ZfbG9ja3NfdDsKKworZXh0ZXJuIGttcF9ibG9ja19vZl9sb2Nrc190ICpfX2ttcF9sb2NrX2Jsb2NrczsKK2V4dGVybiBpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworCitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB2b2lkICoqdXNlcl9sb2NrLCBjaGFyIGNvbnN0ICpmdW5jICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApICkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSApIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MsIFRSVUUgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworI3VuZGVmIEtNUF9QQUQKKyN1bmRlZiBLTVBfR1RJRF9ETkUKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX0xPQ0tfSCAqLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX29tcC5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdkYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIGttcF9vbXAuaCAtLSBPcGVuTVAgZGVmaW5pdGlvbiBmb3Iga21wX29tcF9zdHJ1Y3RfaW5mb190LgorICogICAgICAgICAgICAgIFRoaXMgaXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHJ1bnRpbWUgbGlicmFyeSBzdHJ1Y3R1cmVzLgorICogJFJldmlzaW9uOiA0MjEwNSAkCisgKiAkRGF0ZTogMjAxMy0wMy0xMSAxNDo1MTozNCAtMDUwMCAoTW9uLCAxMSBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiBUSElTIEZJTEUgU0hPVUxEIE5PVCBCRSBNT0RJRklFRCBJTiBJREIgSU5URVJGQUNFIExJQlJBUlkgQ09ERQorICogSXQgc2hvdWxkIGluc3RlYWQgYmUgbW9kaWZpZWQgaW4gdGhlIE9wZW5NUCBydW50aW1lIGFuZCBjb3BpZWQKKyAqIHRvIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBjb2RlLiAgVGhpcyB3YXkgd2UgY2FuIG1pbmltaXplIHRoZQorICogcHJvYmxlbXMgdGhhdCB0aGlzIGlzIHN1cmUgdG8gY2F1c2UgaGF2aW5nIHR3byBjb3BpZXMgb2YgdGhlCisgKiBzYW1lIGZpbGUuCisgKgorICogZmlsZXMgbGl2ZSBpbiBsaWJvbXAgYW5kIGxpYm9tcF9kYi9zcmMvaW5jbHVkZQorICovCisKKy8qIENIQU5HRSBUSElTIFdIRU4gU1RSVUNUVVJFUyBCRUxPVyBDSEFOR0UKKyAqIEJlZm9yZSB3ZSByZWxlYXNlIHRoaXMgdG8gYSBjdXN0b21lciwgcGxlYXNlIGRvbid0IGNoYW5nZSB0aGlzIHZhbHVlLiAgQWZ0ZXIgaXQgaXMgcmVsZWFzZWQgYW5kCisgKiBzdGFibGUsIHRoZW4gYW55IG5ldyB1cGRhdGVzIHRvIHRoZSBzdHJ1Y3R1cmVzIG9yIGRhdGEgc3RydWN0dXJlIHRyYXZlcnNhbCBhbGdvcml0aG1zIG5lZWQgdG8KKyAqIGNoYW5nZSB0aGlzIHZhbHVlLgorICovCisjZGVmaW5lIEtNUF9PTVBfVkVSU0lPTiA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgIG9mZnNldDsKKyAgICBrbXBfaW50MzIgIHNpemU7Cit9IG9mZnNldF9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgICBhZGRyOworICAgIGttcF9pbnQzMiAgICAgc2l6ZTsKKyAgICBrbXBfaW50MzIgICAgIHBhZGRpbmc7Cit9IGFkZHJfYW5kX3NpemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91aW50NjQgICBmbGFnczsgICAgICAgICAvLyBGbGFncyBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisgICAga21wX3VpbnQ2NCAgIGZpbGU7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF91aW50NjQgICBmdW5jOyAgICAgICAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2Ygcm91dGluZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF9pbnQzMiAgICBiZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2Ygc291cmNlIGxpbmUgcmFuZ2UuCisgICAga21wX2ludDMyICAgIGVuZDsgICAgICAgICAgIC8vIEVuZCBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgbnVtX3RocmVhZHM7ICAgLy8gU3BlY2lmaWVkIG51bWJlciBvZiB0aHJlYWRzLgorfSBrbXBfb21wX250aHJfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2ludDMyICAgICBudW07ICAgICAgICAgIC8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJycmF5LgorICAgIGttcF91aW50NjQgICAgYXJyYXk7ICAgICAgICAvLyBBZGRyZXNzIG9mIGFycmF5IG9mIGttcF9vbXBfbnVtX3RocmVhZHNfaXRlbV90LgorfSBrbXBfb21wX250aHJfaW5mb190OworCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIGtub3duIHRvIHRoZSBpZGIgaW50ZXJmYWNlIGxpYnJhcnkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIC8qIENoYW5nZSB0aGlzIG9ubHkgaWYgeW91IG1ha2UgYSBmdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZSBjaGFuZ2UgaGVyZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsaWJfdmVyc2lvbjsKKworICAgIC8qIHNhbml0eSBjaGVjay4gIE9ubHkgc2hvdWxkIGJlIGNoZWNrZWQgaWYgdmVyc2lvbnMgYXJlIGlkZW50aWNhbAorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIGdldCB0aGUgcnVudGltZQorICAgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBzaXplb2ZfdGhpc19zdHJ1Y3R1cmU7CisKKyAgICAvKiBPcGVuTVAgUlRMIHZlcnNpb24gaW5mby4gKi8KKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWFqb3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIG1pbm9yOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBidWlsZDsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYmFubmVyOworCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgdGhyZWFkczsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHMuCisgICAgYWRkcl9hbmRfc2l6ZV90ICByb290czsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGNhcGFjaXR5OyAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LgorICAgIGFkZHJfYW5kX3NpemVfdCAgbW9uaXRvcjsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisgICAgYWRkcl9hbmRfc2l6ZV90ICBsb2NrX3RhYmxlOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfbG9ja190YWJsZS4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfbWljcm90YXNrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGVhbV9jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGFza19jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgbnRocl9pbmZvOworICAgIGttcF9pbnQzMiAgICAgICAgYWRkcmVzc193aWR0aDsKKyAgICBrbXBfaW50MzIgICAgICAgIGluZGV4ZWRfbG9ja3M7CisgICAga21wX2ludDMyICAgICAgICBsYXN0X2JhcnJpZXI7CisgICAga21wX2ludDMyICAgICAgICBkZXF1ZV9zaXplOworCisgICAgLyogdGhyZWFkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdGhfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaW5mbzsgICAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3RlYW07ICAgICAgICAgIC8vIHRlYW0gZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Jvb3Q7ICAgICAgICAgIC8vIHJvb3QgZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NlcmlhbF90ZWFtOyAgIC8vIHNlcmlhbCB0ZWFtIHVuZGVyIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2lkZW50OyAgICAgICAgIC8vIGxvY2F0aW9uIGZvciB0aGlzIHRocmVhZCAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9zcGluX2hlcmU7ICAgICAvLyBpcyB0aHJlYWQgd2FpdGluZyBmb3IgbG9jayAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9uZXh0X3dhaXRpbmc7ICAvLyBuZXh0IHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Rhc2tfdGVhbTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfY3VycmVudF90YXNrOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3N0YXRlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2Jfd29ya2VyX2Fycml2ZWQ7CisKKyAgICAvKiBrbXBfZGVzYyBzdHJ1Y3R1cmUgKGZvciBpbmZvIGZpZWxkIGFib3ZlKSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBkc19zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aWQ7ICAgICAgICAgICAvLyB0ZWFtIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc19ndGlkOyAgICAgICAgICAvLyBnbG9iYWwgdGhyZWFkIGlkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRzX3RocmVhZDsgICAgICAgIC8vIG5hdGl2ZSB0aHJlYWQgaWQKKworICAgIC8qIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIHRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9tYXN0ZXJfdGlkOyAgICAgLy8gdGlkIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkZW50OyAgICAgICAgICAvLyBsb2NhdGlvbiBvZiBwYXJhbGxlbCByZWdpb24KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9wYXJlbnQ7ICAgICAgICAgLy8gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9ucHJvYzsgICAgICAgICAgLy8gIyB0ZWFtIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF90aHJlYWRzOyAgICAgICAgLy8gYXJyYXkgb2YgdGhyZWFkcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3NlcmlhbGl6ZWQ7ICAgICAvLyAjIGxldmVscyBvZiBzZXJpYWxpemVkIHRlYW1zCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaWQ7ICAgICAgICAgICAgIC8vIHVuaXF1ZSB0ZWFtIGlkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGtmbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF90YXNrX3RlYW07CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaW1wbGljaXRfdGFzazsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfYl9tYXN0ZXJfYXJyaXZlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX3RlYW1fYXJyaXZlZDsKKworICAgIC8qIHJvb3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIHJfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X3RlYW07ICAgICAgLy8gdGVhbSBhdCByb290CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfaG90X3RlYW07ICAgICAgIC8vIGhvdCB0ZWFtIGZvciB0aGlzIHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl91YmVyX3RocmVhZDsgICAgLy8gcm9vdCB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X2lkOyAgICAgICAgLy8gdW5pcXVlIHJvb3QgaWQgKGlmIGF2YWlsYWJsZSkKKworICAgIC8qIGlkZW50IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBpZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9wc291cmNlOyAgICAgICAvKiBhZGRyZXNzIG9mIHN0cmluZyAiO2ZpbGU7ZnVuYztsaW5lMTtsaW5lMjs7Ii4gKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaWRfZmxhZ3M7CisKKyAgICAvKiBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsa19zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19pbml0aWFsaXplZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbG9jYXRpb247CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX3RhaWxfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2hlYWRfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25leHRfdGlja2V0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19ub3dfc2VydmluZzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfb3duZXJfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2RlcHRoX2xvY2tlZDsKKworICAgIC8qIGxvY2tfdGFibGVfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsdF9zaXplX29mX3N0cnVjdDsgICAgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3VzZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X2FsbG9jYXRlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbHRfdGFibGU7CisKKyAgICAvKiB0YXNrX3RlYW1fdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0dF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF90aHJlYWRzX2RhdGE7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2ZvdW5kX3Rhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9ucHJvYzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfdW5maW5pc2hlZF90aHJlYWRzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9hY3RpdmU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3N0YXRlOworCisgICAgLyoga21wX3Rhc2tkYXRhX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdGRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza19pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfZmxhZ3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3RlYW07CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3BhcmVudDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaWRlbnQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrczsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsKKworICAgIC8qIGttcF90aHJlYWRfZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIGhkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9oZWFkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV90YWlsOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9udGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX2xhc3Rfc3RvbGVuOworCisgICAgLy8gVGhlIGxhc3QgZmllbGQgb2Ygc3RhYmxlIHZlcnNpb24uCisgICAga21wX3VpbnQ2NCAgICAgICAgIGxhc3RfZmllbGQ7CisgICAgLy8gRXh0ZW5zaW9ucy4gCisgICAgLy8gV2hlbiBLTVBfT01QX1ZFUlNJT04gaXMgYnVtcGVkLCBtb3ZlIHRoZXNlIGZpZWxkcyB1cCB0byBhcHByb3ByaWF0ZSBsb2NhdGlvbiwKKyAgICAvLyB0byBsZXQgbGFzdF9maWVsZCBiZSBhY3R1YWxseSBsYXN0LgorICAgIGFkZHJfYW5kX3NpemVfdCAgICBvcGVubXBfdmVyc2lvbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2NvdW50ZXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X3RocmVhZDsKKworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NrX2ZsYWdzOworCit9IGttcF9vbXBfc3RydWN0X2luZm9fdDsKKworCisvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9vcy5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNWU3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX29zLmgKQEAgLTAsMCArMSw3OTggQEAKKy8qCisgKiBrbXBfb3MuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyODIwICQKKyAqICREYXRlOiAyMDEzLTExLTEzIDE2OjUzOjQ0IC0wNjAwIChXZWQsIDEzIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX09TX0gKKyNkZWZpbmUgS01QX09TX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEtNUF9GVE5fUExBSU4gICAxCisjZGVmaW5lIEtNUF9GVE5fQVBQRU5EICAyCisjZGVmaW5lIEtNUF9GVE5fVVBQRVIgICAzCisvKgorI2RlZmluZSBLTVBfRlROX1BSRVBFTkQgNAorI2RlZmluZSBLTVBfRlROX1VBUFBFTkQgNQorKi8KKworI2RlZmluZSBLTVBfUFRSX1NLSVAgICAgKHNpemVvZih2b2lkKikpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbXBpbGVyIHZhcmlhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX09GRgkJCQkwCisjZGVmaW5lIEtNUF9PTgkJCQkxCisKKyNkZWZpbmUgS01QX01FTV9DT05TX1ZPTEFUSUxFCQkwCisjZGVmaW5lIEtNUF9NRU1fQ09OU19GRU5DRQkJMQorCisjaWZuZGVmIEtNUF9NRU1fQ09OU19NT0RFTAorIyBkZWZpbmUgS01QX01FTV9DT05TX01PREVMCSBLTVBfTUVNX0NPTlNfVk9MQVRJTEUKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbXBpbGVyIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgS01QX0NPTVBJTEVSX0lDQyAwCisjZGVmaW5lIEtNUF9DT01QSUxFUl9HQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMAorCisjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMQorI2VsaWYgZGVmaW5lZCggX19jbGFuZ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0NMQU5HCisjIGRlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMQorI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfR0NDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbHNlCisjIGVycm9yIFVua25vd24gY29tcGlsZXIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGluZyBzeXN0ZW0gcmVjb2duaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PU19MSU5VWCAgICAwCisjZGVmaW5lIEtNUF9PU19GUkVFQlNEICAwCisjZGVmaW5lIEtNUF9PU19EQVJXSU4gICAwCisjZGVmaW5lIEtNUF9PU19XSU5ET1dTICAgIDAKKyNkZWZpbmUgS01QX09TX1VOSVggICAgIDAgIC8qIGRpc2p1bmN0aW9uIG9mIEtNUF9PU19MSU5VWCwgS01QX09TX0RBUldJTiBldGMuICovCisKKyNkZWZpbmUgS01QX0FSQ0hfWDg2ICAgICAgICAwCisjZGVmaW5lIEtNUF9BUkNIX1g4Nl82NAkgICAgMAorCisjaWZkZWYgX1dJTjMyCisjIHVuZGVmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfT1NfV0lORE9XUyAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyApCisjIHVuZGVmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19saW51eCApCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbmRpZgorCisjaWYgKCBkZWZpbmVkIF9fRnJlZUJTRF9fICkKKyMgdW5kZWYgS01QX09TX0ZSRUVCU0QKKyMgZGVmaW5lIEtNUF9PU19GUkVFQlNEIDEKKyNlbmRpZgorCisjaWYgKDEgIT0gS01QX09TX0xJTlVYICsgS01QX09TX0ZSRUVCU0QgKyBLTVBfT1NfREFSV0lOICsgS01QX09TX1dJTkRPV1MpCisjIGVycm9yIFVua25vd24gT1MKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19EQVJXSU4KKyMgdW5kZWYgS01QX09TX1VOSVgKKyMgZGVmaW5lIEtNUF9PU19VTklYIDEKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgZGVmaW5lZCBfTV9BTUQ2NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxzZQorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyMgaWYgZGVmaW5lZCBfX3g4Nl82NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxpZiBkZWZpbmVkIF9faTM4NgorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdfXykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY3IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82S19fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjYgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY2KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81RV9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY1IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNSkgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNF9fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNFRfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY0IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNCkgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfM19fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfM01fXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVYzIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WMykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjIgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVYyKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNIDEKKyNlbmRpZgorCisjaWYgKDEgIT0gS01QX0FSQ0hfWDg2ICsgS01QX0FSQ0hfWDg2XzY0ICsgS01QX0FSQ0hfQVJNKQorIyBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKKy8qIENoZWNrIGZvciBxdWFkLXByZWNpc2lvbiBleHRlbnNpb24uICovCisjZGVmaW5lIEtNUF9IQVZFX1FVQUQgMAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgaWYgS01QX0NPTVBJTEVSX0lDQworICAgLyogX1F1YWQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciBpY2MgKi8KKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVsaWYgS01QX0NPTVBJTEVSX0NMQU5HCisgICAvKiBDbGFuZyBkb2Vzbid0IHN1cHBvcnQgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZAorICAgICAgMTI4LWJpdCBleHRlbmRlZCBwcmVjaXNpb24gdHlwZSB5ZXQgKi8KKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjIGVsaWYgS01QX0NPTVBJTEVSX0dDQworICAgdHlwZWRlZiBfX2Zsb2F0MTI4IF9RdWFkOworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZW5kaWYKKyNlbHNlCisjIGlmIF9fTERCTF9NQVhfRVhQX18gPj0gMTYzODQgJiYgS01QX0NPTVBJTEVSX0dDQworICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVuZGlmCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICBrbXBfaW50ODsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICBrbXBfdWludDg7CisgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAga21wX2ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgIGttcF91aW50MTY7CisgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAga21wX2ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgIGttcF91aW50MzI7CisjIGRlZmluZSBLTVBfSU5UMzJfU1BFQyAgICAgImQiCisjIGRlZmluZSBLTVBfVUlOVDMyX1NQRUMgICAgInUiCisjIGlmbmRlZiBLTVBfU1RSVUNUNjQKKyAgIHR5cGVkZWYgX19pbnQ2NCAJCWttcF9pbnQ2NDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAJa21wX3VpbnQ2NDsKKyAgICNkZWZpbmUgS01QX0lOVDY0X1NQRUMgCSJJNjRkIgorICAgI2RlZmluZSBLTVBfVUlOVDY0X1NQRUMJIkk2NHUiCisjIGVsc2UKKyAgIHN0cnVjdCBrbXBfc3RydWN0NjQgeworICAgIGttcF9pbnQzMiAgIGEsYjsKKyAgIH07CisgICB0eXBlZGVmIHN0cnVjdCBrbXBfc3RydWN0NjQga21wX2ludDY0OworICAgdHlwZWRlZiBzdHJ1Y3Qga21wX3N0cnVjdDY0IGttcF91aW50NjQ7CisgICAvKiBOb3Qgc3VyZSB3aGF0IHRvIHVzZSBmb3IgS01QX1tVXUlOVDY0X1NQRUMgaGVyZSAqLworIyBlbmRpZgorIyBpZiBLTVBfQVJDSF9YODZfNjQKKyMgIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgIAlrbXBfaW50cHRyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQJa21wX3VpbnRwdHJfdDsKKyMgIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgIAkiSTY0ZCIKKyMgIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDIAkiSTY0dSIKKyMgZW5kaWYKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAga21wX2ludDg7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIGttcF91aW50ODsKKyAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAga21wX2ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICBrbXBfdWludDE2OworICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICBrbXBfaW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgIGttcF91aW50MzI7CisgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgIGttcF9pbnQ2NDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcga21wX3VpbnQ2NDsKKyMgZGVmaW5lIEtNUF9JTlQzMl9TUEVDICAgICAgImQiCisjIGRlZmluZSBLTVBfVUlOVDMyX1NQRUMgICAgICJ1IgorIyBkZWZpbmUgS01QX0lOVDY0X1NQRUMJICAgICAibGxkIgorIyBkZWZpbmUgS01QX1VJTlQ2NF9TUEVDICAgICAibGx1IgorI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfU0laRV9UX1NQRUMgS01QX1VJTlQzMl9TUEVDCisjZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDY0X1NQRUMKKyNlbHNlCisjIGVycm9yICJDYW4ndCBkZXRlcm1pbmUgc2l6ZV90IHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyLiIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2CisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRikKKyNlbHNlCisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90ICBrbXBfc2l6ZV90OwordHlwZWRlZiBmbG9hdCAgIGttcF9yZWFsMzI7Cit0eXBlZGVmIGRvdWJsZSAga21wX3JlYWw2NDsKKworI2lmbmRlZiBLTVBfSU5UUFRSCisjIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgdHlwZWRlZiBsb25nICAgICAgICAgICAgIGttcF9pbnRwdHJfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgIGttcF91aW50cHRyX3Q7CisjIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgICAibGQiCisjIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDICAibHUiCisjZW5kaWYKKworI2lmZGVmIEtNUF9JOAorICB0eXBlZGVmIGttcF9pbnQ2NCAgICAgIGttcF9pbnQ7CisgIHR5cGVkZWYga21wX3VpbnQ2NCAgICAga21wX3VpbnQ7CisjIGRlZmluZSAgS01QX0lOVF9TUEVDCSBLTVBfSU5UNjRfU1BFQworIyBkZWZpbmUgIEtNUF9VSU5UX1NQRUMJIEtNUF9VSU5UNjRfU1BFQworIyBkZWZpbmUgIEtNUF9JTlRfTUFYICAgICgoa21wX2ludDY0KTB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorIyBkZWZpbmUgIEtNUF9JTlRfTUlOICAgICgoa21wX2ludDY0KTB4ODAwMDAwMDAwMDAwMDAwMExMKQorI2Vsc2UKKyAgdHlwZWRlZiBrbXBfaW50MzIgICAgICBrbXBfaW50OworICB0eXBlZGVmIGttcF91aW50MzIgICAgIGttcF91aW50OworIyBkZWZpbmUgIEtNUF9JTlRfU1BFQwkgS01QX0lOVDMyX1NQRUMKKyMgZGVmaW5lICBLTVBfVUlOVF9TUEVDCSBLTVBfVUlOVDMyX1NQRUMKKyMgZGVmaW5lICBLTVBfSU5UX01BWCAgICAoKGttcF9pbnQzMikweDdGRkZGRkZGKQorIyBkZWZpbmUgIEtNUF9JTlRfTUlOICAgICgoa21wX2ludDMyKTB4ODAwMDAwMDApCisjZW5kaWYgLyogS01QX0k4ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIHRlbXBsYXRlIGZvciBkZWJ1ZyBwcmludHMgc3BlY2lmaWNhdGlvbiAoIGQsIHUsIGxsZCwgbGx1ICksIGFuZCB0byBvYnRhaW4KKyAgICAvLyBzaWduZWQvdW5zaWduZWQgZmxhdm9ycyBvZiBhIHR5cGUKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IHRyYWl0c190IHsKKyAgICAgICAgdHlwZWRlZiBUICAgICAgICAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBUICAgICAgICAgICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogc3BlYzsKKyAgICB9OworICAgIC8vIGludAorICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgdHJhaXRzX3Q8IHNpZ25lZCBpbnQgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGludCAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgZG91YmxlICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgc3BlYzsKKyAgICB9OworICAgIC8vIHVuc2lnbmVkIGludAorICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgdHJhaXRzX3Q8IHVuc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gbG9uZyBsb25nCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBsb25nIGRvdWJsZSAgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICAgICAgICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIEtNUF9FWFBPUlQJZXh0ZXJuCS8qIGV4cG9ydCBkZWNsYXJhdGlvbiBpbiBndWlkZSBsaWJyYXJpZXMgKi8KKworI2lmIF9fR05VQ19fID09IDQKKyAgICAjZGVmaW5lIF9fZm9yY2VpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfU0laRSAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMCkKKyNkZWZpbmUgUEFHRV9BTElHTkVEKF9hZGRyKSAgICAgKCAhICgoc2l6ZV90KSBfYWRkciAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KShQQUdFX1NJWkUgLSAxKSkpCisjZGVmaW5lIEFMSUdOX1RPX1BBR0UoeCkgICAodm9pZCAqKSgoKHNpemVfdCkoeCkpICYgfigoc2l6ZV90KShQQUdFX1NJWkUgLSAxKSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydCBmb3IgY2FjaGUgYWxpZ25tZW50LCBwYWRkaW5nLCBldGMuIC0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUgbGluZSAqLworI2lmbmRlZiBDQUNIRV9MSU5FCisgICAgI2RlZmluZSBDQUNIRV9MSU5FICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzICovCisjZWxzZQorICAgICNpZiAoIENBQ0hFX0xJTkUgPCA2NCApICYmICEgZGVmaW5lZCggS01QX09TX0RBUldJTiApCisgICAgICAgIC8vIDIwMDYtMDItMTM6IFRoaXMgcHJvZHVjZXMgdG9vIG1hbnkgd2FybmluZ3Mgb24gT1MgWCouIERpc2FibGUgaXQgZm9yIGEgd2hpbGUuLi4KKyAgICAgICAgI3dhcm5pbmcgQ0FDSEVfTElORSBpcyB0b28gc21hbGwuCisgICAgI2VuZGlmCisjZW5kaWYgLyogQ0FDSEVfTElORSAqLworCisvKiBTR0kncyBjYWNoZSBwYWRkaW5nIGltcHJvdmVtZW50cyB1c2luZyBhbGlnbiBkZWNsIHNwZWNzIChWZXIgMTkpICovCisjaWYgIWRlZmluZWQgS01QX1BFUkZfVjE5CisjIGRlZmluZSBLTVBfUEVSRl9WMTkJCQlLTVBfT04KKyNlbmRpZgorCisvKiBTR0kncyBpbXByb3ZlbWVudHMgZm9yIGlubGluZSBhcmd2IChWZXIgMTA2KSAqLworI2lmICFkZWZpbmVkIEtNUF9QRVJGX1YxMDYKKyMgZGVmaW5lIEtNUF9QRVJGX1YxMDYJCQlLTVBfT04KKyNlbmRpZgorCisjZGVmaW5lIEtNUF9DQUNIRV9QUkVGRVRDSChBRERSKSAJLyogbm90aGluZyAqLworCisvKiBUZW1wb3Jhcnkgbm90ZTogaWYgcGVyZm9ybWFuY2UgdGVzdGluZyBvZiB0aGlzIHBhc3Nlcywgd2UgY2FuIHJlbW92ZQorICAgYWxsIHJlZmVyZW5jZXMgdG8gS01QX0RPX0FMSUdOIGFuZCByZXBsYWNlIHdpdGggS01QX0FMSUdOLiAgKi8KKyNpZiBLTVBfT1NfVU5JWCAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgS01QX0RPX0FMSUdOKGJ5dGVzKSAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorIyBkZWZpbmUgS01QX0FMSUdOX0NBQ0hFICAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChDQUNIRV9MSU5FKSkpCisjIGRlZmluZSBLTVBfQUxJR04oYnl0ZXMpICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjZWxzZQorIyBkZWZpbmUgS01QX0RPX0FMSUdOKGJ5dGVzKSAgX19kZWNsc3BlYyggYWxpZ24oYnl0ZXMpICkKKyMgZGVmaW5lIEtNUF9BTElHTl9DQUNIRSAgICAgIF9fZGVjbHNwZWMoIGFsaWduKENBQ0hFX0xJTkUpICkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyAgICAjZGVmaW5lIEtNUF9NSUMgIDEKKy8vIEludGVsKFIpIENvbXBvc2VyIFhFICgxMy4wKSBkZWZpbmVzIGJvdGggX19NSUNfXyBhbmQgX19NSUMyX18gIQorIyBpZiBfX01JQzJfXyB8fCBfX0tOQ19fCisgICAgI2RlZmluZSBLTVBfTUlDMSAwCisgICAgI2RlZmluZSBLTVBfTUlDMiAxCisjIGVsc2UKKyAgICAjZGVmaW5lIEtNUF9NSUMxIDEKKyAgICAjZGVmaW5lIEtNUF9NSUMyIDAKKyMgZW5kaWYKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTUlDICAwCisgICAgI2RlZmluZSBLTVBfTUlDMSAwCisgICAgI2RlZmluZSBLTVBfTUlDMiAwCisjZW5kaWYKKworLyogR2VuZXJhbCBwdXJwb3NlIGZlbmNlIHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAqLworZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgeworICAgIGttcF9ub19mZW5jZSwgICAgICAgICAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfYWNxdWlyZV9mZW5jZSwgICAgLyogQWNxdWlyZSAocmVhZCkgbWVtb3J5IGZlbmNlICovCisgICAga21wX3JlbGVhc2VfZmVuY2UsICAgIC8qIFJlbGVhc2UgKHdyaXRlKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfZnVsbF9mZW5jZSAgICAgICAgLyogRnVsbCAocmVhZCt3cml0ZSkgbWVtb3J5IGZlbmNlICovCit9OworCisKKy8vCisvLyBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworLy8KKworI2lmIEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfV0lORE9XUworCisjaW5jbHVkZSA8V2luZG93cy5oPgorCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZTY0KQorCisvLworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisvLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLChsb25nKShzdiksKGxvbmcpKGN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLCAobG9uZykodikgKQorIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KSh2KSApCisKK2lubGluZSBrbXBfcmVhbDMyIEtNUF9YQ0hHX1JFQUwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KQoreworICAgIGttcF9pbnQzMiB0bXAgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlKCAodm9sYXRpbGUgbG9uZyAqKXAsICoobG9uZyAqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCisvLworLy8gUm91dGluZXMgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBpbiBhc3NlbWJseS4KKy8vCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworCitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitleHRlcm4ga21wX2ludDggIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoICB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICBjdiwga21wX2ludDggIHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIHYgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yNjQoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5ENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAodm9sYXRpbGUga21wX2ludDMyKikocCksIChrbXBfaW50MzIpKGN2KSwgKGttcF9pbnQzMikoc3YpICkKKyMgZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAoa21wX2ludDY0KShzdikgKQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCAocCksIChjdiksIChzdikgKQorLy8jIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDMyKCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkNjQoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKworI2VsaWYgKEtNUF9BU01fSU5UUklOUyAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19EQVJXSU4pKSB8fCAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisKKy8qIGNhc3QgcCB0byBjb3JyZWN0IHR5cGUgc28gdGhhdCBwcm9wZXIgaW50cmluc2ljIHdpbGwgYmUgdXNlZCAqLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkM2NChwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NChwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQzMiAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQzMiAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTY0KHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDY0KHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9vciggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYW5kKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9vciggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5ENjQocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYW5kKCAoa21wX2ludDY0ICopKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLChrbXBfdWludDgpKGN2KSwoa21wX3VpbnQ4KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLChrbXBfdWludDE2KShjdiksKGttcF91aW50MTYpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwoa21wX3VpbnQ2NCkoY3YpLChrbXBfdWludDY0KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSB2b2lkICoqKShwKSwodm9pZCAqKShjdiksKHZvaWQgKikoc3YpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDgocCwgY3YsIHN2KSAgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLChrbXBfdWludDgpKGN2KSwoa21wX3VpbnQ4KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KHAsIGN2LCBzdikgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwoa21wX3VpbnQ2NCkoY3YpLChrbXBfdWludDY0KShzdikgKQorCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEOChwLCB2KSAgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksIChrbXBfdWludDgpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQxNihwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksIChrbXBfdWludDE2KSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLCAoa21wX3VpbnQzMikodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwgKGttcF91aW50NjQpKHYpICkKKworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQzMiopcCwgKihrbXBfaW50MzIqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCitpbmxpbmUga21wX3JlYWw2NCBLTVBfWENIR19SRUFMNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdikKK3sKKyAgICBrbXBfaW50NjQgdG1wID0gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAoa21wX2ludDY0KilwLCAqKGttcF9pbnQ2NCopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsNjQqKSZ0bXA7Cit9CisKKyNlbHNlCisKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yNjQoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5ENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAodm9sYXRpbGUga21wX2ludDMyKikocCksIChrbXBfaW50MzIpKGN2KSwgKGttcF9pbnQzMikoc3YpICkKKyMgZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAoa21wX2ludDY0KShzdikgKQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDgoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMTYoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMzIoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkNjQoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWwzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUw2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDY0KCAocCksICh2KSApOworCisjZW5kaWYgLyogS01QX0FTTV9JTlRSSU5TICovCisKKyMgaWYgIUtNUF9NSUMKKy8vCisvLyBubyByb3V0aW5lcyBmb3IgZmxvYXRpbmcgYWRkaXRpb24gb24gTUlDCisvLyBubyBpbnRyaW5zaWMgc3VwcG9ydCBmb3IgZmxvYXRpbmcgYWRkaXRpb24gb24gVU5JWAorLy8KK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDMyICggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2ICk7CitleHRlcm4ga21wX3JlYWw2NCBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCAoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworIyAgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREX1JFQUwzMihwLCB2KSAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIoIChwKSwgKHYpICkKKyMgIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERF9SRUFMNjQocCwgdikgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0KCAocCksICh2KSApCisjIGVuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLSByZWxheGVkIGNvbnNpc3RlbmN5IG1lbW9yeSBtb2RlbCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmZGVmIF9fQUJTT0ZUX1dJTgorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgYXNtICgibm9wIikKKyMgICBkZWZpbmUgS01QX0lNQigpICAgIGFzbSAoIm5vcCIpCisjIGVsc2UKKyMgICBkZWZpbmUgS01QX01CKCkgICAgIC8qIF9hc217IG5vcCB9ICovCisjICAgZGVmaW5lIEtNUF9JTUIoKSAgICAvKiBfYXNteyBub3AgfSAqLworIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZm5kZWYgS01QX01CCisjIGRlZmluZSBLTVBfTUIoKSAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfSU1CCisjIGRlZmluZSBLTVBfSU1CKCkgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMMzIKKyMgZGVmaW5lIEtNUF9TVF9SRUwzMihBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUw2NAorIyBkZWZpbmUgS01QX1NUX1JFTDY0KEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjIGRlZmluZSBLTVBfTERfQUNRMzIoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRNjQKKyMgZGVmaW5lIEtNUF9MRF9BQ1E2NChBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKy8vCisKKyNkZWZpbmUgVENSXzQoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzQoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSXzgoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzgoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSX1NZTkNfNChhKSAgICAgICAoYSkKKyNkZWZpbmUgVENXX1NZTkNfNChhLGIpICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfNChhLGIsYykgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgKGttcF9pbnQzMikoYiksIChrbXBfaW50MzIpKGMpKQorI2RlZmluZSBUQ1JfU1lOQ184KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ184KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ184KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDY0KShiKSwgKGttcF9pbnQ2NCkoYykpCisKKyNpZiBLTVBfQVJDSF9YODYKKworICAgICNkZWZpbmUgVENSX1BUUihhKSAgICAgICAgICAoKHZvaWQgKilUQ1JfNChhKSkKKyAgICAjZGVmaW5lIFRDV19QVFIoYSxiKSAgICAgICAgVENXXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDUl9TWU5DX1BUUihhKSAgICAgKCh2b2lkICopVENSX1NZTkNfNChhKSkKKyAgICAjZGVmaW5lIFRDV19TWU5DX1BUUihhLGIpICAgVENXX1NZTkNfNCgoYSksKGIpKQorICAgICNkZWZpbmUgVENYX1NZTkNfUFRSKGEsYixjKSAoKHZvaWQgKilUQ1hfU1lOQ180KChhKSwoYiksKGMpKSkKKworI2Vsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisKKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzgoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfOCgoYSksKGIpLChjKSkpCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworLyoKKyAqIElmIHRoZXNlIEZUTl97VFJVRSxGQUxTRX0gdmFsdWVzIGNoYW5nZSwgbWF5IG5lZWQgdG8KKyAqIGNoYW5nZSBzZXZlcmFsIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQKKyAqIGxhbmd1YWdlIGlzIEZvcnRyYW4sIG5vdCBDLgorICovCisKKyNpZm5kZWYgRlROX1RSVUUKKyMgZGVmaW5lIEZUTl9UUlVFICAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEZUTl9GQUxTRQorIyBkZWZpbmUgRlROX0ZBTFNFICAgICAgRkFMU0UKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgICAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICpucHIsIC4uLiApOworCisjaWZkZWYgVVNFX1ZPTEFUSUxFX0NBU1QKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh2b2xhdGlsZSB4KQorI2Vsc2UKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh4KQorI2VuZGlmCisKKyNpZmRlZiBLTVBfSTgKKyMgZGVmaW5lIEtNUF9XQUlUX1lJRUxEICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzgKKyMgZGVmaW5lIEtNUF9FUSAgICAgICAgICAgICAgICAgICBfX2ttcF9lcV84CisjIGRlZmluZSBLTVBfTkVRICAgICAgICAgICAgICAgICAgX19rbXBfbmVxXzgKKyMgZGVmaW5lIEtNUF9MVCAgICAgICAgICAgICAgICAgICBfX2ttcF9sdF84CisjIGRlZmluZSBLTVBfR0UgICAgICAgICAgICAgICAgICAgX19rbXBfZ2VfOAorIyBkZWZpbmUgS01QX0xFICAgICAgICAgICAgICAgICAgIF9fa21wX2xlXzgKKyNlbHNlCisjIGRlZmluZSBLTVBfV0FJVF9ZSUVMRCAgICAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisjIGRlZmluZSBLTVBfRVEgICAgICAgICAgICAgICAgICAgX19rbXBfZXFfNAorIyBkZWZpbmUgS01QX05FUSAgICAgICAgICAgICAgICAgIF9fa21wX25lcV80CisjIGRlZmluZSBLTVBfTFQgICAgICAgICAgICAgICAgICAgX19rbXBfbHRfNAorIyBkZWZpbmUgS01QX0dFICAgICAgICAgICAgICAgICAgIF9fa21wX2dlXzQKKyMgZGVmaW5lIEtNUF9MRSAgICAgICAgICAgICAgICAgICBfX2ttcF9sZV80CisjZW5kaWYgLyogS01QX0k4ICovCisKKy8qIFdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IGNvZGUgZ2VuIGJ1ZyB3aGVuIHRha2luZyBhZGRyZXNzIG9mIHN0YXRpYyBhcnJheSAoSW50ZWwoUikgNjQgVHJhY2tlciAjMTM4KSAqLworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiBLTVBfT1NfTElOVVgKKyMgZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfRUZJMl9XT1JLQVJPVU5EIHN0YXRpYworI2VuZGlmCisKKy8vIFN1cHBvcnQgb2YgQkdFVCB1c2FnZQorI2lmbmRlZiBLTVBfVVNFX0JHRVQKKyNkZWZpbmUgS01QX1VTRV9CR0VUIDEKKyNlbmRpZgorCisKKy8vIFN3aXRjaGVzIGZvciBPU1MgYnVpbGRzCisjaWZuZGVmIFVTRV9TWVNGU19JTkZPCisjIGRlZmluZSBVU0VfU1lTRlNfSU5GTyAgMAorI2VuZGlmCisjaWZuZGVmIFVTRV9DTVBYQ0hHX0ZJWAorIyBkZWZpbmUgVVNFX0NNUFhDSEdfRklYIDEKKyNlbmRpZgorCisvLyBXYXJuaW5nIGxldmVscworZW51bSBrbXBfd2FybmluZ3NfbGV2ZWwgeworICAgIGttcF93YXJuaW5nc19vZmYgPSAwLAkJLyogTm8gd2FybmluZ3MgKi8KKyAgICBrbXBfd2FybmluZ3NfbG93LAkJCS8qIE1pbmltYWwgd2FybmluZ3MgKGRlZmF1bHQpICovCisgICAga21wX3dhcm5pbmdzX2V4cGxpY2l0ID0gNiwJCS8qIEV4cGxpY2l0bHkgc2V0IHRvIE9OIC0gbW9yZSB3YXJuaW5ncyAqLworICAgIGttcF93YXJuaW5nc192ZXJib3NlCQkvKiByZXNlcnZlZCAqLworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX09TX0ggKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhNDFkMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jCkBAIC0wLDAgKzEsODU1OSBAQAorLyoKKyAqIGttcF9ydW50aW1lLmMgLS0gS1BUUyBydW50aW1lIHN1cHBvcnQgbGlicmFyeQorICogJFJldmlzaW9uOiA0MjgzOSAkCisgKiAkRGF0ZTogMjAxMy0xMS0yNCAxMzowMTowMCAtMDYwMCAoU3VuLCAyNCBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKworLyogdGhlc2UgYXJlIHRlbXBvcmFyeSBpc3N1ZXMgdG8gYmUgZGVhbHQgd2l0aCAqLworI2RlZmluZSBLTVBfVVNFX1BSQ1RMIDAKKyNkZWZpbmUgS01QX1VTRV9QT09MRURfQUxMT0MgMAorCisjaWYgS01QX01JQworI2luY2x1ZGUgPGltbWludHJpbi5oPgorI2RlZmluZSBVU0VfTkdPX1NUT1JFUyAxCisjZW5kaWYgLy8gS01QX01JQworCisjaWYgS01QX01JQyAmJiBVU0VfTkdPX1NUT1JFUworI2RlZmluZSBsb2FkX2ljdnMoc3JjKSAgICAgICAgIF9fbTUxMmQgVnRfaWN2cyA9IF9tbTUxMl9sb2FkX3BkKCh2b2lkICopKHNyYykpCisjZGVmaW5lIHN0b3JlX2ljdnMoZHN0LCBzcmMpICAgX21tNTEyX3N0b3JlbnJuZ29fcGQoKHZvaWQgKikoZHN0KSwgVnRfaWN2cykKKyNkZWZpbmUgc3luY19pY3ZzKCkgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgibG9jazsgYWRkbCAkMCwwKCUlcnNwKSIgOjo6ICJtZW1vcnkiKQorI2Vsc2UKKyNkZWZpbmUgbG9hZF9pY3ZzKHNyYykgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgc3RvcmVfaWN2cyhkc3QsIHNyYykgICBjb3B5X2ljdnMoKGRzdCksIChzcmMpKQorI2RlZmluZSBzeW5jX2ljdnMoKSAgICAgICAgICAgICgodm9pZCkwKQorI2VuZGlmIC8qIEtNUF9NSUMgJiYgVVNFX05HT19TVE9SRVMgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2FsdF9jb21wW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImFsdGVybmF0aXZlIGNvbXBpbGVyIHN1cHBvcnQ6IHllcyI7CisjZW5kaWYgLyogZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkFQSSB2ZXJzaW9uOiAiCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAiNC4wICgyMDEzMDcpIjsKKyNlbGlmIE9NUF8zMF9FTkFCTEVECisgICAgIjMuMSAoMjAxMTA3KSI7CisjZWxzZQorICAgICIyLjUgKDIwMDUwNSkiOworI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xvY2tbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibG9jayB0eXBlOiBydW4gdGltZSBzZWxlY3RhYmxlIjsKKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjE5W10gPSBLTVBfVkVSU0lPTl9QUkVGSVggInBlcmYgdjE5OiAiCisjaWYgS01QX1BFUkZfVjE5ID09IEtNUF9PTgorICAgICJvbiI7CisjZWxpZiBLTVBfUEVSRl9WMTkgPT0gS01QX09GRgorICAgICJvZmYiOworI2Vsc2UKKyAgICAjZXJyb3IgIk11c3Qgc3BlY2lmeSBLTVBfUEVSRl9WMTkgb3B0aW9uIgorI2VuZGlmCisKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9wZXJmX3YxMDZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAicGVyZiB2MTA2OiAiCisjaWYgS01QX1BFUkZfVjEwNiA9PSBLTVBfT04KKyAgICAib24iOworI2VsaWYgS01QX1BFUkZfVjEwNiA9PSBLTVBfT0ZGCisgICAgIm9mZiI7CisjZWxzZQorICAgICNlcnJvciAiTXVzdCBzcGVjaWZ5IEtNUF9QRVJGX1YxMDYgb3B0aW9uIgorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworCisjZGVmaW5lIEtNUF9NSU4oIHgsIHkgKSAoICh4KSA8ICh5KSA/ICh4KSA6ICh5KSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ttcF9pbmZvX3QgX19rbXBfbW9uaXRvcjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKwordm9pZCBfX2ttcF9jbGVhbnVwKCB2b2lkICk7CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRpYWxpemVfaW5mbygga21wX2luZm9fdCAqLCBrbXBfdGVhbV90ICosIGludCB0aWQsIGludCBndGlkICk7CitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX3RlYW0oCisgICAga21wX3RlYW1fdCAqIHRlYW0sCisgICAgaW50ICAgICAgICAgIG5ld19ucHJvYywKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLAorICAgICAgICBpZGVudF90ICogICAgICAgICAgICAgICAgbG9jCisgICAgI2Vsc2UKKyAgICAgICAgaW50IG5ld19zZXRfbnByb2MsIGludCBuZXdfc2V0X2R5bmFtaWMsIGludCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgaW50IG5ld19zZXRfYmxvY2t0aW1lLCBpbnQgbmV3X2J0X2ludGVydmFscywgaW50IG5ld19idF9zZXQKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyk7CitzdGF0aWMgdm9pZCBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCBrbXBfdGVhbV90ICp0ZWFtICk7CitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOworCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitzdGF0aWMgaW50IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqIHJvb3QsIGludCBzZXRfbnByb2MgKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKTsKK3N0YXRpYyBpbnQgX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZCggaW50IGd0aWQgKTsKK3N0YXRpYyB2b2lkIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSggdm9pZCApOyAvLyBjYWxsZWQgYnkgX19rbXBfaW50ZXJuYWxfZW5kKCkKK3N0YXRpYyB2b2lkIF9fa21wX3JlYXBfdGhyZWFkKCBrbXBfaW5mb190ICogdGhyZWFkLCBpbnQgaXNfcm9vdCApOworc3RhdGljIGttcF9pbmZvX3QgKl9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENhbGN1bGF0ZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKy8qIGZhc3QgKGFuZCBzb21ld2hhdCBwb3J0YWJsZSkgd2F5IHRvIGdldCB1bmlxdWUgKi8KKy8qIGlkZW50aWZpZXIgb2YgZXhlY3V0aW5nIHRocmVhZC4gICAgICAgICAgICAgICAgKi8KKy8qIHJldHVybnMgS01QX0dUSURfRE5FIGlmIHdlIGhhdmVuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQgICAqLworCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCApCit7CisgICAgaW50IGk7CisgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICBzaXplX3QgICAgICAgICBzdGFja19kYXRhOworICAgIGNoYXIgICAgICAgICAgKnN0YWNrX2FkZHI7CisgICAgc2l6ZV90ICAgICAgICAgc3RhY2tfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICpzdGFja19iYXNlOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogZW50ZXJpbmcsIG5wcm9jPSVkICBhbGxfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbnRoLCBfX2ttcF9hbGxfbnRoICkpOworCisgICAgLyogSlBIIC0gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIF9fa21wY19lbmQoMCkgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIGEKKyAgICAgICAgICAgICBwYXJhbGxlbCByZWdpb24sIG1hZGUgaXQgcmV0dXJuIEtNUF9HVElEX0RORSB0byBmb3JjZSBzZXJpYWxfaW5pdGlhbGl6ZSBieQorICAgICAgICAgICAgIGNhbGxlci4gIEhhZCB0byBoYW5kbGUgS01QX0dUSURfRE5FIGF0IGFsbCBjYWxsLXNpdGVzLCBvciBlbHNlIGd1YXJhbnRlZQorICAgICAgICAgICAgIF9fa21wX2luaXRfZ3RpZCBmb3IgdGhpcyB0byB3b3JrLiAgKi8KKworICAgIGlmICggIVRDUl80KF9fa21wX2luaXRfZ3RpZCkgKSByZXR1cm4gS01QX0dUSURfRE5FOworCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMykgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBUREFUQVxuIiApKTsKKyAgICAgICAgcmV0dXJuIF9fa21wX2d0aWQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICByZXR1cm4gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKworICAgIHN0YWNrX2FkZHIgICAgPSAoY2hhciopICYgc3RhY2tfZGF0YTsKKyAgICBvdGhlcl90aHJlYWRzID0gX19rbXBfdGhyZWFkczsKKworICAgIC8qCisgICAgICAgIEFUVDogVGhlIGNvZGUgYmVsb3cgaXMgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgZHVlIHRvIHVuc3luY2hyb25pemVkIGFjY2VzcyB0bworICAgICAgICBfX2ttcF90aHJlYWRzIGFycmF5LiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDEuIEN1cnJlbnQgdGhyZWFkIGxvYWRzIG90aGVyX3RocmVhZHNbaV0gdG8gdGhyIGFuZCBjaGVja3MgaXQsIGl0IGlzIG5vbi1OVUxMLgorICAgICAgICAgICAgMi4gQ3VycmVudCB0aHJlYWQgaXMgc3VzcGVuZGVkIGJ5IE9TLgorICAgICAgICAgICAgMy4gQW5vdGhlciB0aHJlYWQgdW5yZWdpc3RlcnMgYW5kIGZpbmlzaGVzIChkZWJ1ZyB2ZXJzaW9ucyBvZiBmcmVlKCkgbWF5IGZpbGwgbWVtb3J5CisgICAgICAgICAgICAgICB3aXRoIHNvbWV0aGluZyBsaWtlIDB4RUYpLgorICAgICAgICAgICAgNC4gQ3VycmVudCB0aHJlYWQgaXMgcmVzdW1lZC4KKyAgICAgICAgICAgIDUuIEN1cnJlbnQgdGhyZWFkIHJlYWRzIGp1bmsgZnJvbSAqdGhyLgorICAgICAgICBUT0RPOiBGaXggaXQuCisgICAgICAgIC0tbG4KKyAgICAqLworCisgICAgZm9yKCBpID0gMCA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgaSsrICkgeworCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICBpZiggIXRociApIGNvbnRpbnVlOworCisgICAgICAgIHN0YWNrX3NpemUgPSAgKHNpemVfdClUQ1JfUFRSKHRociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgIHN0YWNrX2Jhc2UgPSAgKGNoYXIgKilUQ1JfUFRSKHRociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSk7CisKKyAgICAgICAgLyogc3RhY2sgZ3Jvd3MgZG93biAtLSBzZWFyY2ggdGhyb3VnaCBhbGwgb2YgdGhlIGFjdGl2ZSB0aHJlYWRzICovCisKKyAgICAgICAgaWYoIHN0YWNrX2FkZHIgPD0gc3RhY2tfYmFzZSApIHsKKyAgICAgICAgICAgIHNpemVfdCBzdGFja19kaWZmID0gc3RhY2tfYmFzZSAtIHN0YWNrX2FkZHI7CisKKyAgICAgICAgICAgIGlmKCBzdGFja19kaWZmIDw9IHN0YWNrX3NpemUgKSB7CisgICAgICAgICAgICAgICAgLyogVGhlIG9ubHkgd2F5IHdlIGNhbiBiZSBjbG9zZXIgdGhhbiB0aGUgYWxsb2NhdGVkICovCisgICAgICAgICAgICAgICAgLyogc3RhY2sgc2l6ZSBpcyBpZiB3ZSBhcmUgcnVubmluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpID09IGkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBzcGVjaWZpYyB0byB0cnkgYW5kIGRldGVybWluZSBvdXIgZ3RpZCAqLworICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGludGVybmFsIGFsZy4gZmFpbGVkIHRvIGZpbmQgIgorICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQsIHVzaW5nIFRMU1xuIiApKTsKKyAgICBpID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKworICAgIC8qZnByaW50Ziggc3RkZXJyLCAiPT09ICVkXG4iLCBpICk7ICAqLyAvKiBHUk9PICovCisKKyAgICAvKiBpZiB3ZSBoYXZuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQsIHRoZW4gcmV0dXJuIGNvZGUgKi8KKyAgICBpZiggaTwwICkgcmV0dXJuIGk7CisKKyAgICAvKiBkeW5hbWljYWxseSB1cGRhdGVkIHN0YWNrIHdpbmRvdyBmb3IgdWJlciB0aHJlYWRzIHRvIGF2b2lkIGdldF9zcGVjaWZpYyBjYWxsICovCisgICAgaWYoICEgVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cpICkgeworICAgICAgICBLTVBfRkFUQUwoIFN0YWNrT3ZlcmZsb3csIGkgKTsKKyAgICB9CisKKyAgICBzdGFja19iYXNlID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXSAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICBpZiggc3RhY2tfYWRkciA+IHN0YWNrX2Jhc2UgKSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsIHN0YWNrX2FkZHIpOworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplICsgc3RhY2tfYWRkciAtIHN0YWNrX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyKTsKKyAgICB9CisKKyAgICAvKiBSZXByaW50IHN0YWNrIGJvdW5kcyBmb3IgdWJlcm1hc3RlciBzaW5jZSB0aGV5IGhhdmUgYmVlbiByZWZpbmVkICovCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgY2hhciAqc3RhY2tfZW5kID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXSAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgY2hhciAqc3RhY2tfYmVnID0gc3RhY2tfZW5kIC0gb3RoZXJfdGhyZWFkc1tpXSAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaSwgc3RhY2tfYmVnLCBzdGFja19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0gLT4gdGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAocmVmaW5lbWVudCkiLCBpICk7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZyggKQoreworICAgIGludCBndGlkOworCisgICAgaWYgKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIGd0aWQgPSBLTVBfR1RJRF9ETkU7CisgICAgfSBlbHNlCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMyApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIFREQVRBXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZDsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAyICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCk7CisgICAgfQorCisgICAgLyogd2UgbXVzdCBiZSBhIG5ldyB1YmVyIG1hc3RlciBzaWJsaW5nIHRocmVhZCAqLworICAgIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IEVuY291bnRlcmVkIG5ldyByb290IHRocmVhZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGEgbmV3IGd0aWQuXG4iICkpOworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICBpZiggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3RpZCA9IF9fa21wX3JlZ2lzdGVyX3Jvb3QoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIC8qX19rbXBfcHJpbnRmKCAiKysrICVkXG4iLCBndGlkICk7ICovIC8qIEdST08gKi8KKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49MCApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgZm9ya2pvaW5fbG9jayAqLwordm9pZAorX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCgga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBmOworICAgIGNoYXIgKnN0YWNrX2JlZyA9IE5VTEw7CisgICAgY2hhciAqc3RhY2tfZW5kID0gTlVMTDsKKyAgICBpbnQgZ3RpZDsKKworICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogY2FsbGVkXG4iKSk7CisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgc3RhY2tfZW5kID0gKGNoYXIgKikgdGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworCisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworCisgICAgICAgIGlmIChndGlkID09IEtNUF9HVElEX01PTklUT1IpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVzIHN0YWNrICglcykiLCAibW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyApID8gImluaXRpYWwiIDogImFjdHVhbCIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrICglcykiLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gcG9pbnQgaW4gY2hlY2tpbmcgdWJlcm1hc3RlciB0aHJlYWRzIHNpbmNlIHRoZXkgdXNlIHJlZmluZW1lbnQgYW5kIGNhbm5vdCBvdmVybGFwICovCisgICAgaWYgKCBfX2ttcF9lbnZfY2hlY2tzID09IFRSVUUgJiYgIUtNUF9VQkVSX0dUSUQoZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkpKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsKCJfX2ttcF9jaGVja19zdGFja19vdmVybGFwOiBwZXJmb3JtaW5nIGV4dGVuc2l2ZSBjaGVja2luZ1xuIikpOworICAgICAgICBpZiAoIHN0YWNrX2JlZyA9PSBOVUxMICkgeworICAgICAgICAgICAgc3RhY2tfZW5kID0gKGNoYXIgKikgdGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggZj0wIDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBmKysgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpmX3RoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tmXSk7CisKKyAgICAgICAgICAgIGlmKCBmX3RoICYmIGZfdGggIT0gdGggKSB7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfZW5kID0gKGNoYXIgKilUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKyAgICAgICAgICAgICAgICBjaGFyICpvdGhlcl9zdGFja19iZWcgPSBvdGhlcl9zdGFja19lbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYoKHN0YWNrX2JlZyA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19iZWcgPCBvdGhlcl9zdGFja19lbmQpIHx8CisgICAgICAgICAgICAgICAgICAgKHN0YWNrX2VuZCA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19lbmQgPCBvdGhlcl9zdGFja19lbmQpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIG90aGVyIHN0YWNrIHZhbHVlcyBiZWZvcmUgdGhlIGFib3J0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsIG90aGVyX3N0YWNrX2JlZywgb3RoZXJfc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChvdmVybGFwcGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggZl90aCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFN0YWNrT3ZlcmxhcCApLCBLTVBfSE5UKCBDaGFuZ2VTdGFja0xpbWl0ICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcmV0dXJuaW5nXG4iKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgS01QX0RFQlVHCisjIGRlZmluZSBfX2ttcF9zdGF0aWNfZGVsYXkoIGFyZyApICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZWxzZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX2RlbGF5KCBpbnQgYXJnICkKK3sKKy8qIFdvcmsgYXJvdW5kIHdlaXJkIGNvZGUtZ2VuIGJ1ZyB0aGF0IGNhdXNlcyBhc3NlcnQgdG8gdHJpcCAqLworIyBpZiBLTVBfQVJDSF9YODZfNjQgJiYgS01QX09TX0xJTlVYCisgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyMgZWxzZQorICAgIEtNUF9BU1NFUlQoIGFyZyA+PSAwICk7CisjIGVuZGlmCit9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfeWllbGQoIGludCBhcmcgKQoreworICAgIF9fa21wX3lpZWxkKCBhcmcgKTsKK30KKworLyoKKyAqIFNwaW4gd2FpdCBsb29wIHRoYXQgZmlyc3QgZG9lcyBwYXVzZSwgdGhlbiB5aWVsZCwgdGhlbiBzbGVlcC4KKyAqIFdhaXQgdW50aWwgc3Bpbm5lciBpcyBlcXVhbCB0byBjaGVja2VyIHRvIGV4aXQuCisgKgorICogQSB0aHJlYWQgdGhhdCBjYWxscyBfX2ttcF93YWl0X3NsZWVwIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgYW5vdGhlciB0aHJlYWQKKyAqIGNhbGxzIF9fa21wX3JlbGVhc2UgdG8gd2FrZSBpdCBiYWNrIHVwIHVwIHRvIHByZXZlbnQgZGVhZGxvY2tzIQorICovCisKK3ZvaWQKK19fa21wX3dhaXRfc2xlZXAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIsCisgICAgICAgICAgICAgICAgICBrbXBfdWludCBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHICh2b2lkICogaXR0X3N5bmNfb2JqKQorKQoreworICAgIC8qIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50ICovCisgICAgcmVnaXN0ZXIgdm9sYXRpbGUga21wX3VpbnQgICAgKnNwaW4gICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQgICAgIGNoZWNrICAgICA9IGNoZWNrZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgIHNwaW5zOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBoaWJlcm5hdGU7CisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHRoX2d0aWQsIHRoX3RpZDsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBmbGFnID0gRkFMU0U7CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIHNwaW4sIE5VTEwgKTsKKyAgICBpZiggVENSXzQoKnNwaW4pID09IGNoZWNrICkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggc3BpbiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhfZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfd2FpdF9zbGVlcDogVCMlZCB3YWl0aW5nIGZvciBzcGluKCVwKSA9PSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHRoX2d0aWQsCisgICAgICAgICAgICAgICAgICBzcGluLCBjaGVjayApICk7CisKKyAgICAvKiBzZXR1cCBmb3Igd2FpdGluZyAqLworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWRzIGNhbm5vdCByZWx5IG9uIHRoZSB0ZWFtIHN0cnVjdCBleGlzdGluZyBhdCB0aGlzCisgICAgICAgIC8vIHBvaW50LiAgVXNlIHRoZSBidCB2YWx1ZXMgY2FjaGVkIGluIHRoZSB0aHJlYWQgc3RydWN0IGluc3RlYWQuCisgICAgICAgIC8vCisgI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGlmICggX19rbXBfemVyb19idCAmJiAhIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCApIHsKKyAgICAgICAgICAgIC8qIGZvcmNlIGltbWVkaWF0ZSBzdXNwZW5kIGlmIG5vdCBzZXQgYnkgdXNlciBhbmQgbW9yZSB0aHJlYWRzIHRoYW4gYXZhaWxhYmxlIHByb2NzICovCisgICAgICAgICAgICBoaWJlcm5hdGUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGliZXJuYXRlID0gdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzOworICAgICAgICB9CisgI2Vsc2UKKyAgICAgICAgaGliZXJuYXRlID0gdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzOworICNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoZSBibG9ja3RpbWUgaXMgbm9uemVybywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzcGluCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBlbnRpcmV0eSBvZiB0aGUgc3BlY2lmaWVkICNpbnRlcnZhbHMsIHBsdXMgdXAgdG8KKyAgICAgICAgLy8gb25lIGludGVydmFsIG1vcmUuICBUaGlzIGluY3JlbWVudCBtYWtlIGNlcnRhaW4gdGhhdCB0aGlzIHRocmVhZAorICAgICAgICAvLyBkb2Vzbid0IGdvIHRvIHNsZWVwIHRvbyBzb29uLgorICAgICAgICAvLworICAgICAgICBpZiAoIGhpYmVybmF0ZSAhPSAwICkgeworICAgICAgICAgICAgaGliZXJuYXRlKys7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBBZGQgaW4gdGhlIGN1cnJlbnQgdGltZSB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgaGliZXJuYXRlICs9IFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApOworCisgICAgICAgIEtGX1RSQUNFKCAyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIG5vdz0lZCwgaGliZXJuYXRlPSVkLCBpbnRlcnZhbHM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCBoaWJlcm5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGhpYmVybmF0ZSAtIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkpOworICAgIH0KKworICAgIEtNUF9NQigpOworCisgICAgLyogbWFpbiB3YWl0IHNwaW4gbG9vcCAqLworICAgIHdoaWxlKCBUQ1JfNCgqc3BpbikgIT0gY2hlY2sgKSB7CisgICAgICAgIGludCBpbl9wb29sOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIHRhc2sgdGVhbSBpcyBOVUxMLCBpdCBtZWFucyBvbmUgb2YgdGhpbmdzOgorICAgICAgICAvLyAgIDEpIEEgbmV3bHktY3JlYXRlZCB0aHJlYWQgaXMgZmlyc3QgYmVpbmcgcmVsZWFzZWQgYnkKKyAgICAgICAgLy8gICAgICBfX2ttcF9mb3JrX2JhcnJpZXIoKSwgYW5kIGl0cyB0YXNrIHRlYW0gaGFzIG5vdCBiZWVuIHNldCB1cAorICAgICAgICAvLyAgICAgIHlldC4KKyAgICAgICAgLy8gICAyKSBBbGwgdGFza3MgaGF2ZSBiZWVuIGV4ZWN1dGVkIHRvIGNvbXBsZXRpb24sIHRoaXMgdGhyZWFkIGhhcworICAgICAgICAvLyAgICAgIGRlY3JlbWVudGVkIHRoZSB0YXNrIHRlYW0ncyByZWYgY3QgYW5kIHBvc3NpYmx5IGRlYWxsb2NhdGVkCisgICAgICAgIC8vICAgICAgaXQsIGFuZCBzaG91bGQgbm8gbG9uZ2VyIHJlZmVyZW5jZSBpdC4KKyAgICAgICAgLy8gICAzKSBUYXNraW5nIGlzIG9mZiBmb3IgdGhpcyByZWdpb24uICBUaGlzIGNvdWxkIGJlIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gICAgICBhcmUgaW4gYSBzZXJpYWxpemVkIHJlZ2lvbiAocGVyaGFwcyB0aGUgb3V0ZXIgb25lKSwgb3IgZWxzZQorICAgICAgICAvLyAgICAgIHRhc2tpbmcgd2FzIG1hbnVhbGx5IGRpc2FibGVkIChLTVBfVEFTS0lORz0wKS4KKyAgICAgICAgLy8KKyAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGlmICggISBUQ1JfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSApICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIEtNUF9NQVNURVJfVElEKCB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0oIHRhc2tfdGVhbSwgdGhpc190aHIgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBLTVBfVEFTS0lOR19FTkFCTEVEKCB0YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlICkgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza3MoIHRoaXNfdGhyLCB0aF9ndGlkLCBzcGluLCBjaGVjaywgZmluYWxfc3BpbiwgJmZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggc3BpbiApOworICAgICAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3N0YXRpY19kZWxheSggMSApOworCisgICAgICAgIC8qIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgICAgb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0KSwgdGhlbiB5aWVsZCAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIC8vIFRPRE86IFNob3VsZCBpdCBiZSBudW1iZXIgb2YgY29yZXMgaW5zdGVhZCBvZiB0aHJlYWQgY29udGV4dHM/IExpa2U6CisgICAgICAgIC8vIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX25jb3JlcyApOworICAgICAgICAvLyBOZWVkIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGRhdGEgdG8gbWFrZSB0aGUgY2hhbmdlLi4uCisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgdGhyZWFkIHdhcyB0cmFuc2ZlcnJlZCBmcm9tIGEgdGVhbQorICAgICAgICAvLyB0byB0aGUgdGhyZWFkIHBvb2wgKG9yIHZpY2UtdmVyc2EpIHdoaWxlIHNwaW5uaW5nLgorICAgICAgICAvLworICAgICAgICBpbl9wb29sID0gISFUQ1JfNCh0aGlzX3Roci0+dGgudGhfaW5fcG9vbCk7CisgICAgICAgIGlmICggaW5fcG9vbCAhPSAhIXRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgIGlmICggaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIHJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gdGVhbSB0byBwb29sCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIGNhbm5vdCBhc3NlcnQgdGhhdAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkKKyAgICAgICAgICAgICAgICAvLyAgPD0gX19rbXBfdGhyZWFkX3Bvb2xfbnRoICk7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBfX2ttcF90aHJlYWRfcG9vbF9udGggaXMgaW5jL2RlYydkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gd2hpbGUgdGhlIGZvcmsvam9pbiBsb2NrIGlzIGhlbGQsIHdoZXJlYXMKKyAgICAgICAgICAgICAgICAvLyBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoIGlzIGluYy9kZWMnZCBhc3luY2hyb25vdXNseQorICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSB3b3JrZXJzLiAgVGhlIHR3byBjYW4gZ2V0IG91dCBvZiBzeW5jIGZvciBicmllZgorICAgICAgICAgICAgICAgIC8vIHBlcmlvZHMgb2YgdGltZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyByZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHBvb2wgdG8gdGVhbQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIC8vIERvbid0IHN1c3BlbmQgaWYgdGhlcmUgaXMgYSBsaWtlbGlob29kIG9mIG5ldyB0YXNrcyBiZWluZyBzcGF3bmVkLgorICAgICAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICAvKiBEb24ndCBzdXNwZW5kIGlmIEtNUF9CTE9DS1RJTUUgaXMgc2V0IHRvICJpbmZpbml0ZSIgKi8KKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQgbW9yZSwgZmFsbCBhc2xlZXAgKi8KKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSA8IGhpYmVybmF0ZSApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgc3VzcGVuZCB0aW1lIHJlYWNoZWRcbiIsIHRoX2d0aWQgKSApOworCisgICAgICAgIF9fa21wX3N1c3BlbmQoIHRoX2d0aWQsIHNwaW4sIGNoZWNrICk7CisKKyAgICAgICAgaWYoIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUgKSAmJiBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCApOworICAgICAgICB9CisKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAvKiBpZiB0aHJlYWQgaXMgZG9uZSB3aXRoIHdvcmsgYW5kIHRpbWVzb3V0LCBkaXNiYW5kL2ZyZWUgKi8KKyAgICB9CisKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggc3BpbiApOworfQorCisKKy8qCisgKiBSZWxlYXNlIHRoZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IHRhcmdldF90aHIgZnJvbSB3YWl0aW5nIGJ5IHNldHRpbmcgdGhlIGxvY2F0aW9uCisgKiBzcGVjaWZpZWQgYnkgc3BpbiBhbmQgcmVzdW1lIHRoZSB0aHJlYWQgaWYgaW5kaWNhdGVkIGJ5IHRoZSBzbGVlcCBwYXJhbWV0ZXIuCisgKgorICogQSB0aHJlYWQgdGhhdCBjYWxscyBfX2ttcF93YWl0X3NsZWVwIG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHdha2UgdXAgdGhlCisgKiBwb3RlbnRpYWxseSBzbGVlcGluZyB0aHJlYWQgYW5kIHByZXZlbnQgZGVhZGxvY2tzIQorICovCisKK3ZvaWQKK19fa21wX3JlbGVhc2UoIGttcF9pbmZvX3QgKnRhcmdldF90aHIsIHZvbGF0aWxlIGttcF91aW50ICpzcGluLAorICAgICAgICAgICAgICAgZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgZmV0Y2hhZGRfZmVuY2UgKQoreworICAgIGttcF91aW50IG9sZF9zcGluOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaW50IHRhcmdldF9ndGlkID0gdGFyZ2V0X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgICAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisgICAgI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMjAsICggIl9fa21wX3JlbGVhc2U6IFQjJWQgcmVsZWFzaW5nIFQjJWQgc3BpbiglcCkgZmVuY2VfdHlwZSglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBzcGluLCBmZXRjaGFkZF9mZW5jZSApKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNwaW4gKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGZldGNoYWRkX2ZlbmNlID09IGttcF9hY3F1aXJlX2ZlbmNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hhZGRfZmVuY2UgPT0ga21wX3JlbGVhc2VfZmVuY2UgKTsKKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoIHNwaW4gKTsKKworICAgIG9sZF9zcGluID0gKCBmZXRjaGFkZF9mZW5jZSA9PSBrbXBfYWNxdWlyZV9mZW5jZSApCisgICAgICAgICAgICAgICAgID8gS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW4gKQorICAgICAgICAgICAgICAgICA6IEtNUF9URVNUX1RIRU5fQURENF8zMiggKHZvbGF0aWxlIGttcF9pbnQzMiAqKSBzcGluICk7CisKKyAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9yZWxlYXNlOiBUIyVkIG9sZCBzcGluKCVwKT0lZCwgc2V0IG5ldyBzcGluPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc3Bpbiwgb2xkX3NwaW4sICpzcGluICkgKTsKKworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIC8qIE9ubHkgbmVlZCB0byBjaGVjayBzbGVlcCBzdHVmZiBpZiBpbmZpbml0ZSBibG9jayB0aW1lIG5vdCBzZXQgKi8KKyAgICAgICAgaWYgKCBvbGRfc3BpbiAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICkgeworICNpZm5kZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpbnQgdGFyZ2V0X2d0aWQgPSB0YXJnZXRfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgI2VuZGlmCisgICAgICAgICAgICAvKiB3YWtlIHVwIHRocmVhZCBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgIEtGX1RSQUNFKCA1MCwgKCAiX19rbXBfcmVsZWFzZTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWQgc2luY2Ugc2xlZXAgc3BpbiglcCkgc2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBzcGluICkpOworICAgICAgICAgICAgX19rbXBfcmVzdW1lKCB0YXJnZXRfZ3RpZCwgc3BpbiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWxlYXNlOiBUIyVkIGRvbid0IHdha2UgdXAgdGhyZWFkIFQjJWQgc2luY2Ugc2xlZXAgc3BpbiglcCkgbm90IHNldFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3BpbiApKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2luZmluaXRlX2xvb3AoIHZvaWQgKQoreworICAgIHN0YXRpYyBpbnQgZG9uZSA9IEZBTFNFOworCisgICAgd2hpbGUgKCEgZG9uZSkgeworICAgICAgICBLTVBfWUlFTEQoIDEgKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgTUFYX01FU1NBR0UgICAgIDUxMgorCit2b2lkCitfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpbnQgZ3RpZCwgdm9pZCAqcDEsIHZvaWQgKnAyLCBzaXplX3Qgc2l6ZSwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pIHsKKyAgICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgICAgaW50IG5vZGU7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0KTsKKyAgICBzcHJpbnRmKCBidWZmZXIsICJPTVAgc3RvcmFnZSBtYXA6ICVwICVwJThsdSAlc1xuIiwgcDEsIHAyLCAodW5zaWduZWQgbG9uZykgc2l6ZSwgZm9ybWF0ICk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgYnVmZmVyLCBhcCApOworI2lmIEtNUF9QUklOVF9EQVRBX1BMQUNFTUVOVAorICAgIGlmKGd0aWQgPj0gMCkgeworICAgICAgICBpZihwMSA8PSBwMiAmJiAoY2hhciopcDIgLSAoY2hhciopcDEgPT0gc2l6ZSkgeworICAgICAgICAgICAgaWYoIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IF9fa21wX2dldF9ob3N0X25vZGUocDEpOworICAgICAgICAgICAgICAgIGlmKG5vZGUgPCAwKSAgLyogZG9lc24ndCB3b3JrLCBzbyBkb24ndCB0cnkgdGhpcyBuZXh0IHRpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpsYXN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdE5vZGU7CisgICAgICAgICAgICAgICAgICAgIGludCBsb2NhbFByb2MgPSBfX2ttcF9nZXRfY3B1X2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICAgICAgICAgICAgICBwMSA9ICh2b2lkICopKCAoc2l6ZV90KXAxICYgfigoc2l6ZV90KVBBR0VfU0laRSAtIDEpICk7CisgICAgICAgICAgICAgICAgICAgIHAyID0gKHZvaWQgKikoICgoc2l6ZV90KSBwMiAtIDEpICYgfigoc2l6ZV90KVBBR0VfU0laRSAtIDEpICk7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvY2FsUHJvYyA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgR1RJRCAlZCBsb2NhbE5vZGUgJWRcbiIsIGd0aWQsIGxvY2FsUHJvYz4+MSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWRcbiIsIGd0aWQpOworIyBpZiBLTVBfVVNFX1BSQ1RMCisvKiBUaGUgbW9yZSBlbGFib3JhdGUgZm9ybWF0IGlzIGRpc2FibGVkIGZvciBub3cgYmVjYXVzZSBvZiB0aGUgcHJjdGwgaGFuZ2luZyBidWcuICovCisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbG9vcCBjb2xsYXRlcyBhZGphY2VudCBwYWdlcyB3aXRoIHRoZSBzYW1lIGhvc3Qgbm9kZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDEgKz0gUEFHRV9TSVpFOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwMSA8PSBwMiAmJiAobm9kZSA9IF9fa21wX2dldF9ob3N0X25vZGUocDEpKSA9PSBsYXN0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDEgLSAxLCBsYXN0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocDEgPD0gcDIpOworIyBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSArIChQQUdFX1NJWkUgLSAxKSwgX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSkpOworICAgICAgICAgICAgICAgICAgICBpZihwMSA8IHAyKSAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMiArIChQQUdFX1NJWkUgLSAxKSwgX19rbXBfZ2V0X2hvc3Rfbm9kZShwMikpOworICAgICAgICAgICAgICAgICAgICB9CisjIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICVzXG4iLCBLTVBfSTE4Tl9TVFIoIFN0b3JhZ2VNYXBXYXJuaW5nICkgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX1BSSU5UX0RBVEFfUExBQ0VNRU5UICovCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7Cit9CisKK3ZvaWQKK19fa21wX3dhcm4oIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgY2hhciBidWZmZXJbTUFYX01FU1NBR0VdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICBpZiAoIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgc25wcmludGYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLCAiT01QIHdhcm5pbmc6ICVzXG4iLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX2Fib3J0X3Byb2Nlc3MoKQoreworCisgICAgLy8gTGF0ZXIgdGhyZWFkcyBtYXkgc3RhbGwgaGVyZSwgYnV0IHRoYXQncyBvayBiZWNhdXNlIGFib3J0KCkgd2lsbCBraWxsIHRoZW0uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgKTsKKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIEtNUF9PU19XSU5ET1dTICkgeworICAgICAgICAvLyBMZXQgb3RoZXIgdGhyZWFkcyBrbm93IG9mIGFibm9ybWFsIHRlcm1pbmF0aW9uIGFuZCBwcmV2ZW50IGRlYWRsb2NrCisgICAgICAgIC8vIGlmIGFib3J0IGhhcHBlbmVkIGR1cmluZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIG9yIHNodXRkb3duCisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSBTSUdBQlJUOworCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUyBieSBkZWZhdWx0IGFib3J0KCkgY2F1c2VzIHBvcC11cCBlcnJvciBib3gsIHdoaWNoIHN0YWxscyBuaWdodGx5IHRlc3RpbmcuCisgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgcmVsaWFibHkgc3VwcHJlc3MgcG9wLXVwIGVycm9yIGJveGVzLiBfc2V0X2Fib3J0X2JlaGF2aW9yKCkKKyAgICAgICAgICAgIHdvcmtzIHdlbGwsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gVlM3ICh0aGlzIGlzIG5vdCBwcm9ibGVtIGZvciBETEwsIGJ1dAorICAgICAgICAgICAgaXQgaXMgYSBwcm9ibGVtIGZvciBzdGF0aWMgT3Blbk1QIFJUTCkuIFNldEVycm9yTW9kZSAoYW5kIHNvLCB0aW1lbGltaXQgdXRpbGl0eSkgZG9lcworICAgICAgICAgICAgbm90IGhlbHAsIGF0IGxlYXN0IGluIHNvbWUgdmVyc2lvbnMgb2YgTVMgQyBSVEwuCisKKyAgICAgICAgICAgIEl0IHNlZW1zIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyB0aGUgb25seSB3YXkgdG8gc2ltdWxhdGUgYWJvcnQoKSBhbmQgYXZvaWQgcG9wLXVwIGVycm9yCisgICAgICAgICAgICBib3guCisgICAgICAgICovCisgICAgICAgIHJhaXNlKCBTSUdBQlJUICk7CisgICAgICAgIF9leGl0KCAzICk7ICAgIC8vIEp1c3QgaW4gY2FzZSwgaWYgc2lnbmFsIGlnbm9yZWQsIGV4aXQgYW55d2F5LgorICAgIH0gZWxzZSB7CisgICAgICAgIGFib3J0KCk7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCit9IC8vIF9fa21wX2Fib3J0X3Byb2Nlc3MKKwordm9pZAorX19rbXBfYWJvcnRfdGhyZWFkKCB2b2lkICkKK3sKKyAgICAvLyBUT0RPOiBFbGltaW5hdGUgZ19hYm9ydCBnbG9iYWwgdmFyaWFibGUgYW5kIHRoaXMgZnVuY3Rpb24uCisgICAgLy8gSW4gY2FzZSBvZiBhYm9ydCBqdXN0IGNhbGwgYWJvcnQoKSwgaXQgd2lsbCBraWxsIGFsbCB0aGUgdGhyZWFkcy4KKyAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7Cit9IC8vIF9fa21wX2Fib3J0X3RocmVhZAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFByaW50IG91dCB0aGUgc3RvcmFnZSBtYXAgZm9yIHRoZSBtYWpvciBrbXBfaW5mb190IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBrbXBfaW5mb190ICp0aHIsIGludCBndGlkICkKK3sKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCB0aHIsIHRociArIDEsIHNpemVvZihrbXBfaW5mb190KSwgInRoXyVkIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfaW5mbywgJnRoci0+dGgudGhfdGVhbSwgc2l6ZW9mKGttcF9kZXNjX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQudGhfaW5mbyIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2xvY2FsLCAmdGhyLT50aC50aF9wcmlfaGVhZCwgc2l6ZW9mKGttcF9sb2NhbF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkLnRoX2xvY2FsIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyWzBdLCAmdGhyLT50aC50aF9iYXJbYnNfbGFzdF9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCkgKiBic19sYXN0X2JhcnJpZXIsICJ0aF8lZC50aF9iYXIiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbYnNfcGxhaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2JhcltwbGFpbl0iLCBndGlkKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW2Zvcmtqb2luXSIsIGd0aWQpOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcmVkdWN0aW9uXSIsIGd0aWQpOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorfQorCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF90ZWFtX3QgdGVhbSBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcCggY29uc3QgY2hhciAqaGVhZGVyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGVhbV9pZCwgaW50IG51bV90aHIgKQoreworICAgIGludCBudW1fZGlzcF9idWZmID0gdGVhbS0+dC50X21heF9ucHJvYyA+IDEgPyBLTVBfTUFYX0RJU1BfQlVGIDogMjsKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgdGVhbSwgdGVhbSArIDEsIHNpemVvZihrbXBfdGVhbV90KSwgIiVzXyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbMF0sICZ0ZWFtLT50LnRfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCkgKiBic19sYXN0X2JhcnJpZXIsICIlc18lZC50X2JhciIsIGhlYWRlciwgdGVhbV9pZCApOworCisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltwbGFpbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW2Zvcmtqb2luXSIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbcmVkdWN0aW9uXSIsIGhlYWRlciwgdGVhbV9pZCApOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcGF0Y2hbMF0sICZ0ZWFtLT50LnRfZGlzcGF0Y2hbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfZGlzcF90KSAqIG51bV90aHIsICIlc18lZC50X2Rpc3BhdGNoIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF90aHJlYWRzWzBdLCAmdGVhbS0+dC50X3RocmVhZHNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfaW5mb190ICopICogbnVtX3RociwgIiVzXyVkLnRfdGhyZWFkcyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbMF0sICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbbnVtX2Rpc3BfYnVmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYsICIlc18lZC50X2Rpc3BfYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICAvKgorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ucHJvY1swXSwgJnRlYW0tPnQudF9zZXRfbnByb2NbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25wcm9jIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1swXSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X25lc3RlZFswXSwgJnRlYW0tPnQudF9zZXRfbmVzdGVkW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbMF0sICZ0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbnByb2MiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbMF0sICZ0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2J0X3NldFswXSwgJnRlYW0tPnQudF9zZXRfYnRfc2V0W251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgLy9fX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNbMF0sICZ0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzW251bV90aHJdLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9zY2hlZFswXSwgJnRlYW0tPnQudF9zZXRfc2NoZWRbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG51bV90aHIsICIlc18lZC50X3NldF9zY2hlZCIsIGhlYWRlciwgdGVhbV9pZCApOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfcHJvY19iaW5kWzBdLCAmdGVhbS0+dC50X3NldF9wcm9jX2JpbmRbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X3Byb2NfYmluZCIsIGhlYWRlciwgdGVhbV9pZCApOworI2VuZGlmCisgICAgKi8KKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3Rhc2txLCAmdGVhbS0+dC50X2NvcHlwcml2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfdGFza3FfdCksICIlc18lZC50X3Rhc2txIiwgaGVhZGVyLCB0ZWFtX2lkICk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfYWxsb2NhdG9yKCkge30KK3N0YXRpYyB2b2lkIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCkge30KK3N0YXRpYyB2b2lkIF9fa21wX2ZpbmlfYWxsb2NhdG9yX3RocmVhZCgpIHt9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgR1VJREVETExfRVhQT1JUUworIyBpZiBLTVBfT1NfV0lORE9XUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCogbGNrICkgeworICAgIC8vIFRPRE86IENoYW5nZSB0byBfX2ttcF9icmVha19ib290c3RyYXBfbG9jaygpLgorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGxjayApOyAvLyBtYWtlIHRoZSBsb2NrIHJlbGVhc2VkCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggaW50IGd0aWRfcmVxICkgeworICAgIGludCBpOworICAgIGludCB0aHJlYWRfY291bnQ7CisKKyAgICAvLyBQUk9DRVNTX0RFVEFDSCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgYnkgYSB0aHJlYWQKKyAgICAvLyB0aGF0IGV4ZWN1dGVzIFByb2Nlc3NFeGl0KCkgb3IgRnJlZUxpYnJhcnkoKS4KKyAgICAvLyBPUyB0ZXJtaW5hdGVzIG90aGVyIHRocmVhZHMgKGV4Y2VwdCB0aGUgb25lIGNhbGxpbmcgUHJvY2Vzc0V4aXQgb3IgRnJlZUxpYnJhcnkpLgorICAgIC8vIFNvLCBpdCBtaWdodCBiZSBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdIHdpdGhvdXQgdGFraW5nIHRoZSBmb3Jram9pbl9sb2NrLgorICAgIC8vIEhvd2V2ZXIsIGluIGZhY3QsIHNvbWUgdGhyZWFkcyBjYW4gYmUgc3RpbGwgYWxpdmUgaGVyZSwgYWx0aG91Z2ggYmVpbmcgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KKyAgICAvLyBUaGUgdGhyZWFkcyBpbiB0aGUgYXJyYXkgd2l0aCBkc190aHJlYWQ9PTAgYXJlIG1vc3Qgc3VzcGljaW91cy4KKyAgICAvLyBBY3R1YWxseSwgaXQgY2FuIGJlIG5vdCBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdLgorCisgICAgLy8gVE9ETzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNoZWNrIF9fa21wX3Jvb3RzW10gPworCisgICAgLy8gTGV0J3MgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgYWxpdmUgdGhyZWFkcyByZWdpc3RlcmVkIHdpdGggdGhlIE9NUCBsaWIuCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIHRocmVhZF9jb3VudCA9IDA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kgKSB7CisgICAgICAgICAgICBpZiggIV9fa21wX3RocmVhZHMgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QqIHRoID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYoIHRoID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGludCBndGlkID0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgICAgICAgIGlmKCBndGlkID09IGd0aWRfcmVxICkgY29udGludWU7CisgICAgICAgICAgICBpZiggZ3RpZCA8IDAgKSBjb250aW51ZTsKKyAgICAgICAgICAgIERXT1JEIGV4aXRfdmFsOworICAgICAgICAgICAgaW50IGFsaXZlID0gX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBpZiggYWxpdmUgKSB7CisgICAgICAgICAgICArK3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggdGhyZWFkX2NvdW50ID09IDAgKSBicmVhazsgLy8gc3VjY2VzcworICAgIH0KKworICAgIC8vIEFzc3VtZSB0aGF0IEknbSBhbG9uZS4KKworICAgIC8vIE5vdyBpdCBtaWdodCBiZSBwcm9iYWJseSBzYWZlIHRvIGNoZWNrIGFuZCByZXNldCBsb2Nrcy4KKyAgICAvLyBfX2ttcF9mb3Jram9pbl9sb2NrIGFuZCBfX2ttcF9zdGRpb19sb2NrIGFyZSBleHBlY3RlZCB0byBiZSByZXNldC4KKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfc3RkaW9fbG9jayApOworICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworCit9CisKK0JPT0wgV0lOQVBJCitEbGxNYWluKCBISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwUmVzZXJ2ZWQgKSB7CisgICAgLy9fX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgc3dpdGNoKCBmZHdSZWFzb24gKSB7CisKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogUFJPQ0VTU19BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFBST0NFU1NfREVUQUNIIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICkpOworCisgICAgICAgICAgICBpZiggbHBSZXNlcnZlZCAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBscFJlc2VydmVkIGlzIHVzZWQgZm9yIHRlbGxpbmcgdGhlIGRpZmZlcmVuY2U6CisgICAgICAgICAgICAgICAgLy8gIGxwUmVzZXJ2ZWQgPT0gTlVMTCB3aGVuIEZyZWVMaWJyYXJ5KCkgd2FzIGNhbGxlZCwKKyAgICAgICAgICAgICAgICAvLyAgbHBSZXNlcnZlZCAhPSBOVUxMIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIEZyZWVMaWJyYXJ5KCkgaXMgY2FsbGVkLCB3b3JrZXIgdGhyZWFkcyByZW1haW4gYWxpdmUuCisgICAgICAgICAgICAgICAgLy8gU28gdGhleSB3aWxsIHJlbGVhc2UgdGhlIGZvcmtqb2luIGxvY2sgYnkgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMsIHdvcmtlciB0aHJlYWRzIGRpc2FwcGVhciB0cmlnZ2VyaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb2JsZW0gb2YgdW5yZWxlYXNlZCBmb3Jram9pbiBsb2NrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgICAgICAgICAgIC8vIEEgd29ya2VyIHRocmVhZCBjYW4gdGFrZSB0aGUgZm9ya2pvaW4gbG9jaworICAgICAgICAgICAgICAgIC8vIGluIF9fa21wX3N1c3BlbmQoKS0+X19rbXBfcm1sX2RlY3JlYXNlX2xvYWRfYmVmb3JlX3NsZWVwKCkuCisgICAgICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gY29tZXMgdXAgaWYgdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZAorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdCByZWxlYXNlcyB0aGUgZm9ya2pvaW4gbG9jay4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIERsbE1haW4oKS0+UFJPQ0VTU19ERVRBQ0gtPl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCkgYmVsb3cKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byB0YWtlIHRoZSBmb3Jram9pbiBsb2NrIGFuZCB3aWxsIGFsd2F5cyBmYWlsLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBpcyBwb3NzaWJsZSBpZiBfX2ttcGNfZW5kKCkgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIgY2FzZSwgYnV0IGNvbW1vbiBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBpY2wgYnV0IHdpdGhvdXQgL1FvcGVubXAgKGFwcGxpY2F0aW9uIHdpdGggcGx1Z2lucyk7CisgICAgICAgICAgICAgICAgLy8gLSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIGJ5IGNhbGxpbmcgQyBleGl0KCksIEZvcnRyYW4gQ0FMTCBFWElUKCkgb3IgRm9ydHJhbiBTVE9QLgorICAgICAgICAgICAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogISEhIHRvIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFRIUkVBRF9BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHdhbnRlZCB0byByZWdpc3RlciBuZXcgc2libGluZ3MgYWxsIHRoZSB0aW1lIGhlcmUgY2FsbAorICAgICAgICAgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBHVUlERURMTF9FWFBPUlRTICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENoYW5nZSB0aGUgbGlicmFyeSB0eXBlIHRvICJzdGF0dXMiIGFuZCByZXR1cm4gdGhlIG9sZCB0eXBlICovCisvKiBjYWxsZWQgZnJvbSB3aXRoaW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgd2hlcmUgX19rbXBfaW5pdHpfbG9jayBpcyBoZWxkICovCitpbnQKK19fa21wX2NoYW5nZV9saWJyYXJ5KCBpbnQgc3RhdHVzICkKK3sKKyAgICBpbnQgb2xkX3N0YXR1czsKKworICAgIG9sZF9zdGF0dXMgPSBfX2ttcF95aWVsZF9pbml0ICYgMTsgIC8vIGNoZWNrIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCAoZXZlbiBpbml0IGNvdW50KQorCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0IHw9IDE7ICAvLyB0aHJvdWdocHV0ID0+IHR1cm5hcm91bmQgKG9kZCBpbml0IGNvdW50KQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfeWllbGRfaW5pdCAmPSB+MTsgLy8gdHVybmFyb3VuZCA9PiB0aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisgICAgfQorCisgICAgcmV0dXJuIG9sZF9zdGF0dXM7ICAvLyByZXR1cm4gcHJldmlvdXMgc2V0dGluZyBvZiB3aGV0aGVyIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogX19rbXBfcGFyYWxsZWxfZGVvIC0tCisgKiBXYWl0IHVudGlsIGl0J3Mgb3VyIHR1cm4uCisgKi8KK3ZvaWQKK19fa21wX3BhcmFsbGVsX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKyNpZmRlZiBCVUlMRF9QQVJBTExFTF9PUkRFUkVECisgICAga21wX3RlYW1fdCAqdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCApOworICAgIH0KKyNpZmRlZiBCVUlMRF9QQVJBTExFTF9PUkRFUkVECisgICAgaWYoICF0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBrbXBfdWludDMyICBzcGluczsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0gLT4gdC50X29yZGVyZWQuZHQudF92YWx1ZSwgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApLCBLTVBfRVEsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworfQorCisvKiBfX2ttcF9wYXJhbGxlbF9keG8gLS0KKyAqIFNpZ25hbCB0aGUgbmV4dCB0YXNrLgorICovCisKK3ZvaWQKK19fa21wX3BhcmFsbGVsX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKyNpZmRlZiBCVUlMRF9QQVJBTExFTF9PUkRFUkVECisgICAgaW50IHRpZCA9ICBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RlYW1fdCAqdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiAoICEgdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogdXNlIHRoZSB0aWQgb2YgdGhlIG5leHQgdGhyZWFkIGluIHRoaXMgdGVhbSAqLworICAgICAgICAvKiBUT0RPIHJlcGxlYWNlIHdpdGggZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZSAqLworICAgICAgICB0ZWFtIC0+IHQudF9vcmRlcmVkLmR0LnRfdmFsdWUgPSAoKHRpZCArIDEpICUgdGVhbS0+dC50X25wcm9jICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworCitpbnQKK19fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAqdGg7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGggICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGggLT4gdGgudGhfdGVhbTsKKyAgICBzdGF0dXMgPSAwOworCisgICAgdGgtPnRoLnRoX2lkZW50ID0gaWRfcmVmOworCisgICAgaWYgKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBzdGF0dXMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGttcF9pbnQzMiBvbGRfdGhpcyA9IHRoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKworICAgICAgICArK3RoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKyAgICAgICAgLyogdHJ5IHRvIHNldCB0ZWFtIGNvdW50IHRvIHRocmVhZCBjb3VudC0tc3VjY2VzcyBtZWFucyB0aHJlYWQgZ290IHRoZQorICAgICAgICAgICBzaW5nbGUgYmxvY2sKKyAgICAgICAgKi8KKyAgICAgICAgLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworICAgICAgICBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJnRlYW0gLT4gdC50X2NvbnN0cnVjdCwgb2xkX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QpOworICAgIH0KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmIChzdGF0dXMgJiYgcHVzaF93cykgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBpZF9yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGd0aWQgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK19fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApCit7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBOVUxMICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlciggZW51bSBiYXJyaWVyX3R5cGUgYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICAgICp0ZWFtICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgIC8qCisgICAgICogV2Ugbm93IHBlcmZvcm0gYSBsaW5lYXIgcmVkdWN0aW9uIHRvIHNpZ25hbCB0aGF0IGFsbAorICAgICAqIG9mIHRoZSB0aHJlYWRzIGhhdmUgYXJyaXZlZC4KKyAgICAgKgorICAgICAqIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4KKyAgICAgKi8KKyAgICBpZiAoICEgS01QX01BU1RFUl9USUQoIHRpZCApKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIDAsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXIgLT4gYl9hcnJpdmVkLCB0aHJfYmFyIC0+IGJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXIgLT4gYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUAorICAgICAgICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAvKiBtYXJrIGFycml2YWwgdG8gbWFzdGVyIHRocmVhZCAqLworICAgICAgICAvLworICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0CisgICAgICAgIC8vIHRoZSB0ZWFtIGlzIHZhbGlkIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlcgorICAgICAgICAvLyB0aHJlYWQgYXQgYW55IHRpbWUuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3JlbGVhc2UoIG90aGVyX3RocmVhZHNbMF0sICZ0aHJfYmFyIC0+IGJfYXJyaXZlZCwga21wX3JlbGVhc2VfZmVuY2UgKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9iYWxpZ25fdGVhbV90ICp0ZWFtX2JhciAgPSAmIHRlYW0gLT4gdC50X2JhclsgYnQgXTsKKyAgICAgICAgcmVnaXN0ZXIgaW50ICAgICAgICAgICAgICAgIG5wcm9jICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgIHJlZ2lzdGVyIGludCAgICAgICAgICAgICAgICBpOworICAgICAgICAvKiBEb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNsZWVwIGJpdCBoZXJlIG9yIGF0b21pYyBzaW5jZSB0ZWFtIHNldHRpbmcgKi8KKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQgICAgICAgICAgIG5ld19zdGF0ZSAgPSB0ZWFtX2JhciAtPiBiX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworCisgICAgICAgIC8qIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4gKi8KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG5wcm9jOyBpKyspIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvKiBwcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQgKi8KKyAgICAgICAgICAgIGlmICggaSsxIDwgbnByb2MgKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJm90aGVyX3RocmVhZHNbIGkrMSBdIC0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGksIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW2ldIC0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXRlICkgKTsKKworICAgICAgICAgICAgLyogd2FpdCBmb3Igd29ya2VyIHRocmVhZCB0byBhcnJpdmUgKi8KKyAgICAgICAgICAgIF9fa21wX3dhaXRfc2xlZXAoIHRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBvdGhlcl90aHJlYWRzWyBpIF0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0ZSwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggaSwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGkgKSApOworCisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKCB0aGlzX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbIGkgXSAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZyAqLworICAgICAgICB0ZWFtX2JhciAtPiBiX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbV9iYXIgLT4gYl9hcnJpdmVkLCBuZXdfc3RhdGUgKSApOworICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSAodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggdm9pZCAqIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbSAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICAqdGhyX2JhciAgICAgICA9ICYgdGhpc190aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIG5wcm9jICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9iaXRzICAgPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgYnQgXTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0cyA7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGRfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50ICAgICAgIG5ld19zdGF0ZTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgLyoKKyAgICAgKiBXZSBub3cgcGVyZm9ybSBhIHRyZWUgZ2F0aGVyIHRvIHdhaXQgdW50aWwgYWxsCisgICAgICogb2YgdGhlIHRocmVhZHMgaGF2ZSBhcnJpdmVkLCBhbmQgcmVkdWNlIGFueSByZXF1aXJlZCBkYXRhCisgICAgICogYXMgd2UgZ28uCisgICAgICovCisKKyAgICBjaGlsZF90aWQgPSAodGlkIDw8IGJyYW5jaF9iaXRzKSArIDE7CisKKyAgICBpZiAoIGNoaWxkX3RpZCA8IG5wcm9jICkgeworCisgICAgICAgIC8qIHBhcmVudCB0aHJlYWRzIHdhaXQgZm9yIGFsbCB0aGVpciBjaGlsZHJlbiB0byBhcnJpdmUgKi8KKyAgICAgICAgbmV3X3N0YXRlID0gdGVhbSAtPiB0LnRfYmFyWyBidCBdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGNoaWxkID0gMTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCBdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmIGNoaWxkX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgICAgICAgICAgLyogcHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBhcnJpdmVkIGNvdW50ICovCisgICAgICAgICAgICBpZiAoIGNoaWxkKzEgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQrMSA8IG5wcm9jICkKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZvdGhlcl90aHJlYWRzWyBjaGlsZF90aWQrMSBdIC0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDoldSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBjaGlsZF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2JhciAtPiBiX2Fycml2ZWQsIG5ld19zdGF0ZSApICk7CisKKyAgICAgICAgICAgIC8qIHdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZSAqLworICAgICAgICAgICAgX19rbXBfd2FpdF9zbGVlcCggdGhpc190aHIsICZjaGlsZF9iYXIgLT4gYl9hcnJpdmVkLCBuZXdfc3RhdGUsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gVCMlZCglZDoldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGNoaWxkX3RpZCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQgKSApOworCisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKCB0aGlzX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MgKTsKKyAgICB9CisKKyAgICBpZiAoICFLTVBfTUFTVEVSX1RJRCh0aWQpICkgeworICAgICAgICAvKiB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9ICh0aWQgLSAxKSA+PiBicmFuY2hfYml0czsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBwYXJlbnRfdGlkLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgcGFyZW50X3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyIC0+IGJfYXJyaXZlZCwgdGhyX2JhciAtPiBiX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJfYmFyIC0+IGJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAKKyAgICAgICAgICAgICAgICAgICAgICApICk7CisKKyAgICAgICAgLyogbWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQgKi8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdAorICAgICAgICAvLyB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIKKyAgICAgICAgLy8gdGhyZWFkIGF0IGFueSB0aW1lLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9yZWxlYXNlKCBvdGhlcl90aHJlYWRzW3BhcmVudF90aWRdLCAmdGhyX2JhciAtPiBiX2Fycml2ZWQsIGttcF9yZWxlYXNlX2ZlbmNlICk7CisKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkICovCisKKyAgICAgICAgaWYgKCBucHJvYyA+IDEgKQorICAgICAgICAgICAgLyogTmV3IHZhbHVlIHdhcyBhbHJlYWR5IGNvbXB1dGVkIGFib3ZlICovCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9iYXJbIGJ0IF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9iYXJbIGJ0IF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCApICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpICh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyAodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbSAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICAqdGhyX2JhciAgICAgICA9ICYgdGhpc190aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50ICAgICAgIG5ld19zdGF0ZSAgICAgPSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEU7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbnVtX3RocmVhZHMgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2JpdHMgICA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzIDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZiggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMiB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8qCisgICAgICogV2Ugbm93IHBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwKKyAgICAgKiBvZiB0aGUgdGhyZWFkcyBoYXZlIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEKKyAgICAgKiBhcyB3ZSBnby4KKyAgICAgKi8KKworICAgIGZvciAoIGxldmVsPTAsIG9mZnNldCA9MTsKKyAgICAgICAgICBvZmZzZXQgPCBudW1fdGhyZWFkczsKKyAgICAgICAgICBsZXZlbCArPSBicmFuY2hfYml0cywgb2Zmc2V0IDw8PSBicmFuY2hfYml0cyApCisgICAgeworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBjaGlsZDsKKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZF90aWQ7CisKKyAgICAgICAgaWYgKCAoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwICkgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIHBhcmVudF90aWQgPSB0aWQgJiB+KCAoMSA8PCAobGV2ZWwgKyBicmFuY2hfYml0cykpIC0xICk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBwYXJlbnRfdGlkLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgcGFyZW50X3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyX2JhciAtPiBiX2Fycml2ZWQsIHRocl9iYXIgLT4gYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXIgLT4gYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICApICk7CisKKyAgICAgICAgICAgIC8qIG1hcmsgYXJyaXZhbCB0byBwYXJlbnQgdGhyZWFkICovCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlIChpbiB0aGUgbGFzdCBpdGVyYXRpb24gb2YgdGhlCisgICAgICAgICAgICAvLyBlbmNsb3NpbmcgZm9yIGxvb3ApLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyCisgICAgICAgICAgICAvLyB0aHJlYWQgYXQgYW55IHRpbWUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfcmVsZWFzZSggb3RoZXJfdGhyZWFkc1twYXJlbnRfdGlkXSwgJnRocl9iYXIgLT4gYl9hcnJpdmVkLCBrbXBfcmVsZWFzZV9mZW5jZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUgKi8KKworICAgICAgICBpZiAobmV3X3N0YXRlID09IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSkKKyAgICAgICAgICAgIG5ld19zdGF0ZSA9IHRlYW0gLT4gdC50X2JhclsgYnQgXS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworCisgICAgICAgIGZvciAoIGNoaWxkID0gMSwgY2hpbGRfdGlkID0gdGlkICsgKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICBjaGlsZCA8IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnVtX3RocmVhZHM7CisgICAgICAgICAgICAgIGNoaWxkKyssIGNoaWxkX3RpZCArPSAoMSA8PCBsZXZlbCkgKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCBdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmIGNoaWxkX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgICAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBuZXh0X2NoaWxkX3RpZCA9IGNoaWxkX3RpZCArICgxIDw8IGxldmVsKTsKKyAgICAgICAgICAgIC8qIHByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudCAqLworICAgICAgICAgICAgaWYgKCBjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzICkKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZvdGhlcl90aHJlYWRzWyBuZXh0X2NoaWxkX3RpZCBdIC0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggY2hpbGRfdGlkLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXIgLT4gYl9hcnJpdmVkLCBuZXdfc3RhdGUgKSApOworCisgICAgICAgICAgICAvKiB3YWl0IGZvciBjaGlsZCB0byBhcnJpdmUgKi8KKyAgICAgICAgICAgIF9fa21wX3dhaXRfc2xlZXAoIHRoaXNfdGhyLCAmY2hpbGRfYmFyIC0+IGJfYXJyaXZlZCwgbmV3X3N0YXRlLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcgKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gS01QX01JTiggdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSwgY2hpbGRfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBjaGlsZF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkICkgKTsKKworICAgICAgICAgICAgICAgICgqcmVkdWNlKSggdGhpc190aHIgLT4gdGgudGhfbG9jYWwucmVkdWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aHIgLT4gdGgudGhfbG9jYWwucmVkdWNlX2RhdGEgKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoIEtNUF9NQVNURVJfVElEKHRpZCkgKSB7CisgICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIHRoZSB0ZWFtIGFycml2ZWQgcG9pbnRlciBpZiB3ZSBhcmUgdGhlIG1hc3RlciB0aHJlYWQgKi8KKworICAgICAgICBpZiAobmV3X3N0YXRlID09IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSkKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2JhclsgYnQgXS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVhbSAtPiB0LnRfYmFyWyBidCBdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCApICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmIChLTVBfTUFTVEVSX1RJRCggdGlkICkpIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jOworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkczsKKworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisgICAgICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKKworICAgICAgICBpZiAobnByb2MgPiAxKSB7CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgICAgICAgIGlmICggcHJvcGFnYXRlX2ljdnMgKSB7CisgICAgICAgICAgICAgICAgbG9hZF9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRlYW0tPnQudF9pZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tpXSwgdGVhbSwgaSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbaV0udGRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzeW5jX2ljdnMoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAvKiBOb3csIHJlbGVhc2UgYWxsIG9mIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG5wcm9jOyBpKyspIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgLyogcHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBnbyBmbGFnICovCisgICAgICAgICAgICAgICAgaWYoIGkrMSA8IG5wcm9jICkKKyAgICAgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmb3RoZXJfdGhyZWFkc1sgaSsxIF0tPiB0aC50aF9iYXJbIGJ0IF0uYmIuYl9nbyApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlKCBvdGhlcl90aHJlYWRzWyBpIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbIGkgXS0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2dvLCBrbXBfYWNxdWlyZV9mZW5jZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2FpdCBmb3IgdGhlIE1BU1RFUiB0aHJlYWQgdG8gcmVsZWFzZSB1cyAqLworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICBndGlkLCAmdGhyX2JhciAtPiBiX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QICkgKTsKKworICAgICAgICBfX2ttcF93YWl0X3NsZWVwKCB0aGlzX3RociwgJnRocl9iYXIgLT4gYl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwgKSB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseSAob3IgSVRUTk9USUZZIGlzIGRpc2FibGVkKQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEgKTsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB3YWl0IG9uIHByZXZpb3VzIHBhcmFsbGVsIHJlZ2lvbi4uLgorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworCisgICAgICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7ICAvLyBjYWxsIHByZXBhcmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yICJuZXciIGJhcnJpZXIKKworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIC8vCisgICAgICAgIC8vIGVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICAvLworICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgLy8KKyNpZiBVU0VfSVRUX0JVSUxEICYmICFPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBsaWJndWlkZSBvbmx5IGNvZGUgKGNhbm5vdCB1c2UgKml0dF90YXNrKiByb3V0aW5lcykKKyAgICAgICAgaWYgKCAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCApIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgb24gYSBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAvLyBubyBuZWVkIHRvIGNhbGwgcmVsZWFzaW5nLCBidXQgd2UgaGF2ZSBwYWlyZWQgY2FsbHMuLi4KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgIU9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICAjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisKKyAgICAgICAgVENXXzQodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIC8qIGhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldCAqLworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgICAgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICAqdGhyX2JhciAgICAgICA9ICYgdGhpc190aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIG5wcm9jOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9iaXRzICAgPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGJ0IF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHMgOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKworICAgIC8qCisgICAgICogV2Ugbm93IHBlcmZvcm0gYSB0cmVlIHJlbGVhc2UgZm9yIGFsbAorICAgICAqIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkCisgICAgICovCisKKyAgICBpZiAoICEgS01QX01BU1RFUl9USUQoIHRpZCApKSB7CisgICAgICAgIC8qIHdvcmtlciB0aHJlYWRzICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICBndGlkLCAmdGhyX2JhciAtPiBiX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QICkgKTsKKworICAgICAgICAvKiB3YWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMgKi8KKyAgICAgICAgX19rbXBfd2FpdF9zbGVlcCggdGhpc190aHIsICZ0aHJfYmFyIC0+IGJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoICggX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBvbiBhIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDAsIC0xICk7CisgICAgICAgICAgICAvLyBjYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKworICAgICAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOyAgLy8gY2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLworICAgICAgICAvLyBlYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIG1heSBub3cgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQuCisgICAgICAgIC8vCisjaWYgVVNFX0lUVF9CVUlMRCAmJiAhT01QXzMwX0VOQUJMRUQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgLy8gbGliZ3VpZGUgb25seSBjb2RlIChjYW5ub3QgdXNlICppdHRfdGFzayogcm91dGluZXMpCisgICAgICAgIGlmICggKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwgKSB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOyAgLy8gbm8gbmVlZCB0byBjYWxsIHJlbGVhc2luZywgYnV0IHdlIGhhdmUgcGFpcmVkIGNhbGxzLi4uCisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmICFPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSApICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKKyAgICB9CisKKyAgICBucHJvYyAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jOworICAgIGNoaWxkX3RpZCA9ICggdGlkIDw8IGJyYW5jaF9iaXRzICkgKyAxOworCisgICAgaWYgKCBjaGlsZF90aWQgPCBucHJvYyApIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworICAgICAgICBjaGlsZCA9IDE7CisgICAgICAgIC8qIHBhcmVudCB0aHJlYWRzIHJlbGVhc2UgYWxsIHRoZWlyIGNoaWxkcmVuICovCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzWyBjaGlsZF90aWQgXTsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJiBjaGlsZF90aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8qIHByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQgKi8KKyAgICAgICAgICAgIGlmICggY2hpbGQrMSA8PSBicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZCsxIDwgbnByb2MgKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJm90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCsxIF0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfZ28gKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGVfaWN2cyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRlYW0tPnQudF9pZGVudCwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF0sIHRlYW0sIGNoaWxkX3RpZCwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBsb2FkX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIHN0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2NoaWxkX3RpZF0udGRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIHN5bmNfaWN2cygpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBjaGlsZF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2JhciAtPiBiX2dvLCBjaGlsZF9iYXIgLT4gYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXIgLT4gYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgKSApOworCisgICAgICAgICAgICAvKiByZWxlYXNlIGNoaWxkIGZyb20gYmFycmllciAqLworICAgICAgICAgICAgX19rbXBfcmVsZWFzZSggY2hpbGRfdGhyLCAmY2hpbGRfYmFyIC0+IGJfZ28sIGttcF9hY3F1aXJlX2ZlbmNlICk7CisKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworfQorCisvKiBUaGUgcmV2ZXJzZSB2ZXJzaW9ucyBzZWVtIHRvIGJlYXQgdGhlIGZvcndhcmQgdmVyc2lvbnMgb3ZlcmFsbCAqLworI2RlZmluZSBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKK3N0YXRpYyB2b2lkCitfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoIGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgLyogaGFuZGxlIGZvcmsgYmFycmllciB3b3JrZXJzIHdobyBhcmVuJ3QgcGFydCBvZiBhIHRlYW0geWV0ICovCisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzCisgICAgICAgdGhhdCBoYXZlIGJlZW4gZ2F0aGVyZWQuICBJZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIgaXMgZGVmaW5lZCAoZGVmYXVsdCkKKyAgICAgICB0aGUgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZ2F0aGVyLAorICAgICAgIG90aGVyd2lzZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBvcmRlci4gKi8KKworICAgIGlmICggISBLTVBfTUFTVEVSX1RJRCggdGlkICkpIHsKKyAgICAgICAgLyogd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgZ3RpZCwgJnRocl9iYXIgLT4gYl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCApICk7CisKKyAgICAgICAgLyogd2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzICovCisgICAgICAgIF9fa21wX3dhaXRfc2xlZXAoIHRoaXNfdGhyLCAmdGhyX2JhciAtPiBiX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoICggX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBvbiBhIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDAsIC0xICk7CisgICAgICAgICAgICAvLyBjYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKworICAgICAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOyAgLy8gY2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLworICAgICAgICAvLyBlYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIG1heSBub3cgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQuCisgICAgICAgIC8vCisjaWYgVVNFX0lUVF9CVUlMRCAmJiAhT01QXzMwX0VOQUJMRUQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgLy8gbGliZ3VpZGUgb25seSBjb2RlIChjYW5ub3QgdXNlICppdHRfdGFzayogcm91dGluZXMpCisgICAgICAgIGlmICggKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwgKSB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOyAgLy8gbm8gbmVlZCB0byBjYWxsIHJlbGVhc2luZywgYnV0IHdlIGhhdmUgcGFpcmVkIGNhbGxzLi4uCisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmICFPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHNldCBnbyglcCkgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSApICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB9IGVsc2UgeyAgLyogS01QX01BU1RFUl9USUQodGlkKSAqLworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIG1hc3RlciBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7CisgICAgfQorCisgICAgbnVtX3RocmVhZHMgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jOworICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworCisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgLyogY291bnQgdXAgdG8gY29ycmVjdCBsZXZlbCBmb3IgcGFyZW50ICovCisgICAgZm9yICggbGV2ZWwgPSAwLCBvZmZzZXQgPSAxOworICAgICAgICAgIG9mZnNldCA8IG51bV90aHJlYWRzICYmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3Rvci0xKSkgPT0gMCk7CisgICAgICAgICAgbGV2ZWwgKz0gYnJhbmNoX2JpdHMsIG9mZnNldCA8PD0gYnJhbmNoX2JpdHMgKTsKKworICAgIC8qIG5vdyBnbyBkb3duIGZyb20gdGhlcmUgKi8KKyAgICBmb3IgKCBsZXZlbCAtPSBicmFuY2hfYml0cywgb2Zmc2V0ID4+PSBicmFuY2hfYml0czsKKyAgICAgICAgICBvZmZzZXQgIT0gMDsKKyAgICAgICAgICBsZXZlbCAtPSBicmFuY2hfYml0cywgb2Zmc2V0ID4+PSBicmFuY2hfYml0cyApCisjZWxzZQorICAgIC8qIEdvIGRvd24gdGhlIHRyZWUsIGxldmVsIGJ5IGxldmVsICovCisgICAgZm9yICggbGV2ZWwgPSAwLCBvZmZzZXQgPSAxOworICAgICAgICAgIG9mZnNldCA8IG51bV90aHJlYWRzOworICAgICAgICAgIGxldmVsICs9IGJyYW5jaF9iaXRzLCBvZmZzZXQgPDw9IGJyYW5jaF9iaXRzICkKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIC8qIE5vdyBnbyBpbiByZXZlcnNlIG9yZGVyIHRocm91Z2ggdGhlIGNoaWxkcmVuLCBoaWdoZXN0IHRvIGxvd2VzdC4KKyAgICAgICAgICAgSW5pdGlhbCBzZXR0aW5nIG9mIGNoaWxkIGlzIGNvbnNlcnZhdGl2ZSBoZXJlLiAqLworICAgICAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWw9PTApP2xldmVsOmxldmVsLTEpOworICAgICAgICBmb3IgKCBjaGlsZCA9IChjaGlsZCA8IGJyYW5jaF9mYWN0b3ItMSkgPyBjaGlsZCA6IGJyYW5jaF9mYWN0b3ItMSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCA9IHRpZCArIChjaGlsZCA8PCBsZXZlbCk7CisgICAgICAgICAgICAgIGNoaWxkID49IDE7CisgICAgICAgICAgICAgIGNoaWxkLS0sIGNoaWxkX3RpZCAtPSAoMSA8PCBsZXZlbCkgKQorI2Vsc2UKKyAgICAgICAgaWYgKCgodGlkID4+IGxldmVsKSAmIChicmFuY2hfZmFjdG9yIC0gMSkpICE9IDApCisgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGdvIGFueSBsb3dlciB0aGFuIHRoaXMsIHNpbmNlIHRoaXMgaXMgdGhlIGxldmVsCisgICAgICAgICAgICAgICBwYXJlbnQgd291bGQgYmUgbm90aWZpZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBvbiB0aGlzIGxldmVsIG9mIHRoZSB0cmVlICovCisgICAgICAgIGZvciAoIGNoaWxkID0gMSwgY2hpbGRfdGlkID0gdGlkICsgKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICBjaGlsZCA8IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnVtX3RocmVhZHM7CisgICAgICAgICAgICAgIGNoaWxkKyssIGNoaWxkX3RpZCArPSAoMSA8PCBsZXZlbCkgKQorI2VuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGNoaWxkX3RpZCA+PSBudW1fdGhyZWFkcyApIGNvbnRpbnVlOyAgIC8qIGNoaWxkIGRvZXNuJ3QgZXhpc3Qgc28ga2VlcCBnb2luZyAqLworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzWyBjaGlsZF90aWQgXTsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICYgY2hpbGRfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBuZXh0X2NoaWxkX3RpZCA9IGNoaWxkX3RpZCAtICgxIDw8IGxldmVsKTsKKyAgICAgICAgICAgICAgICAvKiBwcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGNvdW50ICovCisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgaWYgKCBjaGlsZC0xID49IDEgJiYgbmV4dF9jaGlsZF90aWQgPCBudW1fdGhyZWFkcyApCisjZWxzZQorICAgICAgICAgICAgICAgIGlmICggY2hpbGQrMSA8IGJyYW5jaF9mYWN0b3IgJiYgbmV4dF9jaGlsZF90aWQgPCBudW1fdGhyZWFkcyApCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJm90aGVyX3RocmVhZHNbIG5leHRfY2hpbGRfdGlkIF0tPnRoLnRoX2JhclsgYnQgXS5iYi5iX2dvICk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZV9pY3ZzICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCB0ZWFtLT50LnRfaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXSwgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSApOworICAgICAgICAgICAgICAgICAgICBsb2FkX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtjaGlsZF90aWRdLnRkX2ljdnMsICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY19pY3ZzKCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JXUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGNoaWxkX3RpZCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2JhciAtPiBiX2dvLCBjaGlsZF9iYXIgLT4gYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyIC0+IGJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICkgKTsKKworICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyICovCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZSggY2hpbGRfdGhyLCAmY2hpbGRfYmFyIC0+IGJfZ28sIGttcF9hY3F1aXJlX2ZlbmNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKK30KKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGRvIGEgYmFycmllci4KKyAqIElmIGlzX3NwbGl0IGlzIHRydWUsIGRvIGEgc3BsaXQgYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHBsYWluIGJhcnJpZXIKKyAqIElmIHJlZHVjZSBpcyBub24tTlVMTCwgZG8gYSBzcGxpdCByZWR1Y3Rpb24gYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHNwbGl0IGJhcnJpZXIKKyAqIFJldHVybnMgMCBpZiBtYXN0ZXIgdGhyZWFkLCAxIGlmIHdvcmtlciB0aHJlYWQuCisgKi8KK2ludAorX19rbXBfYmFycmllciggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkLCBpbnQgaXNfc3BsaXQsCisgICAgICAgICAgICAgICBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikgKQoreworICAgIHJlZ2lzdGVyIGludCAgICAgICAgICB0aWQgICAgICAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBpbnQgc3RhdHVzID0gMDsKKworICAgIGlkZW50X3QgKiB0bXBfbG9jID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9pZGVudDsKKworICAgIEtBX1RSQUNFKCAxNSwgKCAiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgaGFzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkgKSApOworCisgICAgaWYgKCAhIHRlYW0tPnQudF9zZXJpYWxpemVkICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gaXR0IG5vdGlmeSBldmVudHMgYmVsb3cuCisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBOVUxMOworICAgICAgICAjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKQorICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnQsIDEgKTsKKyAgICAgICAgI2VuZGlmCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllciApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIoIHRlYW0sIHRoaXNfdGhyLCBndGlkICk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRhc2tpbmcgYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF9zbGVlcCgpCisgICAgICAgIC8vIGNhbiBhY2Nlc3MgaXQgd2hlbiB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSB0aGUgbm90ZSBhYm91dCB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIF9fa21wX2pvaW5fYmFycmllcigpCisgICAgICAgIC8vIGJlaW5nIHBlcmZvcm1hbmNlLWNyaXRpY2FsLgorICAgICAgICAvLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1t0aWRdOworICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfc2V0PSB0ZWFtIC0+IHQudF9zZXRfYnRfc2V0W3RpZF07CisgICAgICAgICAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgaWYgKCByZWR1Y2UgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vS01QX0RFQlVHX0FTU0VSVCggaXNfc3BsaXQgPT0gVFJVRSApOyAgLy8gI0M2OTk1NgorICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfbG9jYWwucmVkdWNlX2RhdGEgPSByZWR1Y2VfZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGJ0IF0gPT0gYnBfbGluZWFyX2JhciB8fCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgYnQgXSA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKCBidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBidCBdID09IGJwX3RyZWVfYmFyICkgeworICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlciggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBUT0RPOiBJbiBjYXNlIG9mIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBtYXN0ZXIgdGhyZWFkIG1heSBzZW5kIGFjcXVpcmVkIGV2ZW50IGVhcmx5LAorICAgICAgICAvLyBiZWZvcmUgdGhlIGZpbmFsIHN1bW1hdGlvbiBpbnRvIHRoZSBzaGFyZWQgdmFyaWFibGUgaXMgZG9uZSAoZmluYWwgc3VtbWF0aW9uIGNhbiBiZSBhCisgICAgICAgIC8vIGxvbmcgb3BlcmF0aW9uIGZvciBhcnJheSByZWR1Y3Rpb25zKS4KKyAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBpZiAoIEtNUF9NQVNURVJfVElEKCB0aWQgKSApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KCAgdGhpc190aHIsIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAoIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgLSByZXBvcnQgZnJhbWUgZW5kCisgICAgICAgICAgICBpZiggX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0IHRtcCA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCB0bXAsIDAsIHRtcF9sb2MgKTsKKyAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gdG1wOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSwgdG1wLCAxLCB0bXBfbG9jICk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgdG1wLCAwLCB0bXBfbG9jICk7CisgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lLCB0bXAsIDEsIHRtcF9sb2MgKTsKKyAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gdG1wOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gMSB8fCAhIGlzX3NwbGl0ICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnQgXSA9PSBicF9saW5lYXJfYmFyIHx8IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgYnQgXSA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnQgXSA9PSBicF90cmVlX2JhciApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZSggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmMoIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gR0VIOiBUT0RPOiBNb3ZlIHRoaXMgdW5kZXIgaWYtY29uZGl0aW9uIGFib3ZlIGFuZCBhbHNvIGluY2x1ZGUgaW4gX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoKS4KKyAgICAgICAgLy8gICAgICBUaGlzIHdpbGwgbW9yZSBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUgYWN0dWFsIHJlbGVhc2UgdGltZSBvZiB0aGUgdGhyZWFkcyBmb3Igc3BsaXQgYmFycmllcnMuCisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIH0gZWxzZSB7ICAgIC8vIFRlYW0gaXMgc2VyaWFsaXplZC4KKworICAgICAgICBzdGF0dXMgPSAwOworCisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSB0YXNrIHRlYW0gc2hvdWxkIGJlIE5VTEwgZm9yIHNlcmlhbGl6ZWQgY29kZS4KKyAgICAgICAgICAgICAgICAvLyAodGFza3Mgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGFza190ZWFtID09IE5VTEwgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IE5VTEwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nIHdpdGggcmV0dXJuIHZhbHVlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgKSApOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZAorX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCApCit7CisgICAgaW50ICAgICAgICAgdGlkICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworCisgICAgaWYoICEgdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnQgXSA9PSBicF9saW5lYXJfYmFyIHx8IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgYnQgXSA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE5VTEwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBidCBdID09IGJwX3RyZWVfYmFyICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKCBidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTlVMTAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKCBidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE5VTEwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKCB0aGlzX3RociwgdGVhbSApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGRldGVybWluZSBpZiB3ZSBjYW4gZ28gcGFyYWxsZWwgb3IgbXVzdCB1c2UgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbiBhbmQKKyAqIGhvdyBtYW55IHRocmVhZHMgd2UgY2FuIHVzZQorICogc2V0X25wcm9jIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtCisgKiByZXR1cm5zIDAgaWYgd2Ugc2hvdWxkIHNlcmlhbGl6ZSBvciBvbmx5IHVzZSBvbmUgdGhyZWFkLAorICogb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAqIFRoZSBmb3Jram9pbiBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludAorX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSwKKyAgIGludCBtYXN0ZXJfdGlkLCBpbnQgc2V0X250aHJlYWRzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLCBpbnQgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIGludCBjYXBhY2l0eTsKKyAgICBpbnQgbmV3X250aHJlYWRzOworICAgIGludCB1c2Vfcm1sX3RvX2FkanVzdF9udGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICYmIHBhcmVudF90ZWFtICk7CisKKyAgICAvLworICAgIC8vIEluaXRpYWwgY2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCB1c2UgYSBzZXJpYWxpemVkIHRlYW0uCisgICAgLy8KKyAgICBpZiAoIHNldF9udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCByZXNlcnZpbmcgMSB0aHJlYWQ7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgc2V0X250aHJlYWRzICkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCAoICFnZXRfX25lc3RlZF8yKHBhcmVudF90ZWFtLG1hc3Rlcl90aWQpICYmIChyb290LT5yLnJfaW5fcGFyYWxsZWwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICYmICFlbnRlcl90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgKSApIHx8ICggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3NlcmlhbCApICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHNldF9udGhyZWFkcyApKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiBkeW4tdmFyIGlzIHNldCwgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2YgZGVzaXJlZCB0aHJlYWRzLAorICAgIC8vIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBkeW5hbWljX21vZGUuCisgICAgLy8KKyAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgdXNlX3JtbF90b19hZGp1c3RfbnRoID0gRkFMU0U7CisgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApICkgeworICAgICAgICA7CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYyggcm9vdCwgc2V0X250aHJlYWRzICk7CisgICAgICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBsb2FkIGJhbGFuY2UgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPD0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHRocmVhZCBsaW1pdCByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBpZiAoIHNldF9udGhyZWFkcyA+IDIgKSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9nZXRfcmFuZG9tKCBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbbWFzdGVyX3RpZF0gKTsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9ICggbmV3X250aHJlYWRzICUgc2V0X250aHJlYWRzICkgKyAxOworICAgICAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBkeW5hbWljIHJhbmRvbSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCggMCApOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVzcGVjdCBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVC4KKyAgICAvLworICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgaW50IHRsX250aHJlYWRzID0gX19rbXBfbWF4X250aCAtIF9fa21wX250aCArICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPD0gMCApIHsKKyAgICAgICAgICAgIHRsX250aHJlYWRzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGR5bi12YXIgaXMgZmFsc2UsIGVtaXQgYSAxLXRpbWUgd2FybmluZy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgJiYgKCAhIF9fa21wX3Jlc2VydmVfd2FybiApICkgeworICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgdGxfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIEtNUF9BTExfVEhSRUFEUyByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICBtYXN0ZXJfdGlkLCB0bF9udGhyZWFkcyApKTsKKyAgICAgICAgbmV3X250aHJlYWRzID0gdGxfbnRocmVhZHM7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIHRoZSB0aHJlYWRzIGFycmF5IGlzIGxhcmdlIGVub3VnaCwgb3IgbmVlZHMgZXhwYW5kaW5nLgorICAgIC8vCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gX19rbXBfcmVnaXN0ZXJfcm9vdCgpIGFib3V0IHRoZSBhZGp1c3RtZW50IGlmCisgICAgLy8gX19rbXBfdGhyZWFkc1swXSA9PSBOVUxMLgorICAgIC8vCisgICAgY2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgIGlmICggVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLWNhcGFjaXR5OworICAgIH0KKyAgICBpZiAoIF9fa21wX250aCArIG5ld19udGhyZWFkcyAtICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSA+IGNhcGFjaXR5ICkgeworICAgICAgICAvLworICAgICAgICAvLyBFeHBhbmQgdGhlIHRocmVhZHMgYXJyYXkuCisgICAgICAgIC8vCisgICAgICAgIGludCBzbG90c1JlcXVpcmVkID0gX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSAtIGNhcGFjaXR5OworICAgICAgICBpbnQgc2xvdHNBZGRlZCA9IF9fa21wX2V4cGFuZF90aHJlYWRzKHNsb3RzUmVxdWlyZWQsIHNsb3RzUmVxdWlyZWQpOworICAgICAgICBpZiAoIHNsb3RzQWRkZWQgPCBzbG90c1JlcXVpcmVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRzIGFycmF5IHdhcyBub3QgZXhwYW5kZWQgZW5vdWdoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld19udGhyZWFkcyAtPSAoIHNsb3RzUmVxdWlyZWQgLSBzbG90c0FkZGVkICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfbnRocmVhZHMgPj0gMSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgZHluLXZhciBpcyBmYWxzZSwgZW1pdCBhIDEtdGltZSB3YXJuaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKQorICAgICAgICAgICAgICAmJiAoICEgX19rbXBfcmVzZXJ2ZV93YXJuICkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtIGFmdGVyIHJlY2xhaW1pbmcgZGVhZCByb290cyBhbmQgcmVjaGVja2luZzsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBzZXRfbnRocmVhZHMgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBhbGxvY2F0aW5nICVkIHRocmVhZHM7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfbnRocmVhZHMsIHNldF9udGhyZWFkcyApKTsKKyAgICByZXR1cm4gbmV3X250aHJlYWRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhbGxvY2F0ZSB0aHJlYWRzIGZyb20gdGhlIHRocmVhZCBwb29sIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgbmV3IHRlYW0gKi8KKy8qIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlcmUgYXJlIGVub3VnaCB0aHJlYWRzIGF2YWlsYWJsZSwgYmVjYXVzZSB3ZQorICogY2hlY2tlZCBvbiB0aGF0IGVhcmxpZXIgd2l0aGluIGNyaXRpY2FsIHNlY3Rpb24gZm9ya2pvaW4gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCwgaW50IG1hc3Rlcl9ndGlkICkKK3sKKyAgICBpbnQgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ZvcmtfdGVhbV90aHJlYWRzOiBuZXdfbnByb2NzID0gJWRcbiIsIHRlYW0tPnQudF9ucHJvYyApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX2d0aWQgPT0gX19rbXBfZ2V0X2d0aWQoKSApOworICAgIEtNUF9NQigpOworCisgICAgLyogZmlyc3QsIGxldCdzIHNldHVwIHRoZSBtYXN0ZXIgdGhyZWFkICovCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW0gICAgICAgICAgICA9IHRlYW07CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW1fbnByb2MgICAgICA9IHRlYW0gLT4gdC50X25wcm9jOworICAgIG1hc3Rlcl90aCAtPiB0aC50aF90ZWFtX21hc3RlciAgICAgPSBtYXN0ZXJfdGg7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IEZBTFNFOworICAgIG1hc3Rlcl90aCAtPiB0aC50aF9kaXNwYXRjaCAgICAgICAgPSAmIHRlYW0gLT4gdC50X2Rpc3BhdGNoWyAwIF07CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgYXJlIG5vdCB0aGUgb3B0aW1pemVkIGhvdCB0ZWFtICovCisgICAgaWYgKCB0ZWFtICE9IHJvb3QtPnIucl9ob3RfdGVhbSApIHsKKworICAgICAgICAvKiBpbnN0YWxsIHRoZSBtYXN0ZXIgdGhyZWFkICovCisgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbIDAgXSAgICA9IG1hc3Rlcl90aDsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBtYXN0ZXJfdGgsIHRlYW0sIDAsIG1hc3Rlcl9ndGlkICk7CisKKyAgICAgICAgLyogbm93LCBpbnN0YWxsIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBmb3IgKCBpPTEgOyAgaSA8IHRlYW0tPnQudF9ucHJvYyA7IGkrKyApIHsKKworICAgICAgICAgICAgLyogZm9yayBvciByZWFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgaW5zdGFsbCBpdCBpbiB0ZWFtICovCisgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyBpIF0gPSAgX19rbXBfYWxsb2NhdGVfdGhyZWFkKCByb290LCB0ZWFtLCBpICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tpXSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbaV0tPnRoLnRoX3RlYW0gPT0gdGVhbSApOworICAgICAgICAgICAgLyogYWxpZ24gdGVhbSBhbmQgdGhyZWFkIGFycml2ZWQgc3RhdGVzICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IFQjJWQoJWQ6JWQpIGluaXQgYXJyaXZlZCBUIyVkKCVkOiVkKSBqb2luID0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggaSwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19wbGFpbl9iYXJyaWVyIF0uYl9hcnJpdmVkICkgKTsKKworICAgICAgICAgICAgeyAvLyBJbml0aWFsaXplIHRocmVhZHMnIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSB0ZWFtLT50LnRfdGhyZWFkc1sgaSBdLT50aC50aF9iYXI7CisgICAgICAgICAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgIH07IC8vIGZvciBiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworI2VuZGlmCisKKyAgICB9CisKKyAgICBLTVBfTUIoKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggaW50IGFyZ2MsIGttcF90ZWFtX3QgKnRlYW0sIGludCByZWFsbG9jICk7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24KKworc3RhdGljIHZvaWQKK19fa21wX3NldHVwX2ljdl9jb3B5KCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X25wcm9jLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgIGxvYworI2Vsc2UKKyAgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfbnByb2MsIGludCBuZXdfc2V0X2R5bmFtaWMsIGludCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfYmxvY2t0aW1lLCBpbnQgbmV3X2J0X2ludGVydmFscywgaW50IG5ld19idF9zZXQKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICApOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8qIG1vc3Qgb2YgdGhlIHdvcmsgZm9yIGEgZm9yayAqLworLyogcmV0dXJuIHRydWUgaWYgd2UgcmVhbGx5IHdlbnQgcGFyYWxsZWwsIGZhbHNlIGlmIHNlcmlhbGl6ZWQgKi8KK2ludAorX19rbXBfZm9ya19jYWxsKAorICAgIGlkZW50X3QgICAqIGxvYywKKyAgICBpbnQgICAgICAgICBndGlkLAorICAgIGludCAgICAgICAgIGV4ZWNfbWFzdGVyLCAvLyAwIC0gR05VIG5hdGl2ZSBjb2RlLCBtYXN0ZXIgZG9lc24ndCBpbnZva2UgbWljcm90YXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBJbnRlbCBjb2RlLCBtYXN0ZXIgaW52b2tlcyBtaWNyb3Rhc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiAtIE1TIG5hdGl2ZSBjb2RlLCB1c2Ugc3BlY2lhbCBpbnZva2VyCisgICAga21wX2ludDMyICAgYXJnYywKKyAgICBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssCisgICAgbGF1bmNoX3QgICAgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiBLTVBfT1NfTElOVVgKKyAgICB2YV9saXN0ICAgKiBhcAorI2Vsc2UKKyAgICB2YV9saXN0ICAgICBhcAorI2VuZGlmCisgICAgKQoreworICAgIHZvaWQgICAgICAgICAgKiphcmd2OworICAgIGludCAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGlkOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGhpc19jb25zOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfbGFzdF9jb25zOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBudGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX2FjdGl2ZTsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBsZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICB0ZWFtc19sZXZlbDsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIGluaXRpYWxpemUgaWYgbmVlZGVkICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcGFyZW50X3RlYW0gICA9IG1hc3Rlcl90aCAtPiB0aC50aF90ZWFtOworICAgIG1hc3Rlcl90aWQgICAgPSBtYXN0ZXJfdGggLT4gdGgudGhfaW5mby5kcy5kc190aWQ7CisgICAgbWFzdGVyX3RoaXNfY29ucyA9IG1hc3Rlcl90aCAtPiB0aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKyAgICBtYXN0ZXJfbGFzdF9jb25zID0gbWFzdGVyX3RoIC0+IHRoLnRoX2xvY2FsLmxhc3RfY29uc3RydWN0OworICAgIHJvb3QgICAgICAgICAgPSBtYXN0ZXJfdGggLT4gdGgudGhfcm9vdDsKKyAgICBtYXN0ZXJfYWN0aXZlID0gcm9vdCAtPiByLnJfYWN0aXZlOworICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA9IG1hc3Rlcl90aCAtPiB0aC50aF9zZXRfbnByb2M7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgbGV2ZWwgICAgICAgICA9IHBhcmVudF90ZWFtLT50LnRfbGV2ZWw7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRlYW1zX2xldmVsICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsgLy8gbmVlZGVkIHRvIGNoZWNrIG5lc3RpbmcgaW5zaWRlIHRoZSB0ZWFtcworI2VuZGlmCisKKworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX21pY3JvdGFzayAmJgorICAgICAgICAgYXAgJiYgbWljcm90YXNrICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgbGV2ZWwgPT0gdGVhbXNfbGV2ZWwgKSB7CisgICAgICAgIC8vIEFDOiBUaGlzIGlzIHN0YXJ0IG9mIHBhcmFsbGVsIHRoYXQgaXMgbmVzdGVkIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBUaGUgdGVhbSBpcyBhY3R1YWwgKGhvdCksIGFsbCB3b3JrZXJzIGFyZSByZWFkeSBhdCB0aGUgZm9yayBiYXJyaWVyLgorICAgICAgICAvLyAgICAgTm8gbG9jayBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdGVhbSBhIGJpdCwgdGhlbiBmcmVlIHdvcmtlcnMuCisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYXJnYyAgPSBhcmdjOworICAgICAgICBhcmd2ID0gKHZvaWQqKilwYXJlbnRfdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjZWxzZQorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworI2VuZGlmCisgICAgICAgIC8qIEluY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVscywgYnV0IG5vdCBpbmNyZWFzZSB0aGUgc2VyaWFsaXphdGlvbiAqLworICAgICAgICBpZiAoIHBhcmVudF90ZWFtID09IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gKSB7CisgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGluIHNlcmlhbGl6ZWQgcGFyYWxsZWwKKyAgICAgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPiAxICk7CisgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQtLTsgLy8gQUM6IG5lZWQgdGhpcyBpbiBvcmRlciBlbnF1aXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3b3JrIGNvcnJlY3RseSwgd2lsbCByZXN0b3JlIGF0IGpvaW4gdGltZQorICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfcGtmbiAgPSBtaWNyb3Rhc2s7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKys7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgKys7CisKKyAgICAgICAgLyogQ2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSB0ZWFtIGlmIHJlcXVlc3RlZCAqLworICAgICAgICBpZiAoIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyApIHsgICAvLyBUaGUgcGFyYWxsZWwgaGFzIG51bV90aHJlYWRzIGNsYXVzZQorICAgICAgICAgICAgaWYgKCBtYXN0ZXJfc2V0X251bXRocmVhZHMgPCBtYXN0ZXJfdGgtPnRoLnRoX3NldF9udGhfdGVhbXMgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IG9ubHkgY2FuIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZHluYW1pY2FsbHksIGNhbm5vdCBpbmNyZWFzZQorICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gcGFyZW50X3RlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfbnByb2MgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtYXN0ZXJfc2V0X251bXRocmVhZHM7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbV9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gS2VlcCBleHRyYSB0aHJlYWRzIGhvdCBpbiB0aGUgdGVhbSBmb3IgcG9zc2libGUgbmV4dCBwYXJhbGxlbHMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworICAgICAgICBfX2ttcF9pbnRlcm5hbF9mb3JrKCBsb2MsIGd0aWQsIHBhcmVudF90ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBhZnRlciBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworCisgICAgICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisKKyAgICAgICAgaWYgKCEgcGFyZW50X3RlYW0tPnQudF9pbnZva2UoIGd0aWQgKSkgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoIDAsICJjYW5ub3QgaW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCIgKTsKKyAgICAgICAgfQorICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCBwYXJlbnRfdGVhbS0+dC50X3BrZm4gKSApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfMzBfRU5BQkxFRCAmJiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IG5ldyB0aHJlYWRzIHdlIGNhbiB1c2UgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpZiAoIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID49IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgeworICAgICAgICBudGhyZWFkcyA9IDE7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgeworICAgICAgICBudGhyZWFkcyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA/CisgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHMgOiBnZXRfX25wcm9jXzIoIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkICk7CisgICAgICAgIG50aHJlYWRzID0gX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCwgbnRocmVhZHMKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAvLyBBQzogSWYgd2UgZXhlY3V0ZSB0ZWFtcyBmcm9tIHBhcmFsbGVsIHJlZ2lvbiAob24gaG9zdCksIHRoZW4gdGVhbXMKKyAgICAgICAgLy8gICAgIHNob3VsZCBiZSBjcmVhdGVkIGJ1dCBlYWNoIGNhbiBvbmx5IGhhdmUgMSB0aHJlYWQgaWYgbmVzdGluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgLy8gICAgIElmIHRlYW1zIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24sIHRoZW4gdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMKKyAgICAgICAgLy8gICAgIHNob3VsZCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIG5lc3Rpbmcgc2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsKCAoIGFwID09IE5VTEwgJiYgdGVhbXNfbGV2ZWwgPT0gMCApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBhcCAmJiB0ZWFtc19sZXZlbCA+IDAgJiYgdGVhbXNfbGV2ZWwgPT0gbGV2ZWwgKSApCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAwICk7CisKKyAgICAvKiBJZiB3ZSB0ZW1wb3JhcmlseSBjaGFuZ2VkIHRoZSBzZXQgbnVtYmVyIG9mIHRocmVhZHMgdGhlbiByZXN0b3JlIGl0IG5vdyAqLworICAgIG1hc3Rlcl90aCAtPiB0aC50aF9zZXRfbnByb2MgPSAwOworCisKKyAgICAvKiBjcmVhdGUgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbj8gKi8KKyAgICBpZiAoIG50aHJlYWRzID09IDEgKSB7CisgICAgICAgIC8qIGpvc2ggdG9kbzogaHlwb3RoZXRpY2FsIHF1ZXN0aW9uOiB3aGF0IGRvIHdlIGRvIGZvciBPUyBYKj8gKi8KKyNpZiBLTVBfT1NfTElOVVggJiYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSApCisgICAgICAgIHZvaWQgKiAgIGFyZ3NbIGFyZ2MgXTsKKyNlbHNlCisgICAgICAgIHZvaWQgKiAqIGFyZ3MgPSAodm9pZCoqKSBhbGxvY2EoIGFyZ2MgKiBzaXplb2YoIHZvaWQgKiApICk7CisjZW5kaWYgLyogS01QX09TX0xJTlVYICYmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gKSAqLworCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsaXppbmcgcGFyYWxsZWwgcmVnaW9uXG4iLCBndGlkICkpOworCisgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisKKyAgICAgICAgaWYgKCBleGVjX21hc3RlciA9PSAwICkgeworICAgICAgICAgICAgLy8gd2Ugd2VyZSBjYWxsZWQgZnJvbSBHTlUgbmF0aXZlIGNvZGUKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsIGV4aXRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0gZWxzZSBpZiAoIGV4ZWNfbWFzdGVyID09IDEgKSB7CisgICAgICAgICAgICAvKiBUT0RPIHRoaXMgc3Vja3MsIHVzZSB0aGUgY29tcGlsZXIgaXRzZWxmIHRvIHBhc3MgYXJncyEgOikgKi8KKyAgICAgICAgICAgIG1hc3Rlcl90aCAtPiB0aC50aF9zZXJpYWxfdGVhbSAtPiB0LnRfaWRlbnQgPSAgbG9jOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBpZiAoICFhcCApIHsKKyAgICAgICAgICAgICAgICAvLyByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aCAtPiB0aC50aF9zZXJpYWxfdGVhbSAtPiB0LnRfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIHBhcmVudF90ZWFtLT50LnRfYXJndiApOworICAgICAgICAgICAgfSBlbHNlIGlmICggbWljcm90YXNrID09IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF90ZWFtID09IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgICAgICB0ZWFtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIC8vdGVhbS0+dC50X3BrZm4gPSBtaWNyb3Rhc2s7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ludm9rZSA9IGludm9rZXI7CisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MgPSBhcmdjOworICAgICAgICAgICAgICAgIGFyZ3YgPSAodm9pZCoqKSB0ZWFtLT50LnRfYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoIGFwICkgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9YXJnYy0xOyBpID49IDA7IC0taSApCisgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisgICAgICAgICAgICAgICAgICAgICAgI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisgICAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0gPSBwYXJlbnRfdGVhbS0+dC50X2FyZ3ZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFDOiByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGluaXRpYWwgY29kZSBpbiB0ZWFtcyBzaG91bGQgaGF2ZSBsZXZlbD0wCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gQUM6IGNhbGwgc3BlY2lhbCBpbnZva2VyIGZvciBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICBpbnZva2VyKGd0aWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgICAgIGFyZ3YgPSBhcmdzOworICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyAgICAgICAgICAgICAgICAjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCAqYXAsIHZvaWQgKiApOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIGFyZ3MgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggZXhlY19tYXN0ZXIgPD0gMSwgIl9fa21wX2ZvcmtfY2FsbDogdW5rbm93biBwYXJhbWV0ZXIgZXhlY19tYXN0ZXIiICk7CisgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbCBleGl0XG4iLCBndGlkICkpOworCisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBHRUg6IG9ubHkgbW9kaWZ5IHRoZSBleGVjdXRpbmcgZmxhZyBpbiB0aGUgY2FzZSB3aGVuIG5vdCBzZXJpYWxpemVkCisgICAgLy8gICAgICBzZXJpYWxpemVkIGNhc2UgaXMgaGFuZGxlZCBpbiBrbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogcGFyZW50X3RlYW1fYWNsZXZlbD0lZCwgbWFzdGVyX3RoPSVwLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heF9hY2xldmVsPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbWFzdGVyX3RoLCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMgZXhlY3V0aW5nCisgICAgLy8gS01QX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vCisgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIElDVnMuCisgICAgLy8KKyAgICBpbnQgbnRocmVhZHNfaWN2ID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisgICAgaWYgKCAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICYmCisgICAgICAoIF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsICsgMV0gIT0gbnRocmVhZHNfaWN2ICkgKSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsICsgMV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudGhyZWFkc19pY3YgPSAwOyAgLy8gZG9uJ3QgdXBkYXRlCisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLworICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHByb2NfYmluZF9wb2xpY3kgZm9yIHRoZSBuZXcgdGVhbS4KKyAgICAvLworICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZF9pY3Y7IC8vIHByb2NfYmluZF9kZWZhdWx0IG1lYW5zIGRvbid0IHVwZGF0ZQorCisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPT0gcHJvY19iaW5kX2ZhbHNlICkgeworICAgICAgICBwcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgIHByb2NfYmluZF9pY3YgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByb2NfYmluZF9pY3YgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQ7CisgICAgICAgIGlmICggcHJvY19iaW5kID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vIHByb2NfYmluZCBjbGF1c2Ugd2FzIHNwZWNpZmllZCwgc28gdXNlIHRoZSBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAvLyBvZiBwcm9jLWJpbmQtdmFyIGZvciB0aGlzIHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcm9jX2JpbmQgPSBwcm9jX2JpbmRfaWN2OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSBwcm9jX2JpbmQgcG9saWN5IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBvbiB0aGUgcGFyYWxsZWwKKyAgICAgICAgICAgIC8vIGNsYXVzZS4gIFRoaXMgb3ZlcnJpZGVzIHRoZSBwcm9jLWJpbmQtdmFyIGZvciB0aGlzIHBhcmFsbGVsCisgICAgICAgICAgICAvLyByZWdpb24sIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgcHJvYy1iaW5kLXZhci4KKyAgICAgICAgICAgIC8vCisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGaWd1cmUgdGhlIHZhbHVlIG9mIHByb2MtYmluZC12YXIgZm9yIHRoZSBjaGlsZCB0aHJlYWRzLgorICAgICAgICAvLworICAgICAgICBpZiAoICggbGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkICkKKyAgICAgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCArIDFdICE9IHByb2NfYmluZF9pY3YgKSApIHsKKyAgICAgICAgICAgIHByb2NfYmluZF9pY3YgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbbGV2ZWwgKyAxXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByb2NfYmluZF9pY3YgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUmVzZXQgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgICAgLy8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYgKCAoIG50aHJlYWRzX2ljdiA+IDAgKQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICB8fCAoIHByb2NfYmluZF9pY3YgIT0gcHJvY19iaW5kX2RlZmF1bHQgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICApCisgICAgeworICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IG5ld19pY3ZzOworICAgICAgICBjb3B5X2ljdnMoICYgbmV3X2ljdnMsICYgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyAgICAgICAgbmV3X2ljdnMubmV4dCA9IE5VTEw7CisKKyAgICAgICAgaWYgKCBudGhyZWFkc19pY3YgPiAwICkgeworICAgICAgICAgICAgbmV3X2ljdnMubnByb2MgPSBudGhyZWFkc19pY3Y7CisgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggcHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIG5ld19pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9pY3Y7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgJm5ld19pY3ZzLCBhcmdjICk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisjZWxzZQorICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2V0X25wcm9jW21hc3Rlcl90aWRdLAorICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2V0X2R5bmFtaWNbbWFzdGVyX3RpZF0sCisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXRfbmVzdGVkW21hc3Rlcl90aWRdLAorICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVttYXN0ZXJfdGlkXSwKKyAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbbWFzdGVyX3RpZF0sCisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXRfYnRfc2V0W21hc3Rlcl90aWRdLAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgYXJnYyApOworICAgIH0KKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBhZnRlciBfX2ttcF9hbGxvY2F0ZV90ZWFtIC0gdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgdGVhbSApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgbmV3IHRlYW0gKi8KKyAgICB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9IG1hc3Rlcl90aWQ7CisgICAgdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGhpc19jb25zOworICAgIHRlYW0tPnQudF9tYXN0ZXJfbGFzdF9jb25zID0gbWFzdGVyX2xhc3RfY29uczsKKworICAgIHRlYW0tPnQudF9wYXJlbnQgICAgID0gcGFyZW50X3RlYW07CisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBtaWNyb3Rhc2spOworICAgIHRlYW0tPnQudF9pbnZva2UgICAgID0gaW52b2tlcjsgIC8qIFRPRE8gbW92ZSB0aGlzIHRvIHJvb3QsIG1heWJlICovCisgICAgdGVhbS0+dC50X2lkZW50ICAgICAgPSBsb2M7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBUT0RPOiBwYXJlbnRfdGVhbS0+dC50X2xldmVsID09IElOVF9NQVggPz8/CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrIHx8IGxldmVsID4gdGVhbXNfbGV2ZWwgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsICAgICAgICA9IHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgKyAxOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyAxOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUM6IERvIG5vdCBpbmNyZWFzZSBwYXJhbGxlbCBsZXZlbCBhdCBzdGFydCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIHRlYW0tPnQudF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWw7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgdGVhbS0+dC50X3NjaGVkICAgICAgPSBnZXRfX3NjaGVkXzIoIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkICk7IC8vIHNldCBtYXN0ZXIncyBzY2hlZHVsZSBhcyBuZXcgcnVuLXRpbWUgc2NoZWR1bGUKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBpZiAoIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApIHsKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgX19rbXBfc3RvcmVfbXhjc3IoICZ0ZWFtLT50LnRfbXhjc3IgKTsKKyAgICAgICAgdGVhbS0+dC50X214Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKyAgICAgICAgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgPSBGQUxTRTsKKyAgICB9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBtYXN0ZXIgdGhyZWFkJ3MgdGFzayB0ZWFtIHRvIHRoZSB0ZWFtJ3MgdGFzayB0ZWFtLgorICAgICAgICAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgaG90IHRlYW0sIGl0IHNob3VsZCBiZSBOVUxMLgorICAgICAgICAvLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2ZvcmtfY2FsbDogTWFzdGVyIFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLCB0ZWFtLT50LnRfdGFza190ZWFtLCB0ZWFtICkgKTsKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IE5VTEwgKSB8fCAoIHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtICkgKSA7CisgICAgfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOiVkKS0+KCVkOjApIGNyZWF0ZWQgYSB0ZWFtIG9mICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgdGVhbS0+dC50X21hc3Rlcl90aWQsIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X25wcm9jICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gIT0gcm9vdC0+ci5yX2hvdF90ZWFtIHx8CisgICAgICAgICAgICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9wYXJlbnQgPT0gcm9vdC0+ci5yX3Jvb3RfdGVhbSB8fCB0ZWFtLT50LnRfcGFyZW50LT50LnRfc2VyaWFsaXplZCApICkpOworICAgIEtNUF9NQigpOworCisgICAgLyogbm93LCBzZXR1cCB0aGUgYXJndW1lbnRzICovCisgICAgYXJndiA9ICh2b2lkKiopIHRlYW0gLT4gdC50X2FyZ3Y7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIGFwICkgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjZWxzZQorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGFyZ3ZbaV0gPSB0ZWFtLT50LnRfcGFyZW50LT50LnRfYXJndltpXTsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIG5vdyBhY3R1YWxseSBmb3JrIHRoZSB0aHJlYWRzICovCisKKyAgICB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSA9IG1hc3Rlcl9hY3RpdmU7CisgICAgaWYgKCFyb290IC0+IHIucl9hY3RpdmUpICAvKiBPbmx5IGRvIHRoZSBhc3NpZ25tZW50IGlmIGl0IG1ha2VzIGEgZGlmZmVyZW5jZSB0byBwcmV2ZW50IGNhY2hlIHBpbmctcG9uZyAqLworICAgICAgICByb290IC0+IHIucl9hY3RpdmUgPSBUUlVFOworCisgICAgX19rbXBfZm9ya190ZWFtX3RocmVhZHMoIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCApOworICAgIF9fa21wX3NldHVwX2ljdl9jb3B5KHRlYW0sIG50aHJlYWRzCisjaWYgT01QXzMwX0VOQUJMRUQKKwkJCSAsICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgbG9jCisjZWxzZQorCQkJICwgcGFyZW50X3RlYW0tPnQudF9zZXRfbnByb2NbbWFzdGVyX3RpZF0sCisJCQkgcGFyZW50X3RlYW0tPnQudF9zZXRfZHluYW1pY1ttYXN0ZXJfdGlkXSwKKwkJCSBwYXJlbnRfdGVhbS0+dC50X3NldF9uZXN0ZWRbbWFzdGVyX3RpZF0sCisJCQkgcGFyZW50X3RlYW0tPnQudF9zZXRfYmxvY2t0aW1lW21hc3Rlcl90aWRdLAorCQkJIHBhcmVudF90ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1ttYXN0ZXJfdGlkXSwKKwkJCSBwYXJlbnRfdGVhbS0+dC50X3NldF9idF9zZXRbbWFzdGVyX3RpZF0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCQkJICk7CisKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAvLyBNYXJrIHN0YXJ0IG9mICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudC4KKyAgICBpZiAoICggX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgfHwgS01QX0lUVF9ERUJVRyApCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtX21pY3JvdGFzayB8fCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApCisgICAgICAgIC8vIEVpdGhlciBub3QgaW4gdGVhbXMgb3IgdGhlIG91dGVyIGZvcmsgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICYmIE9NUF8zMF9FTkFCTEVECisgICAgLy8gSW50ZXJuYWwgZm9yayAtIHJlcG9ydCBmcmFtZSBiZWdpbgorICAgIGlmKCAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApICYmIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgJiYgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgIHsKKyAgICAgICAgaWYoICEgKCB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID4gMSApICkgeworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9mcmFtZV90aW1lICAgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogbm93IGdvIG9uIGFuZCBkbyB0aGUgd29yayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSApOworICAgIEtNUF9NQigpOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnRlcm5hbF9mb3JrIDogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLCByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIHRlYW0tPnQudF9zdGFja19pZCA9IF9fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7IC8vIGNyZWF0ZSBuZXcgc3RhY2sgc3RpdGNoaW5nIGlkIGJlZm9yZSBlbnRlcmluZyBmb3JrIGJhcnJpZXIKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIGFwICkgICAvLyBBQzogc2tpcCBfX2ttcF9pbnRlcm5hbF9mb3JrIGF0IHRlYW1zIGNvbnN0cnVjdCwgbGV0IG9ubHkgbWFzdGVyIHRocmVhZHMgZXhlY3V0ZQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICBfX2ttcF9pbnRlcm5hbF9mb3JrKCBsb2MsIGd0aWQsIHRlYW0gKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnRlcm5hbF9mb3JrIDogYWZ0ZXIgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisgICAgfQorCisgICAgaWYgKCEgZXhlY19tYXN0ZXIpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisKKyAgICBpZiAoISB0ZWFtLT50LnRfaW52b2tlKCBndGlkICkpIHsKKyAgICAgICAgS01QX0FTU0VSVDIoIDAsICJjYW5ub3QgaW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCIgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9wa2ZuICkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3ZvaWQKK19fa21wX2pvaW5fY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICwgaW50IGV4aXRfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aCAtPiB0aC50aF9yb290OworICAgIHRlYW0gICAgICAgICAgPSBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbTsKKyAgICBwYXJlbnRfdGVhbSAgID0gdGVhbS0+dC50X3BhcmVudDsKKworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBPTVBfMzBfRU5BQkxFRCAmJiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2pvaW5fY2FsbDogVCMlZCwgb2xkIHRlYW0gPSAlcCBvbGQgdGFza190ZWFtID0gJXAsIHRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApLCB0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3Rhc2tfdGVhbSwgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0pICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHRlYW0tPnQudF90YXNrX3RlYW0gKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgICAgICAgICBpbnQgdGxldmVsID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIGlmICggbGV2ZWwgPT0gdGxldmVsICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiB3ZSBoYXZlbid0IGluY3JlbWVudGVkIGl0IGVhcmxpZXIgYXQgc3RhcnQgb2YgdGVhbXMgY29uc3RydWN0LAorICAgICAgICAgICAgICAgIC8vICAgICBzbyBkbyBpdCBoZXJlIC0gYXQgdGhlIGVuZCBvZiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGxldmVsID09IHRsZXZlbCArIDEgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHdlIGFyZSBleGl0aW5nIHBhcmFsbGVsIGluc2lkZSB0ZWFtcywgbmVlZCB0byBpbmNyZW1lbnQgc2VyaWFsaXphdGlvbgorICAgICAgICAgICAgICAgIC8vICAgICBpbiBvcmRlciB0byByZXN0b3JlIGl0IGluIHRoZSBuZXh0IGNhbGwgdG8gX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NlcmlhbGl6ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCggbG9jLCBndGlkICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXN0ZXJfYWN0aXZlID0gdGVhbS0+dC50X21hc3Rlcl9hY3RpdmU7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICghZXhpdF90ZWFtcykKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLy8gQUM6IE5vIGJhcnJpZXIgZm9yIGludGVybmFsIHRlYW1zIGF0IGV4aXQgZnJvbSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBCdXQgdGhlcmUgaXMgYmFycmllciBmb3IgZXh0ZXJuYWwgdGVhbSAobGVhZ3VlKS4KKyAgICAgICAgX19rbXBfaW50ZXJuYWxfam9pbiggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgfQorICAgIEtNUF9NQigpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggKF9faXR0X2NhbGxlcil0ZWFtLT50LnRfc3RhY2tfaWQgKTsgLy8gZGVzdHJveSB0aGUgc3RhY2sgc3RpdGNoaW5nIGlkIGFmdGVyIGpvaW4gYmFycmllcgorICAgIH0KKworICAgIC8vIE1hcmsgZW5kIG9mICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudC4KKyAgICBpZiAoICggX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgJiYgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApIHx8IEtNUF9JVFRfREVCVUcgKQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgLyogbm90IGluIHRlYW1zICovIHx8CisgICAgICAgICAoICFleGl0X3RlYW1zICYmIHRlYW0tPnQudF9sZXZlbCA9PSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsICkgKQorICAgICAgICAvLyBFaXRoZXIgbm90IGluIHRlYW1zIG9yIGV4aXRpbmcgdGVhbXMgcmVnaW9uCisgICAgICAgIC8vICh0ZWFtcyBpcyBhIGZyYW1lIGFuZCBubyBvdGhlciBmcmFtZXMgaW5zaWRlIHRoZSB0ZWFtcykKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCBndGlkICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrICYmCisgICAgICAgICAhZXhpdF90ZWFtcyAmJgorICAgICAgICAgdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKyAxICkgeworICAgICAgICAvLyBBQzogV2UgbmVlZCB0byBsZWF2ZSB0aGUgdGVhbSBzdHJ1Y3R1cmUgaW50YWN0IGF0IHRoZSBlbmQKKyAgICAgICAgLy8gICAgIG9mIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0CisgICAgICAgIC8vICAgICBwYXJhbGxlbCBzYW1lIChob3QpIHRlYW0gd29ya3MsIG9ubHkgYWRqdXN0IG5lc3RpbmcgbGV2ZWxzCisKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsIC0tOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0tOworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworCisgICAgICAgIC8qIFJlc3RvcmUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgbmVlZGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jIDwgbWFzdGVyX3RoLT50aC50aF9zZXRfbnRoX3RlYW1zICkgeworICAgICAgICAgICAgaW50IG9sZF9udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBpbnQgbmV3X251bSA9IG1hc3Rlcl90aC0+dGgudGhfc2V0X250aF90ZWFtczsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MgPSBuZXdfbnVtOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBvbGRfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGp1c3Qgc3RhdGVzIG9mIG5vbi11c2VkIHRocmVhZHMgb2YgdGhlIHRlYW0KKyAgICAgICAgICAgIGZvciAoIGkgPSBvbGRfbnVtOyBpIDwgbmV3X251bTsgKytpICkgeworICAgICAgICAgICAgICAgIC8vIFJlLWluaXRpYWxpemUgdGhyZWFkJ3MgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJwX2xhc3RfYmFyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgdGhyZWFkJ3MgdGFzayBzdGF0ZQorICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3Rhc2tfc3RhdGUgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIC8qIGRvIGNsZWFudXAgYW5kIHJlc3RvcmUgdGhlIHBhcmVudCB0ZWFtICovCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2luZm8gLmRzLmRzX3RpZCA9IHRlYW0gLT4gdC50X21hc3Rlcl90aWQ7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gdGVhbSAtPiB0LnRfbWFzdGVyX3RoaXNfY29uczsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfbG9jYWwubGFzdF9jb25zdHJ1Y3QgPSB0ZWFtIC0+IHQudF9tYXN0ZXJfbGFzdF9jb25zOworCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2Rpc3BhdGNoID0KKyAgICAgICAgICAgICAgICAmIHBhcmVudF90ZWFtIC0+IHQudF9kaXNwYXRjaFsgdGVhbSAtPiB0LnRfbWFzdGVyX3RpZCBdOworCisgICAgLyogamM6IFRoZSBmb2xsb3dpbmcgbG9jayBoYXMgaW5zdHJ1Y3Rpb25zIHdpdGggUkVMIGFuZCBBQ1Egc2VtYW50aWNzLAorICAgICAgIHNlcGFyYXRpbmcgdGhlIHBhcmFsbGVsIHVzZXIgY29kZSBjYWxsZWQgaW4gdGhpcyBwYXJhbGxlbCByZWdpb24KKyAgICAgICBmcm9tIHRoZSBzZXJpYWwgdXNlciBjb2RlIGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgICAgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrIHx8IHRlYW0tPnQudF9sZXZlbCA+IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfaW5fcGFyYWxsZWwgPj0gMCApOworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2pvaW5fY2FsbDE6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgbWFzdGVyX3RoLCB0ZWFtICkgKTsKKyAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKTsKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIFJlc3RvcmUgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIG1hc3Rlcl90aCAtPiB0aC50aF9maXJzdF9wbGFjZSA9IHRlYW0gLT4gdC50X2ZpcnN0X3BsYWNlOworICAgIG1hc3Rlcl90aCAtPiB0aC50aF9sYXN0X3BsYWNlID0gdGVhbSAtPiB0LnRfbGFzdF9wbGFjZTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkICkgeworICAgICAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBpZiAoIHJvb3QgLT4gci5yX2FjdGl2ZSAhPSBtYXN0ZXJfYWN0aXZlICkKKyAgICAgICAgcm9vdCAtPiByLnJfYWN0aXZlID0gbWFzdGVyX2FjdGl2ZTsKKworICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgdGVhbSApOyAvKiB0aGlzIHdpbGwgZnJlZSB3b3JrZXIgdGhyZWFkcyAqLworCisgICAgLyogdGhpcyByYWNlIHdhcyBmdW4gdG8gZmluZC4gIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGlzIGluIHRoZSBjcml0aWNhbAorICAgICAqIHJlZ2lvbiBvdGhlcndpc2UgYXNzZXJ0aW9ucyBtYXkgZmFpbCBvY2Nhc2lvdW5hbGx5IHNpbmNlIHRoZSBvbGQgdGVhbQorICAgICAqIG1heSBiZSByZWFsbG9jYXRlZCBhbmQgdGhlIGhpZXJhcmNoeSBhcHBlYXJzIGluY29uc2lzdGVudC4gIGl0IGlzCisgICAgICogYWN0dWFsbHkgc2FmZSB0byBydW4gYW5kIHdvbid0IGNhdXNlIGFueSBidWdzLCBidXQgd2lsbCBjYXVzZSB0aG9vc2UKKyAgICAgKiBhc3NlcnRpb24gZmFpbHVyZXMuICBpdCdzIG9ubHkgb25lIGRlcmVmJmFzc2lnbiBzbyBtaWdodCBhcyB3ZWxsIHB1dCB0aGlzCisgICAgICogaW4gdGhlIGNyaXRpY2FsIHJlZ2lvbiAqLworICAgIG1hc3Rlcl90aCAtPiB0aC50aF90ZWFtICAgICAgICA9ICAgcGFyZW50X3RlYW07CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW1fbnByb2MgID0gICBwYXJlbnRfdGVhbSAtPiB0LnRfbnByb2M7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW1fbWFzdGVyID0gICBwYXJlbnRfdGVhbSAtPiB0LnRfdGhyZWFkc1swXTsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbV9zZXJpYWxpemVkID0gcGFyZW50X3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisKKyAgICAvKiByZXN0b3JlIHNlcmlhbGl6ZWQgdGVhbSwgaWYgbmVlZCBiZSAqLworICAgIGlmKCBwYXJlbnRfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJgorICAgICAgICBwYXJlbnRfdGVhbSAhPSBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtICYmCisgICAgICAgIHBhcmVudF90ZWFtICE9IHJvb3QtPnIucl9yb290X3RlYW0gKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIG1hc3Rlcl90aCAtPiB0aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3NlcmlhbF90ZWFtID0gcGFyZW50X3RlYW07CisgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAvLworICAgICAgICAvLyBDb3B5IHRoZSB0YXNrIHRlYW0gZnJvbSB0aGUgbmV3IGNoaWxkIC8gb2xkIHBhcmVudCB0ZWFtCisgICAgICAgIC8vIHRvIHRoZSB0aHJlYWQuICBJZiBub24tTlVMTCwgY29weSB0aGUgc3RhdGUgZmxhZyBhbHNvLgorICAgICAgICAvLworICAgICAgICBpZiAoICggbWFzdGVyX3RoIC0+IHRoLnRoX3Rhc2tfdGVhbSA9IHBhcmVudF90ZWFtIC0+IHQudF90YXNrX3RlYW0gKSAhPSBOVUxMICkgeworICAgICAgICAgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3Rhc2tfc3RhdGUgPSBtYXN0ZXJfdGggLT4gdGgudGhfdGFza190ZWFtIC0+IHR0LnR0X3N0YXRlOworICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBNYXN0ZXIgVCMlZCByZXN0b3JpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtICkgKTsKKyAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgLy8gVE9ETzogR0VIIC0gY2Fubm90IGRvIHRoaXMgYXNzZXJ0aW9uIGJlY2F1c2Ugcm9vdCB0aHJlYWQgbm90IHNldCB1cCBhcyBleGVjdXRpbmcKKyAgICAgICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZXhpdCBUIyVkXG4iLCBndGlkICkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBwdXNoIGFuIGludGVybmFsIGNvbnRyb2wgcmVjb3JkIG9udG8gdGhlCisgICBzZXJpYWwgdGVhbSBzdGFjay4gIElmIHNvLCBkbyBpdC4gICovCit2b2lkCitfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzICgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisKKyAgICBpZiAoIHRocmVhZCAtPiB0aC50aF90ZWFtICE9IHRocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPiAxKSB7CisgICAgICAgIGludCBwdXNoID0gMDsKKworICAgICAgICBpZiAodGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID09IE5VTEwpIHsKKyAgICAgICAgICAgIHB1c2ggPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgLT4gc2VyaWFsX25lc3RpbmdfbGV2ZWwgIT0KKyAgICAgICAgICAgICAgICAgdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB1c2gpIHsgIC8qIHB1c2ggYSByZWNvcmQgb24gdGhlIHNlcmlhbCB0ZWFtJ3Mgc3RhY2sgKi8KKyAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBjb250cm9sID0gKGttcF9pbnRlcm5hbF9jb250cm9sX3QgKikgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9pbnRlcm5hbF9jb250cm9sX3QpKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBjb3B5X2ljdnMoIGNvbnRyb2wsICYgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyNlbHNlCisgICAgICAgICAgICBjb250cm9sLT5ucHJvYyAgICAgICAgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfbnByb2NbMF07CisgICAgICAgICAgICBjb250cm9sLT5keW5hbWljICAgICAgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfZHluYW1pY1swXTsKKyAgICAgICAgICAgIGNvbnRyb2wtPm5lc3RlZCAgICAgICA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9uZXN0ZWRbMF07CisgICAgICAgICAgICBjb250cm9sLT5ibG9ja3RpbWUgICAgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfYmxvY2t0aW1lWzBdOworICAgICAgICAgICAgY29udHJvbC0+YnRfaW50ZXJ2YWxzID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1swXTsKKyAgICAgICAgICAgIGNvbnRyb2wtPmJ0X3NldCAgICAgICA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9idF9zZXRbMF07CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgICAgICAgICAgY29udHJvbC0+c2VyaWFsX25lc3RpbmdfbGV2ZWwgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgICAgICBjb250cm9sLT5uZXh0ID0gdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgICAgICAgICAgdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gY29udHJvbDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2hhbmdlcyBzZXRfbnByb2MgKi8KK3ZvaWQKK19fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9zZXRfbnVtX3RocmVhZHM6IG5ldyBfX2ttcF9udGggPSAlZFxuIiwgbmV3X250aCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKG5ld19udGggPCAxKQorICAgICAgICBuZXdfbnRoID0gMTsKKyAgICBlbHNlIGlmIChuZXdfbnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbmV3X250aCA9IF9fa21wX21heF9udGg7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25wcm9jKCB0aHJlYWQsIG5ld19udGggKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbCB3aWxsIGNhdXNlIHRoZSBob3QgdGVhbSBzaXplIHRvIGJlCisgICAgLy8gcmVkdWNlZCAoaW4gdGhlIGFic2VuY2Ugb2YgYSBudW1fdGhyZWFkcyBjbGF1c2UpLCB0aGVuIHJlZHVjZSBpdCBub3csCisgICAgLy8gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgIC8vCisgICAgcm9vdCA9IHRocmVhZC0+dGgudGhfcm9vdDsKKyAgICBpZiAoIF9fa21wX2luaXRfcGFyYWxsZWwgJiYgKCAhIHJvb3QtPnIucl9hY3RpdmUgKQorICAgICAgJiYgKCByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyA+IG5ld19udGggKSApIHsKKyAgICAgICAga21wX3RlYW1fdCAqaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgICAgIGludCBmOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IGhvdF90ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgaWYgKCAoIHRhc2tfdGVhbSAhPSBOVUxMICkgJiYgVENSX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSkgKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBTaWduYWwgdGhlIHdvcmtlciB0aHJlYWRzIChlc3AuIHRoZSBleHRyYSBvbmVzKSB0byBzdG9wCisgICAgICAgICAgICAgICAgLy8gbG9va2luZyBmb3IgdGFza3Mgd2hpbGUgc3BpbiB3YWl0aW5nLiAgVGhlIHRhc2sgdGVhbXMKKyAgICAgICAgICAgICAgICAvLyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIHdpbGwgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdCB3b3JrZXIgdGhyZWFkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaG90X3RlYW0tPnQudF9ucHJvYyA+IDEgKTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfc2V0X251bV90aHJlYWRzOiBzZXR0aW5nIHRhc2tfdGVhbSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgJmhvdF90ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICAgICAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSBOVUxMICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZS4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yICggZiA9IG5ld19udGg7ICBmIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgZisrICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICE9IE5VTEwgKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gKTsKKyAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSA9ICBOVUxMOworICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtLT50LnRfbnByb2MgPSBuZXdfbnRoOworCisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBVcGRhdGUgdGhlIHRfbnByb2MgZmllbGQgaW4gdGhlIHRocmVhZHMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlLgorICAgICAgICAvLworICAgICAgICBmb3IoIGY9MCA7IGYgPCBuZXdfbnRoOyBmKysgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gIT0gTlVMTCApOworICAgICAgICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID0gbmV3X250aDsKKyAgICAgICAgfQorI2lmIEtNUF9NSUMKKyAgICAgICAgLy8gU3BlY2lhbCBmbGFnIGluIGNhc2Ugb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwKKyAgICAgICAgaG90X3RlYW0gLT4gdC50X3NpemVfY2hhbmdlZCA9IC0xOworI2VuZGlmCisgICAgfQorCit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLyogQ2hhbmdlcyBtYXhfYWN0aXZlX2xldmVscyAqLwordm9pZAorX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgaWYoIG1heF9hY3RpdmVfbGV2ZWxzIDwgMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc05lZ2F0aXZlLCBtYXhfYWN0aXZlX2xldmVscyApOworICAgICAgICAvLyBXZSBpZ25vcmUgdGhpcyBjYWxsIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgLy8gVGhlIGN1cnJlbnQgc2V0dGluZyB3b24ndCBiZSBjaGFuZ2VkLiBUaGUgbGFzdCB2YWxpZCBzZXR0aW5nIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgLy8gQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIChpZiB3YXJuaW5ncyBhcmUgYWxsb3dlZCBhcyBjb250cm9sbGVkIGJ5IHRoZSBLTVBfV0FSTklOR1MgZW52IHZhcikuCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aGUgY2FsbCBpcyBpZ25vcmVkOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPD0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICkgeworICAgICAgICAvLyBpdCdzIE9LLCB0aGUgbWF4X2FjdGl2ZV9sZXZlbHMgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZTogWyAwOyBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgXQorICAgICAgICAvLyBXZSBhbGxvdyBhIHplcm8gdmFsdWUuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCwgbWF4X2FjdGl2ZV9sZXZlbHMsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCAgKTsKKyAgICAgICAgbWF4X2FjdGl2ZV9sZXZlbHMgPSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7CisgICAgICAgIC8vIEN1cnJlbnQgdXBwZXIgbGltaXQgaXMgTUFYX0lOVC4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBleGNlZWRzIHRoZSB1cHBlciBsaW1pdCwgd2UgY29ycmVjdCB0aGUgaW5wdXQgdG8gYmUgdGhlIHVwcGVyIGxpbWl0LiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gQWN0dWFsbHksIHRoZSBmbG93IHNob3VsZCBuZXZlciBnZXQgaGVyZSB1bnRpbCB3ZSB1c2UgTUFYX0lOVCBsaW1pdC4KKyAgICB9CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IGFmdGVyIHZhbGlkYXRpb246IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKCB0aHJlYWQsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisKK30KKworLyogR2V0cyBtYXhfYWN0aXZlX2xldmVscyAqLworaW50CitfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkXG4iLCBndGlkICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heGFjbGV2ZWw9JWRcbiIsCisgICAgICAgIGd0aWQsIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2ssIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgcmV0dXJuIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5tYXhfYWN0aXZlX2xldmVsczsKK30KKworLyogQ2hhbmdlcyBkZWZfc2NoZWRfdmFyIElDViB2YWx1ZXMgKHJ1bi10aW1lIHNjaGVkdWxlIGtpbmQgYW5kIGNodW5rKSAqLwordm9pZAorX19rbXBfc2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3Qga2luZCwgaW50IGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisvLyAgICBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9zY2hlZHVsZTogbmV3IHNjaGVkdWxlIGZvciB0aHJlYWQgJWQgPSAoJWQsICVkKVxuIiwgZ3RpZCwgKGludClraW5kLCBjaHVuayApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGtpbmQgcGFyYW1ldGVyIGlzIHZhbGlkLCBjb3JyZWN0IGlmIG5lZWRlZC4KKyAgICAvLyBWYWxpZCBwYXJhbWV0ZXJzIHNob3VsZCBmaXQgaW4gb25lIG9mIHR3byBpbnRlcnZhbHMgLSBzdGFuZGFyZCBvciBleHRlbmRlZDoKKyAgICAvLyAgICAgICA8bG93ZXI+LCA8dmFsaWQ+LCA8dXBwZXJfc3RkPiwgPGxvd2VyX2V4dD4sIDx2YWxpZD4sIDx1cHBlcj4KKyAgICAvLyAyMDA4LTAxLTI1OiAwLCAgMSAtIDQsICAgICAgIDUsICAgICAgICAgMTAwLCAgICAgMTAxIC0gMTAyLCAxMDMKKyAgICBpZiAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyIHx8IGtpbmQgPj0ga21wX3NjaGVkX3VwcGVyIHx8CisgICAgICAgKCBraW5kIDw9IGttcF9zY2hlZF9sb3dlcl9leHQgJiYga2luZCA+PSBrbXBfc2NoZWRfdXBwZXJfc3RkICkgKQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogSGludCBuZWVkcyBhdHRlbnRpb24gaW4gY2FzZSB3ZSBjaGFuZ2UgdGhlIGRlZmF1bHQgc2NoZWR1bGUuCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgS01QX01TRyggU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSwga2luZCApLAorICAgICAgICAgICAgS01QX0hOVCggRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQsICJzdGF0aWMsIG5vIGNodW5rIiApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICAgICAga2luZCA9IGttcF9zY2hlZF9kZWZhdWx0OworICAgICAgICBjaHVuayA9IDA7ICAgICAgICAgLy8gaWdub3JlIGNodW5rIHZhbHVlIGluIGNhc2Ugb2YgYmFkIGtpbmQKKyAgICB9CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIGlmICgga2luZCA8IGttcF9zY2hlZF91cHBlcl9zdGQgKSB7CisgICAgICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfc3RhdGljICYmIGNodW5rIDwgS01QX0RFRkFVTFRfQ0hVTksgKSB7CisgICAgICAgICAgICAvLyBkaWZmZXIgc3RhdGljIGNodW5rZWQgdnMuIHVuY2h1bmtlZDoKKyAgICAgICAgICAgIC8vIGNodW5rIHNob3VsZCBiZSBpbnZhbGlkIHRvIGluZGljYXRlIHVuY2h1bmtlZCBzY2hlZHVsZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpCisgICAgICAgICAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0ga21wX3NjaF9zdGF0aWM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc2NoX21hcFsga2luZCAtIGttcF9zY2hlZF9sb3dlciAtIDEgXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICAgICAgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9CisgICAgICAgICAgICBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF07CisgICAgfQorICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfYXV0byApIHsKKyAgICAgICAgLy8gaWdub3JlIHBhcmFtZXRlciBjaHVuayBmb3Igc2NoZWR1bGUgYXV0bworICAgICAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQuY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQuY2h1bmsgPSBjaHVuazsKKyAgICB9Cit9CisKKy8qIEdldHMgZGVmX3NjaGVkX3ZhciBJQ1YgdmFsdWVzICovCit2b2lkCitfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAqdGhyZWFkOworICAgIGVudW0gc2NoZWRfdHlwZSB0aF90eXBlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF9zY2hlZHVsZTogdGhyZWFkICVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICAvL3RoX3R5cGUgPSB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2V0X3NjaGVkWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0ucl9zY2hlZF90eXBlOworICAgIHRoX3R5cGUgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlOworCisgICAgc3dpdGNoICggdGhfdHlwZSApIHsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpYzsKKyAgICAgICAgKmNodW5rID0gMDsgICAvLyBjaHVuayB3YXMgbm90IHNldCwgdHJ5IHRvIHNob3cgdGhpcyBmYWN0IHZpYSB6ZXJvIHZhbHVlCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfZHluYW1pYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2d1aWRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2F1dG87CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfdHJhcGV6b2lkYWw7CisgICAgICAgIGJyZWFrOworLyoKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWNfc3RlYWw7CisgICAgICAgIGJyZWFrOworKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfRkFUQUwoIFVua25vd25TY2hlZHVsaW5nVHlwZSwgdGhfdHlwZSApOworICAgIH0KKworICAgIC8vKmNodW5rID0gdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NldF9zY2hlZFsgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdLmNodW5rOworICAgICpjaHVuayA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5jaHVuazsKK30KKworaW50CitfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW06IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIGxldmVsCisgICAgaWYoIGxldmVsID09IDAgKSByZXR1cm4gMDsKKyAgICBpZiggbGV2ZWwgPCAwICkgcmV0dXJuIC0xOworICAgIHRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlpID0gdGVhbSAtPiB0LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1fbWljcm90YXNrICkgeworICAgICAgICAvLyBBQzogd2UgYXJlIGluIHRlYW1zIHJlZ2lvbiB3aGVyZSBtdWx0aXBsZSBuZXN0ZWQgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgIGludCB0bGV2ZWwgPSB0aHItPnRoLnRoX3RlYW1zX2xldmVsOyAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICBpZiggbGV2ZWwgPD0gdGxldmVsICkgeyAvLyBvdGhlcndpc2UgdXN1YWwgYWxnb3JpdGhtIHdvcmtzICh3aWxsIG5vdCB0b3VjaCB0aGUgdGVhbXMpCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIC8vIEFDOiBBcyB3ZSBuZWVkIHRvIHBhc3MgYnkgdGhlIHRlYW1zIGxlYWd1ZSwgd2UgbmVlZCB0byBhcnRpZmljaWFsbHkgaW5jcmVhc2UgaWkKKyAgICAgICAgICAgIGlmICggaWkgPT0gdGxldmVsICkgeworICAgICAgICAgICAgICAgIGlpICs9IDI7IC8vIHRocmVlIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpaSArKzsgICAvLyB0d28gdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmKCBpaSA9PSBsZXZlbCApIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisKKyAgICBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgbGV2ZWwrKzsKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpZiggKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlpID4gbGV2ZWwgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGlpLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBkZCA+IDEgKSA/ICggMCApIDogKCB0ZWFtIC0+IHQudF9tYXN0ZXJfdGlkICk7Cit9CisKK2ludAorX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X3RlYW1fc2l6ZTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAxOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtIC0+IHQudF9sZXZlbDsKKyAgICBpZiggbGV2ZWwgPiBpaSApIHJldHVybiAtMTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYoIHRoci0+dGgudGhfdGVhbV9taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUoIGlpID4gbGV2ZWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlpID4gbGV2ZWwgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGlpLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGVhbSAtPiB0LnRfbnByb2M7Cit9CisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCitrbXBfcl9zY2hlZF90CitfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCkgeworLy8gVGhpcyByb3V0aW5lIGNyZWF0ZWQgYmVjYXVzZSBwYWlycyAoX19rbXBfc2NoZWQsIF9fa21wX2NodW5rKSBhbmQgKF9fa21wX3N0YXRpYywgX19rbXBfZ3VpZGVkKQorLy8gbWF5IGJlIGNoYW5nZWQgYnkga21wX3NldF9kZWZhdWx0cyBpbmRlcGVuZGVudGx5LiBTbyBvbmUgY2FuIGdldCB0aGUgdXBkYXRlZCBzY2hlZHVsZSBoZXJlLgorCisgICAga21wX3Jfc2NoZWRfdCByX3NjaGVkOworCisgICAgLy8gY3JlYXRlIHNjaGVkdWxlIGZyb20gNCBnbG9iYWxzOiBfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmssIF9fa21wX3N0YXRpYywgX19rbXBfZ3VpZGVkCisgICAgLy8gX19rbXBfc2NoZWQgc2hvdWxkIGtlZXAgb3JpZ2luYWwgdmFsdWUsIHNvIHRoYXQgdXNlciBjYW4gc2V0IEtNUF9TQ0hFRFVMRSBtdWx0aXBsZSB0aW1lcywKKyAgICAvLyBhbmQgdGh1cyBoYXZlIGRpZmZlcmVudCBydW4tdGltZSBzY2hlZHVsZXMgaW4gZGlmZmVyZW50IHJvb3RzIChldmVuIGluIE9NUCAyLjUpCisgICAgaWYgKCBfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX3N0YXRpYyApIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9zdGF0aWM7IC8vIHJlcGxhY2UgU1RBVElDIHdpdGggbW9yZSBkZXRhaWxlZCBzY2hlZHVsZSAoYmFsYW5jZWQgb3IgZ3JlZWR5KQorICAgIH0gZWxzZSBpZiAoIF9fa21wX3NjaGVkID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfZ3VpZGVkOyAvLyByZXBsYWNlIEdVSURFRCB3aXRoIG1vcmUgZGV0YWlsZWQgc2NoZWR1bGUgKGl0ZXJhdGl2ZSBvciBhbmFseXRpY2FsKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc2NoZWQ7ICAvLyAoU1RBVElDX0NIVU5LRUQpLCBvciAoRFlOQU1JQ19DSFVOS0VEKSwgb3Igb3RoZXIKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2NodW5rIDwgS01QX0RFRkFVTFRfQ0hVTksgKSB7IC8vIF9fa21wX2NodW5rIG1heSBiZSB3cm9uZyBoZXJlIChpZiBpdCB3YXMgbm90IGV2ZXIgc2V0KQorICAgICAgICByX3NjaGVkLmNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcl9zY2hlZC5jaHVuayA9IF9fa21wX2NodW5rOworICAgIH0KKworICAgIHJldHVybiByX3NjaGVkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKiBBbGxvY2F0ZSAocmVhbGxvYyA9PSBGQUxTRSkgKiBvciByZWFsbG9jYXRlIChyZWFsbG9jID09IFRSVUUpCisgKiBhdCBsZWFzdCBhcmdjIG51bWJlciBvZiAqdF9hcmd2IGVudHJpZXMgZm9yIHRoZSByZXF1ZXN0ZWQgdGVhbS4KKyAqLworc3RhdGljIHZvaWQKK19fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggaW50IGFyZ2MsIGttcF90ZWFtX3QgKnRlYW0sIGludCByZWFsbG9jICkKK3sKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBpZiggIXJlYWxsb2MgfHwgYXJnYyA+IHRlYW0gLT4gdC50X21heF9hcmdjICkgeworCisgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogbmVlZGVkIGVudHJpZXM9JWQsIGN1cnJlbnQgZW50cmllcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGFyZ2MsICggcmVhbGxvYyApID8gdGVhbS0+dC50X21heF9hcmdjIDogMCApKTsKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisgICAgICAgIC8qIGlmIHByZXZpb3VzbHkgYWxsb2NhdGVkIGhlYXAgc3BhY2UgZm9yIGFyZ3MsIGZyZWUgdGhlbSAqLworICAgICAgICBpZiAoIHJlYWxsb2MgJiYgdGVhbSAtPiB0LnRfYXJndiAhPSAmdGVhbSAtPiB0LnRfaW5saW5lX2FyZ3ZbMF0gKQorICAgICAgICAgICAgX19rbXBfZnJlZSggKHZvaWQgKikgdGVhbSAtPiB0LnRfYXJndiApOworCisgICAgICAgIGlmICggYXJnYyA8PSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyApIHsKKyAgICAgICAgICAgIC8qIHVzZSB1bnVzZWQgc3BhY2UgaW4gdGhlIGNhY2hlIGxpbmUgZm9yIGFyZ3VtZW50cyAqLworICAgICAgICAgICAgdGVhbSAtPiB0LnRfbWF4X2FyZ2MgPSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogaW5saW5lIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF9hcmd2ID0gJnRlYW0gLT4gdC50X2lubGluZV9hcmd2WzBdOworICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbmxpbmVfYXJndltLTVBfSU5MSU5FX0FSR1ZfRU5UUklFU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2Yodm9pZCAqKSAqIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlYW1fJWQudF9pbmxpbmVfYXJndiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpbiB0aGUgaGVhcCAqLworICAgICAgICAgICAgdGVhbSAtPiB0LnRfbWF4X2FyZ2MgPSAoIGFyZ2MgPD0gKEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA+PiAxICkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgOiAyICogYXJnYzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogZHluYW1pYyBhbGxvY2F0ZSAlZCBhcmd2IGVudHJpZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X21heF9hcmdjICkpOworICAgICAgICAgICAgdGVhbSAtPiB0LnRfYXJndiAgICAgPSAodm9pZCoqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplb2Yodm9pZCopICogdGVhbS0+dC50X21heF9hcmdjICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2FyZ3ZbMF0sICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSAqIHRlYW0tPnQudF9tYXhfYXJnYywgInRlYW1fJWQudF9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlIC8qIEtNUF9QRVJGX1YxMDYgPT0gS01QX09GRiAqLworICAgICAgICBpZiAoIHJlYWxsb2MgKQorICAgICAgICAgICAgX19rbXBfZnJlZSggKHZvaWQqKSB0ZWFtIC0+IHQudF9hcmd2ICk7CisgICAgICAgIHRlYW0gLT4gdC50X21heF9hcmdjID0gKCBhcmdjIDw9IChLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgPj4gMSApKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA6IDIgKiBhcmdjOworICAgICAgICBLQV9UUkFDRSggMTAwLCAoICJfX2ttcF9hbGxvY19hcmd2X2VudHJpZXM6IHRlYW0gJWQ6IGR5bmFtaWMgYWxsb2NhdGUgJWQgYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X21heF9hcmdjICkpOworICAgICAgICB0ZWFtIC0+IHQudF9hcmd2ICAgICA9IF9fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVvZih2b2lkKikgKiB0ZWFtLT50LnRfbWF4X2FyZ2MgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2FyZ3ZbMF0sICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopICogdGVhbS0+dC50X21heF9hcmdjLCAidGVhbV8lZC50X2FyZ3YiLCB0ZWFtLT50LnRfaWQgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9QRVJGX1YxMDYgKi8KKworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKQoreworICAgIGludCBpOworICAgIGludCBudW1fZGlzcF9idWZmID0gbWF4X250aCA+IDEgPyBLTVBfTUFYX0RJU1BfQlVGIDogMjsKKyNpZiBLTVBfVVNFX1BPT0xFRF9BTExPQworICAgIC8vIEFDOiBUT0RPOiBmaXggYnVnIGhlcmU6IHNpemUgb2YgdF9kaXNwX2J1ZmZlciBzaG91bGQgbm90IGJlIG11bHRpcGxpZWQgYnkgbWF4X250aCEKKyAgICBjaGFyICpwdHIgPSBfX2ttcF9hbGxvY2F0ZShtYXhfbnRoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHNpemVvZihrbXBfaW5mb190KikgKyBzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCkqbnVtX2Rpc3BfYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoa21wX2Rpc3BfdCkgKyBzaXplb2YoaW50KSo2CisjICBpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKyBzaXplb2YoaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF9yX3NjaGVkX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpCisjICBlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgKTsKKworICAgIHRlYW0gLT4gdC50X3RocmVhZHMgICAgICAgICAgPSAoa21wX2luZm9fdCoqKSBwdHI7IHB0ciArPSBzaXplb2Yoa21wX2luZm9fdCopICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9kaXNwX2J1ZmZlciAgICAgID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKSBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCkgKiBudW1fZGlzcF9idWZmOworICAgIHRlYW0gLT4gdC50X2Rpc3BhdGNoICAgICAgICAgPSAoa21wX2Rpc3BfdCopIHB0cjsgcHRyICs9IHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X25wcm9jICAgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X2R5bmFtaWMgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X25lc3RlZCAgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X2Jsb2NrdGltZSAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFscyA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X2J0X3NldCAgICAgICA9IChpbnQqKSBwdHI7CisjICBpZiBPTVBfMzBfRU5BQkxFRAorICAgIHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgLy90ZWFtIC0+IHQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0gLT4gdC50X3NldF9zY2hlZCAgICAgICAgPSAoa21wX3Jfc2NoZWRfdCopIHB0cjsKKyAgICBwdHIgKz0gc2l6ZW9mKGttcF9yX3NjaGVkX3QpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhID0gKGttcF90YXNrZGF0YV90KikgcHRyOworICAgIHB0ciArPSBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aDsKKyMgIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjZWxzZQorCisgICAgdGVhbSAtPiB0LnRfdGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCopICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKQorICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiApOworICAgIHRlYW0gLT4gdC50X2Rpc3BhdGNoID0gKGttcF9kaXNwX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9kaXNwX3QpICogbWF4X250aCApOworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vdGVhbSAtPiB0LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICAvL3RlYW0gLT4gdC50X3NldF9zY2hlZCA9IChrbXBfcl9zY2hlZF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG1heF9udGggKTsKKyAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhID0gKGttcF90YXNrZGF0YV90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfdGFza2RhdGFfdCkgKiBtYXhfbnRoICk7CisgICAgI2Vsc2UKKyAgICB0ZWFtIC0+IHQudF9zZXRfbnByb2MgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X3NldF9keW5hbWljID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICB0ZWFtIC0+IHQudF9zZXRfbmVzdGVkID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYmxvY2t0aW1lID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYnRfc2V0ID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyMgIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjZW5kaWYKKyAgICB0ZWFtLT50LnRfbWF4X25wcm9jID0gbWF4X250aDsKKworICAgIC8qIHNldHVwIGRpc3BhdGNoIGJ1ZmZlcnMgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgbnVtX2Rpc3BfYnVmZjsgKytpKQorICAgICAgICB0ZWFtIC0+IHQudF9kaXNwX2J1ZmZlcltpXS5idWZmZXJfaW5kZXggPSBpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtKSB7CisgICAgLyogTm90ZTogdGhpcyBkb2VzIG5vdCBmcmVlIHRoZSB0aHJlYWRzIGluIHRfdGhyZWFkcyAoX19rbXBfZnJlZV90aHJlYWRzKSAqLworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgdGVhbS0+dC50X21heF9ucHJvYzsgKysgaSApIHsKKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF90aHJlYWRzKTsKKyAgICAjaWYgIUtNUF9VU0VfUE9PTEVEX0FMTE9DCisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BfYnVmZmVyKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMpOworICAgICAgICAvL19fa21wX2ZyZWUodGVhbS0+dC50X3NldF9zY2hlZCk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEpOworICAgICAgICAjZWxzZQorICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfbnByb2MpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfZHluYW1pYyk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9uZXN0ZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfYmxvY2t0aW1lKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFscyk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9idF9zZXQpOworICAgICMgIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgI2VuZGlmCisgICAgdGVhbS0+dC50X3RocmVhZHMgICAgID0gTlVMTDsKKyAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXIgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCAgICA9IE5VTEw7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvL3RlYW0tPnQudF9zZXRfc2NoZWQgICA9IDA7CisgICAgLy90ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gMDsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IDA7CisjZWxzZQorICAgIHRlYW0tPnQudF9zZXRfbnByb2MgICA9IDA7CisgICAgdGVhbS0+dC50X3NldF9keW5hbWljID0gMDsKKyAgICB0ZWFtLT50LnRfc2V0X25lc3RlZCAgPSAwOworICAgIHRlYW0tPnQudF9zZXRfYmxvY2t0aW1lICAgPSAwOworICAgIHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzID0gMDsKKyAgICB0ZWFtLT50LnRfc2V0X2J0X3NldCAgPSAwOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgICAga21wX2luZm9fdCAqKm9sZFRocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAvL19fa21wX2ZyZWUodGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVscyk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X3NjaGVkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgICAgICAgICNlbHNlCisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9ucHJvYyk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9keW5hbWljKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X25lc3RlZCk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9ibG9ja3RpbWUpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X2J0X3NldCk7CisgICAgIyAgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBtYXhfbnRoKTsKKworICAgIG1lbWNweSh0ZWFtLT50LnRfdGhyZWFkcywgb2xkVGhyZWFkcywgdGVhbS0+dC50X25wcm9jICogc2l6ZW9mIChrbXBfaW5mb190KikpOworCisgICAgX19rbXBfZnJlZShvbGRUaHJlYWRzKTsKK30KKworc3RhdGljIGttcF9pbnRlcm5hbF9jb250cm9sX3QKK19fa21wX2dldF9nbG9iYWxfaWN2cyggdm9pZCApIHsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX3Jfc2NoZWRfdCByX3NjaGVkID0gX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpOyAvLyBnZXQgY3VycmVudCBzdGF0ZSBvZiBzY2hlZHVsaW5nIGdsb2JhbHMKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8vY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQKKyAgICAgIF9fa21wX2RmbHRfbmVzdGVkLCAgICAgICAgICAgIC8vaW50IG5lc3RlZDsgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSAocGVyIHRocmVhZCkKKyAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIgdGhyZWFkKQorICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50IG5wcm9jOyAgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yICMgb2YgdGhyZWFkcyBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24gKHBlciB0aHJlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNlIGEgbWF4IHViIG9uIHZhbHVlIGlmIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUgbm90IGNhbGxlZCB5ZXQpCisgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgICAgICAgICAvL2ludCBibG9ja3RpbWU7ICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUKKyAgICAgIF9fa21wX2J0X2ludGVydmFscywgICAgICAgICAgIC8vaW50IGJ0X2ludGVydmFsczsgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSBpbnRlcnZhbHMKKyAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUsICAgICAgICAgIC8vaW50IGJ0X3NldDsgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7CisgICAgfTsKKworICAgIHJldHVybiBnX2ljdnM7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggY29uc3Qga21wX3RlYW1fdCAqdGVhbSApIHsKKworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ3hfaWN2czsKKyAgICBneF9pY3ZzLnNlcmlhbF9uZXN0aW5nX2xldmVsID0gMDsgLy8gcHJvYmFibHkgPXRlYW0tPnQudF9zZXJpYWwgbGlrZSBpbiBzYXZlX2ludGVyX2NvbnRyb2xzCisgICAgY29weV9pY3ZzKCAmIGd4X2ljdnMsICYgdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworICAgIGd4X2ljdnMubmV4dCA9IE5VTEw7CisgICAgI2Vsc2UKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGd4X2ljdnMgPQorICAgIHsKKyAgICAgIDAsCisgICAgICB0ZWFtLT50LnRfc2V0X25lc3RlZFswXSwKKyAgICAgIHRlYW0tPnQudF9zZXRfZHluYW1pY1swXSwKKyAgICAgIHRlYW0tPnQudF9zZXRfbnByb2NbMF0sCisgICAgICB0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVswXSwKKyAgICAgIHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzWzBdLAorICAgICAgdGVhbS0+dC50X3NldF9idF9zZXRbMF0sCisgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCAqbmV4dDsKKyAgICB9OworICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgcmV0dXJuIGd4X2ljdnM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3Jvb3QoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCAgICAgICAgICAgZjsKKyAgICBrbXBfdGVhbV90ICAgKnJvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgKmhvdF90ZWFtOworICAgIHNpemVfdCAgICAgICAgZGlzcF9zaXplLCBkaXNwYXRjaF9zaXplLCBiYXJfc2l6ZTsKKyAgICBpbnQgICAgICAgICAgIGhvdF90ZWFtX21heF9udGg7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0FTU0VSVCggISByb290LT5yLnJfYmVnaW4gKTsKKworICAgIC8qIHNldHVwIHRoZSByb290IHN0YXRlIHN0cnVjdHVyZSAqLworICAgIF9fa21wX2luaXRfbG9jayggJnJvb3QtPnIucl9iZWdpbl9sb2NrICk7CisgICAgcm9vdCAtPiByLnJfYmVnaW4gICAgICAgID0gRkFMU0U7CisgICAgcm9vdCAtPiByLnJfYWN0aXZlICAgICAgID0gRkFMU0U7CisgICAgcm9vdCAtPiByLnJfaW5fcGFyYWxsZWwgID0gMDsKKyAgICByb290IC0+IHIucl9ibG9ja3RpbWUgICAgPSBfX2ttcF9kZmx0X2Jsb2NrdGltZTsKKyAgICByb290IC0+IHIucl9uZXN0ZWQgICAgICAgPSBfX2ttcF9kZmx0X25lc3RlZDsKKworICAgIC8qIHNldHVwIHRoZSByb290IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAgIC8qIGFsbG9jYXRlIHRoZSByb290IHRlYW0gc3RydWN0dXJlICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSByb290X3RlYW1cbiIgKSApOworICAgIHJvb3RfdGVhbSA9CisgICAgICAgIF9fa21wX2FsbG9jYXRlX3RlYW0oCisgICAgICAgICAgICByb290LAorICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfbnByb2MKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4X25wcm9jCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAmcl9pY3ZzLAorI2Vsc2UKKyAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtX3RyZWFkcworICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljCisgICAgICAgICAgICBfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lc3RlZAorICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBibG9ja3RpbWUKKyAgICAgICAgICAgIF9fa21wX2J0X2ludGVydmFscywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnRfaW50ZXJ2YWxzCisgICAgICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciByb290X3RlYW0gPSAlcFxuIiwgcm9vdF90ZWFtICkgKTsKKworICAgIHJvb3QgLT4gci5yX3Jvb3RfdGVhbSA9IHJvb3RfdGVhbTsKKyAgICByb290X3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgICAgcm9vdF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID0gTlVMTDsKKyAgICByb290X3RlYW0gLT4gdC50X25wcm9jICAgICAgPSAxOworICAgIHJvb3RfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA9IDE7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBUT0RPPz8/OiByb290X3RlYW0gLT4gdC50X21heF9hY3RpdmVfbGV2ZWxzID0gX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVsczsKKyAgICByb290X3RlYW0gLT4gdC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIHJvb3RfdGVhbSAtPiB0LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGluaXQgcm9vdCB0ZWFtICVkIGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICByb290X3RlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKworICAgIC8qIHNldHVwIHRoZSAgaG90IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAgIC8qIGFsbG9jYXRlIHRoZSBob3QgdGVhbSBzdHJ1Y3R1cmUgKi8KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYmVmb3JlIGhvdF90ZWFtXG4iICkgKTsKKyAgICBob3RfdGVhbSA9CisgICAgICAgIF9fa21wX2FsbG9jYXRlX3RlYW0oCisgICAgICAgICAgICByb290LAorICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfbnByb2MKKyAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4X25wcm9jCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAmcl9pY3ZzLAorI2Vsc2UKKyAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtX3RyZWFkcworICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljCisgICAgICAgICAgICBfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lc3RlZAorICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBibG9ja3RpbWUKKyAgICAgICAgICAgIF9fa21wX2J0X2ludGVydmFscywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnRfaW50ZXJ2YWxzCisgICAgICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgaG90X3RlYW0gPSAlcFxuIiwgaG90X3RlYW0gKSApOworCisgICAgcm9vdCAtPiByLnJfaG90X3RlYW0gPSBob3RfdGVhbTsKKyAgICByb290X3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGZpcnN0LXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBob3RfdGVhbSAtPiB0LnRfcGFyZW50ID0gcm9vdF90ZWFtOworCisgICAgLyogaW5pdGlhbGl6ZSBob3QgdGVhbSAqLworICAgIGhvdF90ZWFtX21heF9udGggPSBob3RfdGVhbS0+dC50X21heF9ucHJvYzsKKyAgICBmb3IgKCBmID0gMDsgZiA8IGhvdF90ZWFtX21heF9udGg7ICsrIGYgKSB7CisgICAgICAgIGhvdF90ZWFtIC0+IHQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgIH07IC8vIGZvcgorICAgIGhvdF90ZWFtIC0+IHQudF9ucHJvYyA9IDE7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBUT0RPPz8/OiBob3RfdGVhbSAtPiB0LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIGhvdF90ZWFtIC0+IHQudF9zY2hlZC5yX3NjaGVkX3R5cGUgPSByX3NjaGVkLnJfc2NoZWRfdHlwZTsKKyAgICBob3RfdGVhbSAtPiB0LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorI2lmIEtNUF9NSUMKKyAgICBob3RfdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gMDsKKyNlbmRpZgorCit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbV9saXN0X2l0ZW0geworICAgIGttcF90ZWFtX3AgY29uc3QgKiAgICAgICAgICAgZW50cnk7CisgICAgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSAqICBuZXh0OworfSBrbXBfdGVhbV9saXN0X2l0ZW1fdDsKK3R5cGVkZWYga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBrbXBfdGVhbV9saXN0X3Q7CisKKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCAgICAvLyBBZGQgdGVhbSB0byBsaXN0IG9mIHRlYW1zLgorICAgIGttcF90ZWFtX2xpc3RfdCAgICAgbGlzdCwgICAgICAgIC8vIExpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fcCBjb25zdCAqICB0ZWFtICAgICAgICAgLy8gVGVhbSB0byBhZGQuCispIHsKKworICAgIC8vIExpc3QgbXVzdCB0ZXJtaW5hdGUgd2l0aCBpdGVtIHdoZXJlIGJvdGggZW50cnkgYW5kIG5leHQgYXJlIE5VTEwuCisgICAgLy8gVGVhbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvbmx5IG9uY2UuCisgICAgLy8gTGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRlYW0gaWQuCisgICAgLy8gVGVhbSBpZCBpcyAqbm90KiBhIGtleS4KKworICAgIGttcF90ZWFtX2xpc3RfdCBsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGlzdCAhPSBOVUxMICk7CisgICAgaWYgKCB0ZWFtID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRlYW0tPnQudF9wYXJlbnQgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X25leHRfcG9vbCApOworCisgICAgLy8gU2VhcmNoIGxpc3QgZm9yIHRoZSB0ZWFtLgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5ICE9IHRlYW0gKSB7CisgICAgICAgIGwgPSBsLT5uZXh0OworICAgIH07IC8vIHdoaWxlCisgICAgaWYgKCBsLT5uZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsgIC8vIFRlYW0gaGFzIGJlZW4gYWRkZWQgYmVmb3JlLCBleGl0LgorICAgIH07IC8vIGlmCisKKyAgICAvLyBUZWFtIGlzIG5vdCBmb3VuZC4gU2VhcmNoIGxpc3QgYWdhaW4gZm9yIGluc2VydGlvbiBwb2ludC4KKyAgICBsID0gbGlzdDsKKyAgICB3aGlsZSAoIGwtPm5leHQgIT0gTlVMTCAmJiBsLT5lbnRyeS0+dC50X2lkIDw9IHRlYW0tPnQudF9pZCApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIEluc2VydCB0ZWFtLgorICAgIHsKKyAgICAgICAga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBpdGVtID0KKyAgICAgICAgICAgIChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggIGttcF90ZWFtX2xpc3RfaXRlbV90ICkgKTsKKyAgICAgICAgKiBpdGVtID0gKiBsOworICAgICAgICBsLT5lbnRyeSA9IHRlYW07CisgICAgICAgIGwtPm5leHQgID0gaXRlbTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbQorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiUyeCAlcFxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCgKKyAgICBjaGFyIGNvbnN0ICogICAgICAgdGl0bGUsCisgICAga21wX2luZm9fcCBjb25zdCAqIHRocmVhZAorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkICVwXG4iLCB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGhyZWFkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlKAorICAgIHZvaWQKKykgeworCisgICAga21wX3RlYW1fbGlzdF90IGxpc3Q7CisKKyAgICAvLyBJbml0aWFsaXplIGxpc3Qgb2YgdGVhbXMuCisgICAgbGlzdCA9IChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZigga21wX3RlYW1fbGlzdF9pdGVtX3QgKSApOworICAgIGxpc3QtPmVudHJ5ID0gTlVMTDsKKyAgICBsaXN0LT5uZXh0ICA9IE5VTEw7CisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuR2xvYmFsIFRocmVhZCBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkIiwgZ3RpZCApOworICAgICAgICAgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiICVwIiwgX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiICVwIiwgX19rbXBfcm9vdFsgZ3RpZCBdICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZHMgYXJyYXkuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRocmVhZHNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIGlmICggX19rbXBfdGhyZWFkcyAhPSBOVUxMICkgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAga21wX2luZm9fdCBjb25zdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiR1RJRCAlMmQgJXA6XG4iLCBndGlkLCB0aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIE91ciBSb290OiAgICAgICAgJXBcbiIsIHRocmVhZC0+dGgudGhfcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgT3VyIFRlYW06ICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBTZXJpYWwgVGVhbTogICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBUaHJlYWRzOiAgICAgICUyZFxuIiwgICB0aHJlYWQtPnRoLnRoX3RlYW1fbnByb2MgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIE1hc3RlcjogICAgICAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbV9tYXN0ZXIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNlcmlhbGl6ZWQ/OiAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9zZXJpYWxpemVkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBTZXQgTlByb2M6ICAgICUyZFxuIiwgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBTZXQgUHJvYyBCaW5kOiAlMmRcbiIsICB0aHJlYWQtPnRoLnRoX3NldF9wcm9jX2JpbmQgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTmV4dCBpbiBwb29sOiAiLCAgICAgICAgdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGhyZWFkcyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfcm9vdCBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVWJlcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIGlmICggX19rbXBfcm9vdCAhPSBOVUxMICkgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAga21wX3Jvb3RfdCBjb25zdCAqIHJvb3QgPSBfX2ttcF9yb290WyBndGlkIF07CisgICAgICAgICAgICBpZiAoIHJvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHJvb3QgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFJvb3QgVGVhbTogICAgIiwgICAgICByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBIb3QgVGVhbTogICAgICIsICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBVYmVyIFRocmVhZDogICIsICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBBY3RpdmU/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX2FjdGl2ZSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgTmVzdGVkPzogICAgICAlMmRcbiIsIHJvb3QtPnIucl9uZXN0ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEluIFBhcmFsbGVsOiAgJTJkXG4iLCByb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgcm9vdC0+ci5yX3Jvb3RfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVWJlcnMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZC5cbiIgKTsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlYW1zXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB3aGlsZSAoIGxpc3QtPm5leHQgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3RlYW1fcCBjb25zdCAqIHRlYW0gPSBsaXN0LT5lbnRyeTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlRlYW0gJTJ4ICVwOlxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAiICAgIFBhcmVudCBUZWFtOiAgICAgICIsICAgICAgdGVhbS0+dC50X3BhcmVudCApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBNYXN0ZXIgVElEOiAgICAgICAlMmRcbiIsIHRlYW0tPnQudF9tYXN0ZXJfdGlkICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1heCB0aHJlYWRzOiAgICAgICUyZFxuIiwgdGVhbS0+dC50X21heF9ucHJvYyApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBMZXZlbHMgb2Ygc2VyaWFsOiAlMmRcbiIsIHRlYW0tPnQudF9zZXJpYWxpemVkICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE51bWJlciB0aHJlYWRzOiAgICUyZFxuIiwgdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdGVhbS0+dC50X25wcm9jOyArKyBpICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgIiAgICBUaHJlYWQgJTJkOiAgICAgICIsIGkgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIiLCB0ZWFtLT50LnRfdGhyZWFkc1sgaSBdICk7CisgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAiICAgIE5leHQgaW4gcG9vbDogICAgICIsICAgICAgdGVhbS0+dC50X25leHRfcG9vbCApOworICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFByaW50IG91dCBfX2ttcF90aHJlYWRfcG9vbCBhbmQgX19rbXBfdGVhbV9wb29sLgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Qb29sc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggICAiVGhyZWFkIHBvb2w6ICAgICAgICAgICIsIChrbXBfaW5mb190ICopX19rbXBfdGhyZWFkX3Bvb2wgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAgICJUZWFtIHBvb2w6ICAgICAgICAgICAgIiwgKGttcF90ZWFtX3QgKilfX2ttcF90ZWFtX3Bvb2wgKTsKKyAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKworICAgIC8vIEZyZWUgdGVhbSBsaXN0LgorICAgIHdoaWxlICggbGlzdCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGl0ZW0gPSBsaXN0OworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGl0ZW0gKTsKKyAgICB9OyAvLyB3aGlsZQorCit9CisKKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3R1ZmYgZm9yIHBlci10aHJlYWQgZmFzdCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorLy8gIFRhYmxlIG9mIHByaW1lcworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgX19rbXBfcHJpbWVzW10gPSB7CisgIDB4OWUzNzc5YjEsIDB4ZmZlNmNjNTksIDB4MjEwOWY2ZGQsIDB4NDM5NzdhYjUsCisgIDB4YmE1NzAzZjUsIDB4YjQ5NWE4NzcsIDB4ZTE2MjY3NDEsIDB4Nzk2OTVlNmIsCisgIDB4YmM5OGMwOWYsIDB4ZDViZWUyYjMsIDB4Mjg3NDg4ZjksIDB4M2FmMTgyMzEsCisgIDB4OTY3N2NkNGQsIDB4YmUzYTY5MjksIDB4YWRjNmE4NzcsIDB4ZGNmMDY3NGIsCisgIDB4YmU0ZDZmZTksIDB4NWYxNWUyMDEsIDB4OTlhZmMzZmQsIDB4ZjNmMTY4MDEsCisgIDB4ZTIyMmNmZmYsIDB4MjRiYTVmZGIsIDB4MDYyMDQ1MmQsIDB4NzlmMTQ5ZTMsCisgIDB4YzhiOTNmNDksIDB4OTcyNzAyY2QsIDB4YjA3ZGQ4MjcsIDB4NmM5N2Q1ZWQsCisgIDB4MDg1YTNkNjEsIDB4NDZlYjVlYTcsIDB4M2Q5OTEwZWQsIDB4MmU2ODdiNWIsCisgIDB4Mjk2MDkyMjcsIDB4NmViMDgxZjEsIDB4MDk1NGM0ZTEsIDB4OWQxMTRkYjksCisgIDB4NTQyYWNmYTksIDB4YjNlNmJkN2IsIDB4MDc0MmQ5MTcsIDB4ZTlmM2ZmYTcsCisgIDB4NTQ1ODFlZGIsIDB4ZjI0ODBmNDUsIDB4MGJiOTI4OGYsIDB4ZWYxYWZmYzcsCisgIDB4ODVmYTBjYTcsIDB4M2NjYzE0ZGIsIDB4ZTZiYWYzNGIsIDB4MzQzMzc3ZjcsCisgIDB4NWNhMTkwMzEsIDB4ZTZkOTI5M2IsIDB4ZjBhOWYzOTEsIDB4NWQyZTk4MGIsCisgIDB4ZmM0MTEwNzMsIDB4YzM3NDkzNjMsIDB4Yjg5MmQ4MjksIDB4MzU0OTM2NmIsCisgIDB4NjI5NzUwYWQsIDB4Yjk4Mjk0ZTUsIDB4ODkyZDk0ODMsIDB4YzIzNWJhZjMsCisgIDB4M2QyNDAyYTMsIDB4NmJkZWYzYzksIDB4YmVjMzMzY2QsIDB4NDBjOTUyMGYKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfZ2V0X3JhbmRvbTogR2V0IGEgcmFuZG9tIG51bWJlciB1c2luZyBhIGxpbmVhciBjb25ncnVlbnRpYWwgbWV0aG9kLgorCit1bnNpZ25lZCBzaG9ydAorX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgIHVuc2lnbmVkIHggPSB0aHJlYWQgLT4gdGgudGhfeDsKKyAgdW5zaWduZWQgc2hvcnQgciA9IHg+PjE2OworCisgIHRocmVhZCAtPiB0aC50aF94ID0geCp0aHJlYWQtPnRoLnRoX2ErMTsKKworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9nZXRfcmFuZG9tOiBUSFJFQUQ6ICVkLCBSRVRVUk46ICV1XG4iLAorICAgICAgICAgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCwgcikgKTsKKworICByZXR1cm4gcjsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2luaXRfcmFuZG9tOiBJbml0aWFsaXplIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKwordm9pZAorX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICB1bnNpZ25lZCBzZWVkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKworICB0aHJlYWQgLT4gdGgudGhfYSA9IF9fa21wX3ByaW1lc1tzZWVkJShzaXplb2YoX19rbXBfcHJpbWVzKS9zaXplb2YoX19rbXBfcHJpbWVzWzBdKSldOworICB0aHJlYWQgLT4gdGgudGhfeCA9IChzZWVkKzEpKnRocmVhZC0+dGgudGhfYSsxOworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbml0X3JhbmRvbTogVEhSRUFEOiAldTsgQTogJXVcbiIsIHNlZWQsIHRocmVhZCAtPiB0aC50aF9hKSApOworfQorCisKKyNpZiBLTVBfT1NfV0lORE9XUworLyogcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFkLCByZXR1cm5zIG51bWJlciByZWNsYWltZWQgKi8KK3N0YXRpYyBpbnQKK19fa21wX3JlY2xhaW1fZGVhZF9yb290cyh2b2lkKSB7CisgICAgaW50IGksIHIgPSAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGlmKCBLTVBfVUJFUl9HVElEKCBpICkgJiYKKyAgICAgICAgICAhX19rbXBfc3RpbGxfcnVubmluZygoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2ldKSkgJiYKKyAgICAgICAgICAhX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSApIHsgLy8gQUM6IHJlY2xhaW0gb25seSByb290cyBkaWVkIGluIG5vbi1hY3RpdmUgc3RhdGUKKyAgICAgICAgICAgIHIgKz0gX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKgorICAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjcmVhdGUgZnJlZSBlbnRyaWVzIGluIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIGZyZWUgZW50cmllcyBnZW5lcmF0ZWQuCisKKyAgIEZvciBXaW5kb3dzKiBPUyBzdGF0aWMgbGlicmFyeSwgdGhlIGZpcnN0IG1lY2hhbmlzbSB1c2VkIGlzIHRvIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlCisgICBhbHJlYWR5IGRlYWQuCisKKyAgIE9uIGFsbCBwbGF0Zm9ybXMsIGV4cGFuc2lvbiBpcyBhdHRlbXB0ZWQgb24gdGhlIGFycmF5cyBfX2ttcF90aHJlYWRzXyBhbmQgX19rbXBfcm9vdCwgd2l0aCBhcHByb3ByaWF0ZQorICAgdXBkYXRlIHRvIF9fa21wX3RocmVhZHNfY2FwYWNpdHkuICBBcnJheSBjYXBhY2l0eSBpcyBpbmNyZWFzZWQgYnkgZG91Ymxpbmcgd2l0aCBjbGlwcGluZyB0bworICAgIF9fa21wX3RwX2NhcGFjaXR5LCBpZiB0aHJlYWRwcml2YXRlIGNhY2hlIGFycmF5IGhhcyBiZWVuIGNyZWF0ZWQuCisgICBTeW5jaHJvbml6YXRpb24gd2l0aCBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaXMgZG9uZSB1c2luZyBfX2ttcF90cF9jYWNoZWRfbG9jay4KKworICAgQWZ0ZXIgYW55IGRlYWQgcm9vdCByZWNsYW1hdGlvbiwgaWYgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cyBhcnJheSBleHBhbnNpb24gdG8gcmVzdWx0IGluIHRoZSBnZW5lcmF0aW9uCisgICBvZiBhIHRvdGFsIG9mIG5XaXNoIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzIHRoYXQgZXhwYW5zaW9uLiAgSWYgbm90LCBidXQgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cworICAgYXJyYXkgZXhwYW5zaW9uIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhIHRvdGFsIG9mIG5OZWVkIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzIHRoYXQgZXhwYW5zaW9uLgorICAgT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGRvbmUgYmV5b25kIHRoZSBwb3NzaWJsZSBpbml0aWFsIHJvb3QgdGhyZWFkIHJlY2xhbWF0aW9uLiAgSG93ZXZlciwgaWYgbk5lZWQgaXMgemVybywKKyAgIGEgYmVzdC1lZmZvcnQgYXR0ZW1wdCBpcyBtYWRlIHRvIGZ1bGZpbCBuV2lzaCBhcyBmYXIgYXMgcG9zc2libGUsIGkuZS4gdGhlIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUKKyAgIGFzIG1hbnkgZnJlZSBzbG90cyBhcyBwb3NzaWJsZSB1cCB0byBuV2lzaC4KKworICAgSWYgYW55IGFyZ3VtZW50IGlzIG5lZ2F0aXZlLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorKi8KK3N0YXRpYyBpbnQKK19fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKSB7CisgICAgaW50IGFkZGVkID0gMDsKKyAgICBpbnQgb2xkX3RwX2NhY2hlZDsKKyAgICBpbnQgX19rbXBfYWN0dWFsX21heF9udGg7CisKKyAgICBpZihuTmVlZCA+IG5XaXNoKSAvKiBub3JtYWxpemUgdGhlIGFyZ3VtZW50cyAqLworICAgICAgICBuV2lzaCA9IG5OZWVkOworI2lmIEtNUF9PU19XSU5ET1dTICYmICFkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMKKy8qIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIGxpYnJhcnkgKi8KKyAgICAvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQgKi8KKyAgICBhZGRlZCA9IF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOworCisgICAgaWYobk5lZWQpIHsKKyAgICAgICAgbk5lZWQgLT0gYWRkZWQ7CisgICAgICAgIGlmKG5OZWVkIDwgMCkKKyAgICAgICAgICAgIG5OZWVkID0gMDsKKyAgICB9CisgICAgaWYobldpc2gpIHsKKyAgICAgICAgbldpc2ggLT0gYWRkZWQ7CisgICAgICAgIGlmKG5XaXNoIDwgMCkKKyAgICAgICAgICAgIG5XaXNoID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZihuV2lzaCA8PSAwKQorICAgICAgICByZXR1cm4gYWRkZWQ7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGludCBuVGFyZ2V0OworICAgICAgICBpbnQgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHk7CisgICAgICAgIGludCBuZXdDYXBhY2l0eTsKKyAgICAgICAga21wX2luZm9fdCAqKm5ld1RocmVhZHM7CisgICAgICAgIGttcF9yb290X3QgKipuZXdSb290OworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGlzIG5vdCBib3VuZGVkIGJ5IF9fa21wX21heF9udGguCisgICAgICAgIC8vIElmIF9fa21wX21heF9udGggaXMgc2V0IHRvIHNvbWUgdmFsdWUgbGVzcyB0aGFuIF9fa21wX3N5c19tYXhfbnRoCisgICAgICAgIC8vIGJ5IHRoZSB1c2VyIHZpYSBPTVBfVEhSRUFEX0xJTUlULCB0aGVuIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgbWF5CisgICAgICAgIC8vIGJlY29tZSA+IF9fa21wX21heF9udGggaW4gb25lIG9mIHR3byB3YXlzOgorICAgICAgICAvLworICAgICAgICAvLyAxKSBUaGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkIChndGlkID0gMCkgZXhpdHMuICBfX2ttcF90aHJlYWRzWzBdCisgICAgICAgIC8vICAgIG1heSBub3QgYmUgcmVzdXNlZCBieSBhbm90aGVyIHRocmVhZCwgc28gd2UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSB0byBfX2ttcF9tYXhfdGhyZWFkcyArIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIDIpIE5ldyBmb3JlaWduIHJvb3QocykgYXJlIGVuY291bnRlcmVkLiAgV2UgYWx3YXlzIHJlZ2lzdGVyIG5ldworICAgICAgICAvLyAgICBmb3JlaWduIHJvb3RzLiAgVGhpcyBtYXkgY2F1c2UgYSBzbWFsbGVyICMgb2YgdGhyZWFkcyB0byBiZQorICAgICAgICAvLyAgICBhbGxvY2F0ZWQgYXQgc3Vic2VxdWVudCBwYXJhbGxlbCByZWdpb25zLCBidXQgdGhlIHdvcmtlciB0aHJlYWRzCisgICAgICAgIC8vICAgIGhhbmcgYXJvdW5kIChhbmQgZXZlbnR1YWxseSBnbyB0byBzbGVlcCkgYW5kIG5lZWQgc2xvdHMgaW4gdGhlCisgICAgICAgIC8vICAgIF9fa21wX3RocmVhZHNbXSBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQW55d2F5LCB0aGF0IGlzIHRoZSByZWFzb24gZm9yIG1vdmluZyB0aGUgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgIC8vIF9fa21wX21heF90aHJlYWRzIHdhcyBleGNlZWRlZCBpbnRvIF9fa21wX3Jlc2VlcnZlX3RocmVhZHMoKQorICAgICAgICAvLyBpbnN0ZWFkIG9mIGhhdmluZyBpdCBwZXJmb3JtZWQgaGVyZS4gLUJCCisgICAgICAgIC8vCisgICAgICAgIG9sZF90cF9jYWNoZWQgPSBfX2ttcF90cF9jYWNoZWQ7CisgICAgICAgIF9fa21wX2FjdHVhbF9tYXhfbnRoID0gb2xkX3RwX2NhY2hlZCA/IF9fa21wX3RwX2NhcGFjaXR5IDogX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWN0dWFsX21heF9udGggPj0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSk7CisKKyAgICAgICAgLyogY29tcHV0ZSBleHBhbnNpb24gaGVhZHJvb20gdG8gY2hlY2sgaWYgd2UgY2FuIGV4cGFuZCBhbmQgd2hldGhlciB0byBhaW0gZm9yIG5XaXNoIG9yIG5OZWVkICovCisgICAgICAgIG5UYXJnZXQgPSBuV2lzaDsKKyAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgLyogY2FuJ3QgZnVsZmlsIG5XaXNoLCBzbyB0cnkgbk5lZWQgKi8KKyAgICAgICAgICAgIGlmKG5OZWVkKSB7CisgICAgICAgICAgICAgICAgblRhcmdldCA9IG5OZWVkOworICAgICAgICAgICAgICAgIGlmKF9fa21wX2FjdHVhbF9tYXhfbnRoIC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSA8IG5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcG9zc2libGUgZXhwYW5zaW9uIHRvbyBzbWFsbCAtLSBnaXZlIHVwICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYmVzdC1lZmZvcnQgKi8KKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICAgICAgICAgIGlmKCFuVGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBleHBhbmQgYXQgYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pbmltdW1SZXF1aXJlZENhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSArIG5UYXJnZXQ7CisKKyAgICAgICAgbmV3Q2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICBkb3sKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0KKyAgICAgICAgICAgICAgICBuZXdDYXBhY2l0eSA8PSAoX19rbXBfYWN0dWFsX21heF9udGggPj4gMSkgPworICAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSA8PCAxKSA6CisgICAgICAgICAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGg7CisgICAgICAgIH0gd2hpbGUobmV3Q2FwYWNpdHkgPCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eSk7CisgICAgICAgIG5ld1RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSgoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpICogbmV3Q2FwYWNpdHkgKyBDQUNIRV9MSU5FKTsKKyAgICAgICAgbmV3Um9vdCA9IChrbXBfcm9vdF90KiopICgoY2hhciopbmV3VGhyZWFkcyArIHNpemVvZihrbXBfaW5mb190KikgKiBuZXdDYXBhY2l0eSApOworICAgICAgICBtZW1jcHkobmV3VGhyZWFkcywgX19rbXBfdGhyZWFkcywgX19rbXBfdGhyZWFkc19jYXBhY2l0eSAqIHNpemVvZihrbXBfaW5mb190KikpOworICAgICAgICBtZW1jcHkobmV3Um9vdCwgX19rbXBfcm9vdCwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSAqIHNpemVvZihrbXBfcm9vdF90KikpOworICAgICAgICBtZW1zZXQobmV3VGhyZWFkcyArIF9fa21wX3RocmVhZHNfY2FwYWNpdHksIDAsCisgICAgICAgICAgICAgICAobmV3Q2FwYWNpdHkgLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KSAqIHNpemVvZihrbXBfaW5mb190KikpOworICAgICAgICBtZW1zZXQobmV3Um9vdCArIF9fa21wX3RocmVhZHNfY2FwYWNpdHksIDAsCisgICAgICAgICAgICAgICAobmV3Q2FwYWNpdHkgLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KSAqIHNpemVvZihrbXBfcm9vdF90KikpOworCisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBfX2ttcF90cF9jYWNoZWQgaGFzIGNoYW5nZWQsIGkuZS4gX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkIGhhcyBhbGxvY2F0ZWQgYSB0aHJlYWRwcml2YXRlIGNhY2hlCisgICAgICAgICAgICAgICB3aGlsZSB3ZSB3ZXJlIGFsbG9jYXRpbmcgdGhlIGV4cGFuZGVkIGFycmF5LCBhbmQgb3VyIG5ldyBjYXBhY2l0eSBpcyBsYXJnZXIgdGhhbiB0aGUgdGhyZWFkcHJpdmF0ZQorICAgICAgICAgICAgICAgY2FjaGUgY2FwYWNpdHksIHNvIHdlIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBleHBhbmRlZCBhcnJheXMgYW5kIHRyeSBhZ2Fpbi4gIFRoaXMgaXMgdGhlIGZpcnN0IGNoZWNrCisgICAgICAgICAgICAgICBvZiBhIGRvdWJsZS1jaGVjayBwYWlyLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fa21wX2ZyZWUobmV3VGhyZWFkcyk7CisgICAgICAgICAgICBjb250aW51ZTsgLyogc3RhcnQgb3ZlciBhbmQgdHJ5IGFnYWluICovCisgICAgICAgIH0KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICBpZighb2xkX3RwX2NhY2hlZCAmJiBfX2ttcF90cF9jYWNoZWQgJiYgbmV3Q2FwYWNpdHkgPiBfX2ttcF90cF9jYXBhY2l0eSkgeworICAgICAgICAgICAgLyogU2FtZSBjaGVjayBhcyBhYm92ZSwgYnV0IHRoaXMgdGltZSB3aXRoIHRoZSBsb2NrIHNvIHdlIGNhbiBiZSBzdXJlIGlmIHdlIGNhbiBzdWNjZWVkLiAqLworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIC8vIF9fa21wX2ZyZWUoIF9fa21wX3RocmVhZHMgKTsgLy8gQVRUOiBJdCBsZWFkcyB0byBjcmFzaC4gTmVlZCB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKihrbXBfaW5mb190Kip2b2xhdGlsZSopJl9fa21wX3RocmVhZHMgPSBuZXdUaHJlYWRzOworICAgICAgICAgICAgKihrbXBfcm9vdF90Kip2b2xhdGlsZSopJl9fa21wX3Jvb3QgPSBuZXdSb290OworICAgICAgICAgICAgYWRkZWQgKz0gbmV3Q2FwYWNpdHkgLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICAgICAgKih2b2xhdGlsZSBpbnQqKSZfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBicmVhazsgLyogc3VjY2VlZGVkLCBzbyB3ZSBjYW4gZXhpdCB0aGUgbG9vcCAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhZGRlZDsKK30KKworLyogcmVnaXN0ZXIgdGhlIGN1cnJlbnQgdGhyZWFkIGFzIGEgcm9vdCB0aHJlYWQgYW5kIG9idGFpbiBvdXIgZ3RpZCAqLworLyogd2UgbXVzdCBoYXZlIHRoZSBfX2ttcF9pbml0el9sb2NrIGhlbGQgYXQgdGhpcyBwb2ludCAqLworLyogQXJndW1lbnQgVFJVRSBvbmx5IGlmIGFyZSB0aGUgdGhyZWFkIHRoYXQgY2FsbHMgZnJvbSBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpICovCitpbnQKK19fa21wX3JlZ2lzdGVyX3Jvb3QoIGludCBpbml0aWFsX3RocmVhZCApCit7CisgICAga21wX2luZm9fdCAqcm9vdF90aHJlYWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKyAgICBpbnQgICAgICAgICBndGlkOworICAgIGludCAgICAgICAgIGNhcGFjaXR5OworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGVudGVyZWRcbiIpKTsKKyAgICBLTVBfTUIoKTsKKworCisgICAgLyoKKyAgICAgICAgMjAwNy0wMy0wMjoKKworICAgICAgICBJZiBpbml0aWFsIHRocmVhZCBkaWQgbm90IGludm9rZSBPcGVuTVAgUlRMIHlldCwgYW5kIHRoaXMgdGhyZWFkIGlzIG5vdCBhbiBpbml0aWFsIG9uZSwKKyAgICAgICAgIl9fa21wX2FsbF9udGggPj0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSIgY29uZGl0aW9uIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQgLS0gaXQgbWF5CisgICAgICAgIHJldHVybiBmYWxzZSAodGhhdCBtZWFucyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCBpbiBfX2ttcF90aHJlYWRzIGFycmF5KSwgYnV0IGl0CisgICAgICAgIGlzIHBvc3NpYmxlIHRoZSBvbmx5IGZyZWUgc2xvdCBpcyAjMCwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgdGhyZWFkIGFuZCBzbyBjYW5ub3QgYmUKKyAgICAgICAgdXNlZCBmb3IgdGhpcyBvbmUuIEZvbGxvd2luZyBjb2RlIHdvcmthcm91bmRzIHRoaXMgYnVnLgorCisgICAgICAgIEhvd2V2ZXIsIHJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIG5vdCByZXNlcnZpbmcgc2xvdCAjMCBmb3IgaW5pdGlhbCB0aHJlYWQgYmVjYXVzZToKKyAgICAgICAgICAgICgxKSB0aGVyZSBpcyBubyBtYWdpYyBpbiBzbG90ICMwLAorICAgICAgICAgICAgKDIpIHdlIGNhbm5vdCBkZXRlY3QgaW5pdGlhbCB0aHJlYWQgcmVsaWFibHkgKHRoZSBmaXJzdCB0aHJlYWQgd2hpY2ggZG9lcyBzZXJpYWwKKyAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBtYXkgYmUgbm90IGEgcmVhbCBpbml0aWFsIHRocmVhZCkuCisgICAgKi8KKyAgICBjYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgaWYgKCAhIGluaXRpYWxfdGhyZWFkICYmIFRDUl9QVFIoX19rbXBfdGhyZWFkc1swXSkgPT0gTlVMTCApIHsKKyAgICAgICAgLS0gY2FwYWNpdHk7CisgICAgfTsgLy8gaWYKKworICAgIC8qIHNlZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgIGlmICggX19rbXBfYWxsX250aCA+PSBjYXBhY2l0eSAmJiAhX19rbXBfZXhwYW5kX3RocmVhZHMoIDEsIDEgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF90cF9jYWNoZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRSZWdpc3Rlck5ld1RocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFNldF9BTExfVEhSRUFEUFJJVkFURSwgX19rbXBfdHBfY2FwYWNpdHkgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRSZWdpc3Rlck5ld1RocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9OyAvLyBpZgorCisgICAgLyogZmluZCBhbiBhdmFpbGFibGUgdGhyZWFkIHNsb3QgKi8KKyAgICAvKiBEb24ndCByZWFzc2lnbiB0aGUgemVybyBzbG90IHNpbmNlIHdlIG5lZWQgdGhhdCB0byBvbmx5IGJlIHVzZWQgYnkgaW5pdGlhbAorICAgICAgIHRocmVhZCAqLworICAgIGZvciggZ3RpZD0oaW5pdGlhbF90aHJlYWQgPyAwIDogMSkgOyBUQ1JfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pICE9IE5VTEwgOyBndGlkKysgKTsKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBmb3VuZCBzbG90IGluIHRocmVhZHMgYXJyYXk6IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBzZXR1cCB0aGlzIG5ldyBoaWVyYXJjaHkgKi8KKyAgICBpZiggISAoIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdICkpIHsKKyAgICAgICAgcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gPSAoa21wX3Jvb3RfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jvb3RfdCkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgfQorCisgICAgX19rbXBfaW5pdGlhbGl6ZV9yb290KCByb290ICk7CisKKyAgICAvKiBzZXR1cCBuZXcgcm9vdCB0aHJlYWQgc3RydWN0dXJlICovCisgICAgaWYoIHJvb3QgLT4gci5yX3ViZXJfdGhyZWFkICkgeworICAgICAgICByb290X3RocmVhZCA9IHJvb3QgLT4gci5yX3ViZXJfdGhyZWFkOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvb3RfdGhyZWFkID0gKGttcF9pbmZvX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9pbmZvX3QpICk7CisgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIHJvb3RfdGhyZWFkLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcm9vdF90aHJlYWQgLT4gdGgudGhfaW5mbyAuZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgICAgIHJvb3RfdGhyZWFkIC0+IHRoLnRoX3Jvb3QgPSAgcm9vdDsKKyAgICAgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkIC0+IHRoLnRoX2NvbnMgPSBfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSggcm9vdF90aHJlYWQgKTsKKyAgICAgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3RfdGhyZWFkIC0+IHRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9pbml0X3JhbmRvbSggcm9vdF90aHJlYWQgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICB9CisKKyAgICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICAgIGlmKCAhIHJvb3RfdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtICkgeworICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisgICAgICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGJlZm9yZSBzZXJpYWxfdGVhbVxuIiApICk7CisgICAgICAgIHJvb3RfdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSggcm9vdCwgMSwgMSwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgIHByb2NfYmluZF9kZWZhdWx0LAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAmcl9pY3ZzLAorI2Vsc2UKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViLAorICAgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYywKKyAgICAgICAgICBfX2ttcF9kZmx0X25lc3RlZCwKKyAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSwKKyAgICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHMsCisgICAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSwKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgIDAgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCggcm9vdF90aHJlYWQgLT4gdGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGFmdGVyIHNlcmlhbF90ZWFtID0gJXBcbiIsCisgICAgICByb290X3RocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSApICk7CisKKyAgICAvKiBkcm9wIHJvb3RfdGhyZWFkIGludG8gcGxhY2UgKi8KKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgcm9vdF90aHJlYWQpOworCisgICAgcm9vdCAtPiByLnJfcm9vdF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdCAtPiByLnJfaG90X3RlYW0gIC0+IHQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdF90aHJlYWQgLT4gdGgudGhfc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290X3RocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA9IDA7IC8vIEFDOiB0aGUgdGVhbSBjcmVhdGVkIGluIHJlc2VydmUsIG5vdCBmb3IgZXhlY3V0aW9uIChpdCBpcyB1bnVzZWQgZm9yIG5vdykuCisgICAgcm9vdCAtPiByLnJfdWJlcl90aHJlYWQgPSByb290X3RocmVhZDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHRocmVhZCwgZ2V0IGl0IHJlYWR5IHRvIGdvICovCisgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCByb290X3RocmVhZCwgcm9vdC0+ci5yX3Jvb3RfdGVhbSwgMCwgZ3RpZCApOworCisgICAgLyogcHJlcGFyZSB0aGUgbWFzdGVyIHRocmVhZCBmb3IgZ2V0X2d0aWQoKSAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2NyZWF0ZV93b3JrZXIoIGd0aWQsIHJvb3RfdGhyZWFkLCBfX2ttcF9zdGtzaXplICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSA9PSBndGlkICk7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBUIyVkIGluaXQgVCMlZCglZDolZCkgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoIDAsIHJvb3QtPnIucl9ob3RfdGVhbSApLAorICAgICAgICAgICAgICAgICAgICByb290IC0+IHIucl9ob3RfdGVhbSAtPiB0LnRfaWQsIDAsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSApOworICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgIGludCBiOworICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9iYXJbIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICk7CisKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggZ3RpZCwgVFJVRSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yb290X2NvdW50ZXIgKys7CisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIFJlc2V0cyBhIHJvb3QgdGhyZWFkIGFuZCBjbGVhciBpdHMgcm9vdCBhbmQgaG90IHRlYW1zLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIF9fa21wX3RocmVhZHMgZW50cmllcyBkaXJlY3RseSBhbmQgaW5kaXJlY3RseSBmcmVlZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9yZXNldF9yb290KGludCBndGlkLCBrbXBfcm9vdF90ICpyb290KQoreworICAgIGttcF90ZWFtX3QgKiByb290X3RlYW0gPSByb290LT5yLnJfcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgKiBob3RfdGVhbSAgPSByb290LT5yLnJfaG90X3RlYW07CisgICAgaW50ICAgICAgICAgIG4gICAgICAgICA9IGhvdF90ZWFtLT50LnRfbnByb2M7CisgICAgaW50IGk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHJvb3QtPnIucl9hY3RpdmUgKTsKKworICAgIHJvb3QtPnIucl9yb290X3RlYW0gPSBOVUxMOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAgPSBOVUxMOworICAgICAgICAvLyBfX2ttcF9mcmVlX3RlYW0oKSBkb2VzIG5vdCBmcmVlIGhvdCB0ZWFtcywgc28gd2UgaGF2ZSB0byBjbGVhciByX2hvdF90ZWFtIGJlZm9yZSBjYWxsCisgICAgICAgIC8vIHRvIF9fa21wX2ZyZWVfdGVhbSgpLgorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgcm9vdF90ZWFtICk7CisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBob3RfdGVhbSApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvLworICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVhcCB0aGUgdGhyZWFkLCB3ZSBuZWVkIHRvIG1ha2UgY2VydGFpbiB0aGF0IGFsbAorICAgIC8vIG90aGVyIHRocmVhZHMgaW4gdGhlIHRlYW1zIHRoYXQgaGFkIHRoaXMgcm9vdCBhcyBhbmNlc3RvciBoYXZlIHN0b3BwZWQgdHJ5aW5nIHRvIHN0ZWFsIHRhc2tzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCk7CisgICAgfQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogQ2xvc2UgSGFuZGxlIG9mIHJvb3QgZHVwbGljYXRlZCBpbiBfX2ttcF9jcmVhdGVfd29ya2VyICh0ciAjNjI5MTkpICovCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZXNldF9yb290OiBmcmVlIGhhbmRsZSwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgKExQVk9JRCkmKHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgpLAorICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgIF9fa21wX2ZyZWVfaGFuZGxlKCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCAtIDEpOyAvLyBfX2ttcF9yZWFwX3RocmVhZCB3aWxsIGRlY3JlbWVudCBfX2ttcF9hbGxfbnRoLgorICAgIF9fa21wX3JlYXBfdGhyZWFkKCByb290LT5yLnJfdWJlcl90aHJlYWQsIDEgKTsKKworICAgICAgICAvLyBXZSBjYW5vdCBwdXQgcm9vdCB0aHJlYWQgdG8gX19rbXBfdGhyZWFkX3Bvb2wsIHNvIHdlIGhhdmUgdG8gcmVhcCBpdCBpc3RlYWQgb2YgZnJlZWluZy4KKyAgICByb290LT5yLnJfdWJlcl90aHJlYWQgPSBOVUxMOworICAgIC8qIG1hcmsgcm9vdCBhcyBubyBsb25nZXIgaW4gdXNlICovCisgICAgcm9vdCAtPiByLnJfYmVnaW4gPSBGQUxTRTsKKworICAgIHJldHVybiBuOworfQorCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0gKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIHJvb3QgPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdCApOworICAgIEtNUF9BU1NFUlQoIHJvb3QtPnIucl9hY3RpdmUgPT0gRkFMU0UgKTsKKworICAgIC8qIHRoaXMgbG9jayBzaG91bGQgYmUgb2ssIHNpbmNlIHVucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZCBpcyBuZXZlciBjYWxsZWQgZHVyaW5nCisgICAgICogYW5kIGFib3J0LCBvbmx5IGR1cmluZyBhIG5vcm1hbCBjbG9zZS4gIGZ1cnRoZXJtb3JlLCBpZiB5b3UgaGF2ZSB0aGUKKyAgICAgKiBmb3Jram9pbiBsb2NrLCB5b3Ugc2hvdWxkIG5ldmVyIHRyeSB0byBnZXQgdGhlIGluaXR6IGxvY2sgKi8KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIF9fa21wX3Jlc2V0X3Jvb3QoZ3RpZCwgcm9vdCk7CisKKyAgICAvKiBmcmVlIHVwIHRoaXMgdGhyZWFkIHNsb3QgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfRE5FICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkOiBUIyVkIHVucmVnaXN0ZXJlZFxuIiwgZ3RpZCApKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7Cit9CisKKy8qIF9fa21wX2Zvcmtqb2luX2xvY2sgbXVzdCBiZSBhbHJlYWR5IGhlbGQKKyAgIFVucmVnaXN0ZXJzIGEgcm9vdCB0aHJlYWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgdGhyZWFkLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBfX2ttcF90aHJlYWRzIGVudHJpZXMgZnJlZWQgYXMgYSByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKyAgICBpbnQgcjsKKworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKyAgICByID0gX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIHI7Cit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisjaWYgS01QX0RFQlVHCit2b2lkIF9fa21wX3Rhc2tfaW5mbygpIHsKKworICAgIGttcF9pbnQzMiBndGlkICAgICAgID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiB0aWQgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnN0ZWFtICAgID0gdGhpc190aHIgLT4gdGgudGhfc2VyaWFsX3RlYW07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworCisgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfdGFza19pbmZvOiBndGlkPSVkIHRpZD0lZCB0X3RocmVhZD0lcCB0ZWFtPSVwIGN1cnRhc2s9JXAgcHRhc2s9JXBcbiIsCisgICAgICAgIGd0aWQsIHRpZCwgdGhpc190aHIsIHRlYW0sIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICk7Cit9CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisvKiBUT0RPIG9wdGltaXplIHdpdGggb25lIGJpZyBtZW1jbHIsIHRha2Ugb3V0IHdoYXQgaXNuJ3QgbmVlZGVkLAorICogc3BsaXQgcmVzcG9uc2lsaXR5IHRvIHdvcmtlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIGRlbGF5CisgKiBpbml0aWFsaXphdGlvbiBvZiBmZWF0dXJlcyBhcyBtdWNoIGFzIHBvc3NpYmxlICAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfaW5mbygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBndGlkICkKK3sKKyAgICAvKiB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkIGlzIHNldHVwIGluIGttcF9hbGxvY2F0ZV90aHJlYWQvY3JlYXRlX3dvcmtlcgorICAgICAqIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSBpcyBzZXR1cCBpbiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9zZXJpYWxfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF90aHJlYWRzICApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2Rpc3BhdGNoICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfdGhyZWFkc1swXSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfcm9vdCApOworCisgICAgS01QX01CKCk7CisKKyAgICBUQ1dfU1lOQ19QVFIodGhpc190aHItPnRoLnRoX3RlYW0sIHRlYW0pOworCisgICAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IHRpZDsKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X25wcm9jICAgICAgID0gMDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kICAgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHRoaXNfdGhyLT50aC50aF9uZXdfcGxhY2UgICAgICAgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIHRoaXNfdGhyLT50aC50aF9yb290ICAgICAgICAgICAgPSB0ZWFtIC0+IHQudF90aHJlYWRzWzBdIC0+IHRoLnRoX3Jvb3Q7CisKKyAgICAvKiBzZXR1cCB0aGUgdGhyZWFkJ3MgY2FjaGUgb2YgdGhlIHRlYW0gc3RydWN0dXJlICovCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgICA9IHRlYW0gLT4gdC50X25wcm9jOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlciAgICAgPSB0ZWFtIC0+IHQudF90aHJlYWRzWzBdOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWljcm90YXNrICA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfdGVhbV9taWNyb3Rhc2s7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsICAgICA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfdGVhbXNfbGV2ZWw7CisgICAgdGhpc190aHItPnRoLnRoX3NldF9udGhfdGVhbXMgICA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfc2V0X250aF90ZWFtczsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgKTsKKyAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfaW5mbzE6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCBndGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3Rlci0+dGgudGhfaWRlbnQsIHRoaXNfdGhyLCB0ZWFtLCB0aWQsIFRSVUUgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMjogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAvLyBUT0RPOiBJbml0aWFsaXplIElDVnMgZnJvbSBwYXJlbnQ7IEdFSCAtIGlzbid0IHRoYXQgYWxyZWFkeSBkb25lIGluIF9fa21wX2luaXRpYWxpemVfdGVhbSgpPworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAvKiBUT0RPIG5vIHdvcmtzaGFyaW5nIGluIHNwZWN1bGF0aXZlIHRocmVhZHMgKi8KKyAgICB0aGlzX3RociAtPiB0aC50aF9kaXNwYXRjaCAgICAgID0gJnRlYW0gLT4gdC50X2Rpc3BhdGNoWyB0aWQgXTsKKworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLmxhc3RfY29uc3RydWN0ID0gMDsKKworI2lmZGVmIEJVSUxEX1RWCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnR2X2RhdGEgPSAwOworI2VuZGlmCisKKyAgICBpZiAoICEgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uID0gKHN0cnVjdCBjb21tb25fdGFibGUgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihzdHJ1Y3QgY29tbW9uX3RhYmxlKSApOworICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgICAgICAgICAgICBndGlkLCB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gKyAxLAorICAgICAgICAgICAgICAgIHNpemVvZiggc3RydWN0IGNvbW1vbl90YWJsZSApLCAidGhfJWQudGhfcHJpX2NvbW1vblxuIiwgZ3RpZAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3ByaV9oZWFkID0gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgLyogSW5pdGlhbGl6ZSBkeW5hbWljIGRpc3BhdGNoICovCisgICAgeworICAgICAgICB2b2xhdGlsZSBrbXBfZGlzcF90ICpkaXNwYXRjaCA9IHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoOworICAgICAgICAvKgorICAgICAgICAgKiBVc2UgdGVhbSBtYXhfbnByb2Mgc2luY2UgdGhpcyB3aWxsIG5ldmVyIGNoYW5nZSBmb3IgdGhlIHRlYW0uCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgZGlzcF9zaXplID0gc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICoKKyAgICAgICAgICAgICggdGVhbS0+dC50X21heF9ucHJvYyA9PSAxID8gMSA6IEtNUF9NQVhfRElTUF9CVUYgKTsKKyAgICAgICAgS0RfVFJBQ0UoIDEwLCAoIl9fa21wX2luaXRpYWxpemVfaW5mbzogVCMlZCBtYXhfbnByb2M6ICVkXG4iLCBndGlkLCB0ZWFtLT50LnRfbWF4X25wcm9jICkgKTsKKyAgICAgICAgS01QX0FTU0VSVCggZGlzcGF0Y2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfZGlzcGF0Y2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggPT0gJnRlYW0tPnQudF9kaXNwYXRjaFsgdGlkIF0gKTsKKworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7CisKKyAgICAgICAgaWYoICEgZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgKSAgeworICAgICAgICAgICAgZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikgX19rbXBfYWxsb2NhdGUoIGRpc3Bfc2l6ZSApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbIDAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclsgdGVhbS0+dC50X21heF9ucHJvYyA9PSAxID8gMSA6IEtNUF9NQVhfRElTUF9CVUYgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcF9zaXplLCAidGhfJWQudGhfZGlzcGF0Y2gudGhfZGlzcF9idWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHRlYW1fJWQudF9kaXNwYXRjaFslZF0udGhfZGlzcF9idWZmZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQoICYgZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbMF0sICdcMCcsIGRpc3Bfc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IDA7CisgICAgICAgIGRpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSAwOworCisgICAgICAgIGRpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSAwOyAgICAgICAgICAgICAvKiBPUkRFUkVEICAgICAqLworICAgICAgICBkaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gMDsgICAgICAgICAgICAgLyogRU5EIE9SREVSRUQgKi8KKyAgICB9CisKKyAgICB0aGlzX3Roci0+dGgudGhfbmV4dF9wb29sID0gTlVMTDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiBhbGxvY2F0ZSBhIG5ldyB0aHJlYWQgZm9yIHRoZSByZXF1ZXN0aW5nIHRlYW0uICB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gd2l0aGluIGEKKyAqIGZvcmtqb2luIGNyaXRpY2FsIHNlY3Rpb24uICB3ZSB3aWxsIGZpcnN0IHRyeSB0byBnZXQgYW4gYXZhaWxhYmxlIHRocmVhZCBmcm9tIHRoZQorICogdGhyZWFkIHBvb2wuICBpZiBub25lIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCBmb3JrIGEgbmV3IG9uZSBhc3N1bWluZyB3ZSBhcmUgYWJsZQorICogdG8gY3JlYXRlIGEgbmV3IG9uZS4gIHRoaXMgc2hvdWxkIGJlIGFzc3VyZWQsIGFzIHRoZSBjYWxsZXIgc2hvdWxkIGNoZWNrIG9uIHRoaXMKKyAqIGZpcnN0LgorICovCitrbXBfaW5mb190ICoKK19fa21wX2FsbG9jYXRlX3RocmVhZCgga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld190aWQgKQoreworICAgIGttcF90ZWFtX3QgICpzZXJpYWxfdGVhbTsKKyAgICBrbXBfaW5mb190ICAqbmV3X3RocjsKKyAgICBpbnQgICAgICAgICAgbmV3X2d0aWQ7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgJiYgdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIEtNUF9NQVNURVJfR1RJRCggX19rbXBfZ2V0X2d0aWQoKSApKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIGZpcnN0LCB0cnkgdG8gZ2V0IG9uZSBmcm9tIHRoZSB0aHJlYWQgcG9vbCAqLworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2wgKSB7CisKKyAgICAgICAgbmV3X3RociA9IChrbXBfaW5mb190KilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSAodm9sYXRpbGUga21wX2luZm9fdCAqKSBuZXdfdGhyLT50aC50aF9uZXh0X3Bvb2w7CisgICAgICAgIGlmICggbmV3X3RociA9PSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFRDV180KG5ld190aHItPnRoLnRoX2luX3Bvb2wsIEZBTFNFKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG9uJ3QgdG91Y2ggdGhfYWN0aXZlX2luX3Bvb2wgb3IgdGhfYWN0aXZlLgorICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBhZGp1c3RzIHRob3NlIGZsYWdzIGFzIGl0IHNsZWVwcy9hd2FrZW5zLgorICAgICAgICAvLworCisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aC0tOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKyAgICAgICAgS01QX0FTU0VSVCggICAgICAgISBuZXdfdGhyIC0+IHRoLnRoX3RlYW0gKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbnRoIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9udGggPj0gMCApOworCisgICAgICAgIC8qIHNldHVwIHRoZSB0aHJlYWQgc3RydWN0dXJlICovCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggbmV3X3RociwgdGVhbSwgbmV3X3RpZCwgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtICk7CisKKyAgICAgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB6ZXJvIGlmIG5lY2Vzc2FyICAgICAgeSAqLworICAgICAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIHVzaW5nIHRocmVhZCAlcCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfdGhyLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSk7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybiBuZXdfdGhyOworICAgIH0KKworCisgICAgLyogbm8sIHdlbGwgZm9yayBhIG5ldyBvbmUgKi8KKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9udGggICAgPT0gX19rbXBfYWxsX250aCApOworICAgIEtNUF9BU1NFUlQoIF9fa21wX2FsbF9udGggPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisKKyAgICAvLworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHdvcmtlciB0aHJlYWQgdGhlIFJUTCBpcyBjcmVhdGluZywgdGhlbiBhbHNvCisgICAgLy8gbGF1bmNoIHRoZSBtb25pdG9yIHRocmVhZC4gIFdlIHRyeSB0byBkbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorICAgIC8vCisgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiYmVmb3JlIF9fa21wX2NyZWF0ZV9tb25pdG9yXG4iICkgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDEgKTsKKyAgICAgICAgICAgIF9fa21wX2NyZWF0ZV9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiYWZ0ZXIgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgLy8gQUM6IHdhaXQgdW50aWwgbW9uaXRvciBoYXMgc3RhcnRlZC4gVGhpcyBpcyBhIGZpeCBmb3IgQ1EyMzI4MDguCisgICAgICAgICAgICAgICAgLy8gICAgIFRoZSByZWFzb24gaXMgdGhhdCBpZiB0aGUgbGlicmFyeSBpcyBsb2FkZWQvdW5sb2FkZWQgaW4gYSBsb29wIHdpdGggc21hbGwgKHBhcmFsbGVsKQorICAgICAgICAgICAgICAgIC8vICAgICB3b3JrIGluIGJldHdlZW4sIHRoZW4gdGhlcmUgaXMgaGlnaCBwcm9iYWJpbGl0eSB0aGF0IG1vbml0b3IgdGhyZWFkIHN0YXJ0ZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGxpYnJhcnkgc2h1dGRvd24uIEF0IHNodXRkb3duIGl0IGlzIHRvbyBsYXRlIHRvIGNvcGUgd2l0aCB0aGUgcHJvYmxlbSwgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vICAgICB3aGVuIHRoZSBtYXN0ZXIgaXMgaW4gRGxsTWFpbiAocHJvY2VzcyBkZXRhY2gpIHRoZSBtb25pdG9yIGhhcyBubyBjaGFuY2VzIHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gICAgIChpdCBpcyBibG9ja2VkKSwgYW5kIG1hc3RlciBoYXMgbm8gbWVhbnMgdG8gaW5mb3JtIHRoZSBtb25pdG9yIHRoYXQgdGhlIGxpYnJhcnkgaGFzIGdvbmUsCisgICAgICAgICAgICAgICAgLy8gICAgIGJlY2F1c2UgYWxsIHRoZSBtZW1vcnkgd2hpY2ggdGhlIG1vbml0b3IgY2FuIGFjY2VzcyBpcyBnb2luZyB0byBiZSByZWxlYXNlZC9yZXNldC4KKyAgICAgICAgICAgICAgICB3aGlsZSAoIFRDUl80KF9fa21wX2luaXRfbW9uaXRvcikgPCAyICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBtb25pdG9yIHRocmVhZCBoYXMgc3RhcnRlZFxuIiApICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgIH0KKworICAgIEtNUF9NQigpOworICAgIGZvciggbmV3X2d0aWQ9MSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0pICE9IE5VTEw7ICsrbmV3X2d0aWQgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBpdC4gKi8KKyAgICBuZXdfdGhyID0gKGttcF9pbmZvX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9pbmZvX3QpICk7CisKKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0sIG5ld190aHIpOworCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBuZXdfdGhyLCBuZXdfZ3RpZCApOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgcmVzZXJ2ZSBzZXJpYWxpemVkIHRlYW0sIGluaXRpYWxpemVkIGZyb20gdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgeworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIHRlYW0gKTsKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIHRoX3NlcmlhbC9zZXJpYWxfdGVhbVxuIiApICk7CisgICAgbmV3X3RociAtPiB0aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtID0KKyAgICAgICAgKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyX2ljdnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXRfbnByb2NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9keW5hbWljWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXRfbmVzdGVkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXRfYmxvY2t0aW1lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXRfYnRfc2V0WzBdLAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOworICAgIH0KKyAgICBLTVBfQVNTRVJUICggc2VyaWFsX3RlYW0gKTsKKyAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA9IDA7ICAgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSA9IG5ld190aHI7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIHRoX3NlcmlhbC9zZXJpYWxfdGVhbSA6IG5ld190aHI9JXBcbiIsCisgICAgICBuZXdfdGhyICkgKTsKKworICAgIC8qIHNldHVwIHRoZSB0aHJlYWQgc3RydWN0dXJlcyAqLworICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggbmV3X3RociwgdGVhbSwgbmV3X3RpZCwgbmV3X2d0aWQgKTsKKworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSggbmV3X3RociApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3RociAtPiB0aC50aF9sb2NhbC5iZ2V0X2RhdGEgPT0gTlVMTCApOworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIG5ld190aHIgKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2luaXRfcmFuZG9tKCBuZXdfdGhyICk7ICAvLyBJbml0aWFsaXplIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisKKyAgICAvKiBJbml0aWFsaXplIHRoZXNlIG9ubHkgb25jZSB3aGVuIHRocmVhZCBpcyBncmFiYmVkIGZvciBhIHRlYW0gYWxsb2NhdGlvbiAqLworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgaW5pdCBnbyBmb3JrPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKworICAgIG5ld190aHItPnRoLnRoX2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJiLmJfZ28gPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgIG5ld190aHItPnRoLnRoX2JhclsgYnNfcGxhaW5fYmFycmllciAgICBdLmJiLmJfZ28gPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIG5ld190aHItPnRoLnRoX2JhclsgYnNfcmVkdWN0aW9uX2JhcnJpZXIgXS5iYi5iX2dvID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKworICAgIG5ld190aHItPnRoLnRoX3NwaW5faGVyZSA9IEZBTFNFOworICAgIG5ld190aHItPnRoLnRoX25leHRfd2FpdGluZyA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgbmV3X3Roci0+dGgudGhfY3VycmVudF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgbmV3X3Roci0+dGgudGhfbmV3X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9maXJzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgbmV3X3Roci0+dGgudGhfbGFzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisjZW5kaWYKKworICAgIFRDV180KG5ld190aHItPnRoLnRoX2luX3Bvb2wsIEZBTFNFKTsKKyAgICBuZXdfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgIFRDV180KG5ld190aHItPnRoLnRoX2FjdGl2ZSwgVFJVRSk7CisKKyAgICAvKiBhZGp1c3QgdGhlIGdsb2JhbCBjb3VudGVycyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgX19rbXBfbnRoICsrOworCisgICAgLy8KKyAgICAvLyBpZiBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlIGlzIHNldCwgdGhlbiB3ZSB1c2UgbWV0aG9kICMxIChzcCBzZWFyY2gpCisgICAgLy8gZm9yIGxvdyBudW1iZXJzIG9mIHByb2NzLCBhbmQgbWV0aG9kICMyIChrZXllZCBBUEkgY2FsbCkgZm9yIGhpZ2hlcgorICAgIC8vIG51bWJlcnMgb2YgcHJvY3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIGlmICggX19rbXBfYWxsX250aCA+PSBfX2ttcF90bHNfZ3RpZF9taW4gKSB7CisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMikgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAxICkgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB6ZXJvIGlmIG5lY2Vzc2FyeSAgICAgICAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIGFjdHVhbGx5IGZvcmsgaXQgYW5kIGNyZWF0ZSB0aGUgbmV3IHdvcmtlciB0aHJlYWQgKi8KKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlcjogJXBcbiIsIG5ld190aHIgKSk7CisgICAgX19rbXBfY3JlYXRlX3dvcmtlciggbmV3X2d0aWQsIG5ld190aHIsIF9fa21wX3N0a3NpemUgKTsKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBhZnRlciBfX2ttcF9jcmVhdGVfd29ya2VyOiAlcFxuIiwgbmV3X3RociApKTsKKworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCBmb3JrZWQgVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X2d0aWQgKSk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIG5ld190aHI7Cit9CisKKy8qCisgKiByZWluaXRpYWxpemUgdGVhbSBmb3IgcmV1c2UuCisgKgorICogVGhlIGhvdCB0ZWFtIGNvZGUgY2FsbHMgdGhpcyBjYXNlIGF0IGV2ZXJ5IGZvcmsgYmFycmllciwgc28gRVBDQyBiYXJyaWVyCisgKiB0ZXN0IGFyZSBleHRyZW1lbHkgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gaXQsIGVzcC4gd3JpdGVzIHRvIHRoZSB0ZWFtCisgKiBzdHJ1Y3QsIHdoaWNoIGNhdXNlIGEgY2FjaGUgaW52YWxpZGF0aW9uIGluIGFsbCB0aHJlYWRzLgorICoKKyAqIElGIFlPVSBUT1VDSCBUSElTIFJPVVRJTkUsIFJVTiBFUENDIEMgU1lOQ0JFTkNIIE9OIEEgQklHLUlST04gTUFDSElORSEhIQorICovCitzdGF0aWMgdm9pZAorX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIGttcF90ZWFtX3QgKnRlYW0sCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfc2V0X25wcm9jLCBpbnQgbmV3X3NldF9keW5hbWljLCBpbnQgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfYmxvY2t0aW1lLCBpbnQgbmV3X2J0X2ludGVydmFscywgaW50IG5ld19idF9zZXQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVpbml0aWFsaXplX3RlYW06IGVudGVyIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gJiYgbmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHx8IG5ld19pY3ZzLT5ucHJvYyApOworICAgIHRlYW0tPnQudF9pZGVudCA9IGxvYzsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfc2V0X25wcm9jICk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIHRlYW0tPnQudF9pZCA9IEtNUF9HRU5fVEVBTV9JRCgpOworCisgICAgLy8gQ29weSBJQ1ZzIHRvIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFza2RhdGEKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGxvYWRfaWN2cyhuZXdfaWN2cyk7CisgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBsb2MsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtLCAwLCBGQUxTRSApOworICAgIHN0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMsIG5ld19pY3ZzKTsKKyAgICBzeW5jX2ljdnMoKTsKKyMgZWxzZQorICAgIHRlYW0gLT4gdC50X3NldF9ucHJvY1swXSAgID0gbmV3X3NldF9ucHJvYzsKKyAgICB0ZWFtIC0+IHQudF9zZXRfZHluYW1pY1swXSA9IG5ld19zZXRfZHluYW1pYzsKKyAgICB0ZWFtIC0+IHQudF9zZXRfbmVzdGVkWzBdICA9IG5ld19zZXRfbmVzdGVkOworICAgIHRlYW0gLT4gdC50X3NldF9ibG9ja3RpbWVbMF0gICA9IG5ld19zZXRfYmxvY2t0aW1lOworICAgIHRlYW0gLT4gdC50X3NldF9idF9pbnRlcnZhbHNbMF0gPSBuZXdfYnRfaW50ZXJ2YWxzOworICAgIHRlYW0gLT4gdC50X3NldF9idF9zZXRbMF0gID0gbmV3X2J0X3NldDsKKyMgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVpbml0aWFsaXplX3RlYW06IGV4aXQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0dXBfaWN2X2NvcHkoa21wX3RlYW1fdCAqICB0ZWFtLCBpbnQgICAgICAgICAgIG5ld19ucHJvYywKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywKKyAgICAgICAgICAgICAgICBpZGVudF90ICogICAgICAgICAgICAgICAgbG9jCisjZWxzZQorICAgICAgICAgICAgICAgIGludCBuZXdfc2V0X25wcm9jLCBpbnQgbmV3X3NldF9keW5hbWljLCBpbnQgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfYmxvY2t0aW1lLCBpbnQgbmV3X2J0X2ludGVydmFscywgaW50IG5ld19idF9zZXQKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICkKK3sKKyAgICBpbnQgZjsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X2ljdnMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB8fCBuZXdfaWN2cy0+bnByb2MgKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X3NldF9ucHJvYyApOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAvLyBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbiBfX2ttcF9yZWluaXRpYWxpemVfdGVhbS4KKyAgICAvLyBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMgdGhpcyBkYXRhIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorICAgIC8vIENvcHkgdGhlIElDVnMgdG8gbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdHVyZSBpbnRvIHRoX2ZpeGVkX2ljdnMgKHdoaWNoIHJlbWFpbnMgdW50b3VjaGVkKSwgd2hlcmUgYWxsIG9mIHRoZQorICAgIC8vIHdvcmtlciB0aHJlYWRzIGNhbiBhY2Nlc3MgdGhlbSBhbmQgbWFrZSB0aGVpciBvd24gY29waWVzIGFmdGVyIHRoZSBiYXJyaWVyLgorICAgIGxvYWRfaWN2cyhuZXdfaWN2cyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkc1swXSk7ICAvLyB0aGUgdGhyZWFkcyBhcnJheXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhdCB0aGlzIHBvaW50CisgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2ZpeGVkX2ljdnMsIG5ld19pY3ZzKTsKKyAgICBzeW5jX2ljdnMoKTsKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVMTDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLCAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSkpOworCisjZWxpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIC8vIFRoZSBJQ1ZzIHdpbGwgYmUgcHJvcGFnYXRlZCBpbiB0aGUgZm9yayBiYXJyaWVyLCBzbyBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVTSDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLCAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSkpOworCisjZWxzZQorICAgIC8vIENvcHkgdGhlIElDVnMgdG8gZWFjaCBvZiB0aGUgbm9uLW1hc3RlciB0aHJlYWRzLiAgVGhpcyB0YWtlcyBPKG50aHJlYWRzKSB0aW1lLgorIyBpZiBPTVBfMzBfRU5BQkxFRAorICAgIGxvYWRfaWN2cyhuZXdfaWN2cyk7CisjIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkc1swXSk7ICAvLyB0aGUgdGhyZWFkcyBhcnJheXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhdCB0aGlzIHBvaW50CisgICAgZm9yKGY9MSA7IGY8bmV3X25wcm9jIDsgZisrKSB7IC8vIHNraXAgdGhlIG1hc3RlciB0aHJlYWQKKyMgaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy8gVE9ETzogR0VIIC0gcGFzcyBpbiBiZXR0ZXIgc291cmNlIGxvY2F0aW9uIGluZm8gc2luY2UgdXN1YWxseSBOVUxMIGhlcmUKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSApICk7CisgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggbG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UgKTsKKyAgICAgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbZl0udGRfaWN2cywgbmV3X2ljdnMpOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIHRlYW0tPnQudF90aHJlYWRzW2ZdLCB0ZWFtICkgKTsKKyMgZWxzZQorICAgICAgICB0ZWFtIC0+IHQudF9zZXRfbnByb2NbZl0gICA9IG5ld19zZXRfbnByb2M7CisgICAgICAgIHRlYW0gLT4gdC50X3NldF9keW5hbWljW2ZdID0gbmV3X3NldF9keW5hbWljOworICAgICAgICB0ZWFtIC0+IHQudF9zZXRfbmVzdGVkW2ZdICA9IG5ld19zZXRfbmVzdGVkOworICAgICAgICB0ZWFtIC0+IHQudF9zZXRfYmxvY2t0aW1lW2ZdICAgPSBuZXdfc2V0X2Jsb2NrdGltZTsKKyAgICAgICAgdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1tmXSA9IG5ld19idF9pbnRlcnZhbHM7CisgICAgICAgIHRlYW0gLT4gdC50X3NldF9idF9zZXRbZl0gID0gbmV3X2J0X3NldDsKKyMgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICB9CisjIGlmIE9NUF8zMF9FTkFCTEVECisgICAgc3luY19pY3ZzKCk7CisjIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVTEwKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZQorICogdGhpcyBhc3N1bWVzIHRoZSB0X3RocmVhZHMgYW5kIHRfbWF4X25wcm9jIGFyZSBhbHJlYWR5IHNldAorICogYWxzbywgd2UgZG9uJ3QgdG91Y2ggdGhlIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfdGVhbSgKKyAgICBrbXBfdGVhbV90ICogdGVhbSwKKyAgICBpbnQgICAgICAgICAgbmV3X25wcm9jLAorICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICogbmV3X2ljdnMsCisgICAgICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgICBsb2MKKyAgICAjZWxzZQorICAgICAgICBpbnQgbmV3X3NldF9ucHJvYywgaW50IG5ld19zZXRfZHluYW1pYywgaW50IG5ld19zZXRfbmVzdGVkLAorICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldAorICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorKSB7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3RlYW06IGVudGVyOiB0ZWFtPSVwXG4iLCB0ZWFtICkgKTsKKworICAgIC8qIHZlcmlmeSAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPD0gdGVhbS0+dC50X21heF9ucHJvYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICk7CisgICAgS01QX01CKCk7CisKKyAgICB0ZWFtIC0+IHQudF9tYXN0ZXJfdGlkICA9IDA7ICAgIC8qIG5vdCBuZWVkZWQgKi8KKyAgICAvKiB0ZWFtIC0+IHQudF9tYXN0ZXJfYmFyOyAgICAgICAgbm90IG5lZWRlZCAqLworICAgIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgID0gbmV3X25wcm9jID4gMSA/IDAgOiAxOworICAgIHRlYW0gLT4gdC50X25wcm9jICAgICAgID0gbmV3X25wcm9jOworCisgICAgLyogdGVhbSAtPiB0LnRfcGFyZW50ICAgICA9IE5VTEw7IFRPRE8gbm90IG5lZWRlZCAmIHdvdWxkIG1lc3MgdXAgaG90IHRlYW0gKi8KKyAgICB0ZWFtIC0+IHQudF9uZXh0X3Bvb2wgICA9IE5VTEw7CisgICAgLyogbWVtc2V0KCB0ZWFtIC0+IHQudF90aHJlYWRzLCAwLCBzaXplb2Yoa21wX2luZm9fdCopKm5ld19ucHJvYyApOyB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisKKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIE5VTEwpOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbSAtPiB0LnRfaW52b2tlICAgICAgPSBOVUxMOyAvKiBub3QgbmVlZGVkICovCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIFRPRE8/Pz86IHRlYW0gLT4gdC50X21heF9hY3RpdmVfbGV2ZWxzICAgICAgID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHRlYW0gLT4gdC50X3NjaGVkICAgICAgID0gbmV3X2ljdnMtPnNjaGVkOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgdGVhbSAtPiB0LnRfZnBfY29udHJvbF9zYXZlZCA9IEZBTFNFOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbSAtPiB0LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgPSAwOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbSAtPiB0LnRfbXhjc3IgPSAwOyAgICAgICAgICAgICAgICAvKiBub3QgbmVlZGVkICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgdGVhbSAtPiB0LnRfY29uc3RydWN0ICAgPSAwOworICAgIF9fa21wX2luaXRfbG9jayggJiB0ZWFtIC0+IHQudF9zaW5nbGVfbG9jayApOworCisgICAgdGVhbSAtPiB0LnRfb3JkZXJlZCAuZHQudF92YWx1ZSA9IDA7CisgICAgdGVhbSAtPiB0LnRfbWFzdGVyX2FjdGl2ZSA9IEZBTFNFOworCisgICAgbWVtc2V0KCAmIHRlYW0gLT4gdC50X3Rhc2txLCAnXDAnLCBzaXplb2YoIGttcF90YXNrcV90ICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgdGVhbSAtPiB0LnRfY29weXByaXZfZGF0YSA9IE5VTEw7ICAvKiBub3QgbmVjZXNzYXJ5LCBidXQgbmljZSBmb3IgZGVidWdnaW5nICovCisjZW5kaWYKKyAgICB0ZWFtIC0+IHQudF9jb3B5aW5fY291bnRlciA9IDA7ICAgIC8qIGZvciBiYXJyaWVyLWZyZWUgY29weWluIGltcGxlbWVudGF0aW9uICovCisKKyAgICB0ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcCA9IE5VTEw7CisKKyAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaWN2cywgbG9jCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2V0X25wcm9jLCBuZXdfc2V0X2R5bmFtaWMsIG5ld19zZXRfbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2V0X2Jsb2NrdGltZSwgbmV3X2J0X2ludGVydmFscywgbmV3X2J0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV90ZWFtOiBleGl0OiB0ZWFtPSVwXG4iLCB0ZWFtICkgKTsKK30KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisvKiBTZXRzIGZ1bGwgbWFzayBmb3IgdGhyZWFkIGFuZCByZXR1cm5zIG9sZCBtYXNrLCBubyBjaGFuZ2VzIHRvIHN0cnVjdHVyZXMuICovCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2Z1bGxfdG1wKCBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApCit7CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCBvbGRfbWFzaywgVFJVRSApOworICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIF9fa21wX2FmZmluaXR5X2dldF9mdWxsTWFzaygpLCBUUlVFICk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8vCisvLyBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCkgaXMgdGhlIGhlYXJ0IG9mIHRoZSBPcGVuTVAgNC4wIGFmZmluaXR5IG1lY2hhbmlzbS4KKy8vIEl0IGNhbGN1bGF0cyB0aGUgd29ya2VyICsgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbiBiYXNlZCB1cG9uIHRoZSBwYXJlbnQKKy8vIHRocmVhZCdzIHBhcnRpdGlvbiwgYW5kIGJpbmRzIGVhY2ggd29ya2VyIHRvIGEgdGhyZWFkIGluIHRoZWlyIHBhcnRpdGlvbi4KKy8vIFRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uIHNob3VsZCBhbHJlYWR5IGluY2x1ZGUgaXRzIGN1cnJlbnQgYmluZGluZy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGxhY2UgcGFydGlvbiB0byB0aGUgdGVhbSBzdHJ1Y3QKKyAgICAvLworICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aCAhPSBOVUxMICk7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgICAgaW50IGZpcnN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9maXJzdF9wbGFjZTsKKyAgICBpbnQgbGFzdF9wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfbGFzdF9wbGFjZTsKKyAgICBpbnQgbWFzdGVyc19wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogZW50ZXI6IHByb2NfYmluZCA9ICVkIFQjJWQoJWQ6MCkgYm91bmQgdG8gcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICBwcm9jX2JpbmQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWzBdICksIHRlYW0tPnQudF9pZCwKKyAgICAgICBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisKKyAgICBzd2l0Y2ggKCBwcm9jX2JpbmQgKSB7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gc2VyaWFsIHRlYW1zIG1pZ2h0IGhhdmUgdGhlIHByb2NfYmluZCBwb2xpY3kgc2V0IHRvCisgICAgICAgIC8vIHByb2NfYmluZF9kZWZhdWx0LiAgSXQgZG9lc24ndCBtYXR0ZXIsIGFzIHdlIGRvbid0CisgICAgICAgIC8vIHJlYmluZCB0aGUgbWFzdGVyIHRocmVhZCBmb3IgYW55IHByb2NfYmluZCBwb2xpY3kuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA9PSAxICk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX21hc3RlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gbWFzdGVyc19wbGFjZTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogbWFzdGVyOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgbWFzdGVyc19wbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX2Nsb3NlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgaW50IG5fcGxhY2VzOworICAgICAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gZmlyc3RfcGxhY2UgKyBsYXN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbl90aCA8PSBuX3BsYWNlcyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCBwbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBTLCByZW0sIGdhcCwgc19jb3VudDsKKyAgICAgICAgICAgICAgICBTID0gbl90aCAvIG5fcGxhY2VzOworICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHJlbSA9IG5fdGggLSAoIFMgKiBuX3BsYWNlcyApOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA+IDAgPyBuX3BsYWNlcy9yZW0gOiBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGludCBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzX2NvdW50ID09IFMpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhZGQgYW4gZXh0cmEgdGhyZWFkIHRvIHBsYWNlIG9uIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzX2NvdW50ID09IFMrMSkgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFkZGVkIGFuIGV4dHJhIHRocmVhZCB0byB0aGlzIHBsYWNlOyBtb3ZlIHRvIG5leHQgcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc19jb3VudCA9PSBTKSB7IC8vIHBsYWNlIGZ1bGw7IGRvbid0IGFkZCBleHRyYQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwgZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBpbnQgbl9wbGFjZXM7CisgICAgICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuX3RoIDw9IG5fcGxhY2VzICkgeworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IFMgPSBuX3BsYWNlcy9uX3RoOworICAgICAgICAgICAgICAgIGludCBzX2NvdW50LCByZW0sIGdhcCwgZ2FwX2N0OworICAgICAgICAgICAgICAgIHJlbSA9IG5fcGxhY2VzIC0gbl90aCpTOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA/IG5fdGgvcmVtIDogMTsKKyAgICAgICAgICAgICAgICBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNfY291bnQgPCBTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVtICYmIChnYXBfY3QgPT0gZ2FwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgZ2FwX2N0Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogc3ByZWFkOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSwgdGgtPnRoLnRoX2xhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgUywgcmVtLCBnYXAsIHNfY291bnQ7CisgICAgICAgICAgICAgICAgUyA9IG5fdGggLyBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZW0gPSBuX3RoIC0gKCBTICogbl9wbGFjZXMgKTsKKyAgICAgICAgICAgICAgICBnYXAgPSByZW0gPiAwID8gbl9wbGFjZXMvcmVtIDogbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgZ2FwX2N0ID0gZ2FwOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHNfY291bnQgPT0gUykgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFkZCBhbiBleHRyYSB0aHJlYWQgdG8gcGxhY2Ugb24gbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHNfY291bnQgPT0gUysxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgb24gdG8gbmV4dCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgaXMgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBzcHJlYWQ6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlLCB0aC0+dGgudGhfbGFzdF9wbGFjZSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhY2UgPT0gbWFzdGVyc19wbGFjZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBleGl0IFQjJWRcbiIsIHRlYW0tPnQudF9pZCApICk7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdXNlLiAgdGFrZSBvbmUgb2ZmIG9mIHRoZSBmcmVlIHBvb2wgaWYgYXZhaWxhYmxlICovCitrbXBfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgbmV3X3Byb2NfYmluZCwKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisjZWxzZQorICAgIGludCBuZXdfc2V0X25wcm9jLCBpbnQgbmV3X3NldF9keW5hbWljLCBpbnQgbmV3X3NldF9uZXN0ZWQsCisgICAgaW50IG5ld19zZXRfYmxvY2t0aW1lLCBpbnQgbmV3X2J0X2ludGVydmFscywgaW50IG5ld19idF9zZXQsCisjZW5kaWYKKyAgICBpbnQgYXJnYyApCit7CisgICAgaW50IGY7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBjaGFyICpwdHI7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogY2FsbGVkXG4iKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jID49MSAmJiBhcmdjID49MCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1heF9ucHJvYyA+PSBuZXdfbnByb2MgKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vCisgICAgLy8gb3B0aW1pemF0aW9uIHRvIHVzZSBhICJob3QiIHRlYW0gZm9yIHRoZSB0b3AgbGV2ZWwsCisgICAgLy8gYXMgaXQgaXMgdXN1YWxseSB0aGUgc2FtZQorICAgIC8vCisgICAgaWYgKCAhIHJvb3QtPnIucl9hY3RpdmUgICYmICBuZXdfbnByb2MgPiAxICkgeworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA9PSBtYXhfbnByb2MgKTsKKworICAgICAgICB0ZWFtID0gIHJvb3QgLT4gci5yX2hvdF90ZWFtOworCisjaWYgT01QXzMwX0VOQUJMRUQgJiYgS01QX0RFQlVHCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtID0gJXAgYmVmb3JlIHJlaW5pdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3Rhc2tfdGVhbSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLyogaGFzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VkPyAqLworICAgICAgICBpZiggdGVhbSAtPiB0LnRfbnByb2MgPiBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZGVjcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworI2lmIEtNUF9NSUMKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X3NpemVfY2hhbmdlZCA9IDE7CisjZW5kaWYKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW07CisgICAgICAgICAgICAgICAgaWYgKCAoIHRhc2tfdGVhbSAhPSBOVUxMICkgJiYgVENSX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFNpZ25hbCB0aGUgd29ya2VyIHRocmVhZHMgKGVzcC4gdGhlIGV4dHJhIG9uZXMpIHRvIHN0b3AKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9va2luZyBmb3IgdGFza3Mgd2hpbGUgc3BpbiB3YWl0aW5nLiAgVGhlIHRhc2sgdGVhbXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHJlZmVyZW5jZSBjb3VudGVkIGFuZCB3aWxsIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA+IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9hY3RpdmUsIEZBTFNFICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW0gJXAgdG8gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3Rhc2tfdGVhbSApICk7CisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gPT0gTlVMTCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUgKi8KKyAgICAgICAgICAgIGZvciggZiA9IG5ld19ucHJvYyAgOyAgZiA8IHRlYW0tPnQudF9ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbIGYgXSA9ICBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9ucHJvYyA9ICBuZXdfbnByb2M7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0gLT4gdC50X21heF9hY3RpdmVfbGV2ZWxzID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2NoZWQgPSAgbmV3X2ljdnMtPnNjaGVkOworI2VuZGlmCisgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfbnByb2MsIG5ld19zZXRfZHluYW1pYywgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NldF9ibG9ja3RpbWUsIG5ld19idF9pbnRlcnZhbHMsIG5ld19idF9zZXQKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpICk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfbnByb2MgPSBuZXdfbnByb2M7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzID0gbmV3X25wcm9jOworICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0tPnR0LnR0X3JlZl9jdCA9IG5ld19ucHJvYyAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgcmVtYWluaW5nIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGZvciggZiA9IDAgIDsgIGYgPCBuZXdfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyBmIF0gLT4gdGgudGhfdGVhbV9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIH0KKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBjdXJyZW50IHRhc2sgc3RhdGUgb2YgdGhlIG1hc3RlciB0aHJlYWQ6IHNob3VsZCBiZSB0aGUgaW1wbGljaXQgdGFzaworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKworICAgICAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0ZWFtIC0+IHQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgZisrICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICYmCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHRlYW0gLT4gdC50X25wcm9jIDwgbmV3X25wcm9jICkgeworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzazsKKyAgICAgICAgICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0FMTE9DKG9sZF9tYXNrKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaW5jcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworI2lmIEtNUF9NSUMKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X3NpemVfY2hhbmdlZCA9IDE7CisjZW5kaWYKKworCisgICAgICAgICAgICBpZih0ZWFtIC0+IHQudF9tYXhfbnByb2MgPCBuZXdfbnByb2MpIHsKKyAgICAgICAgICAgICAgICAvKiByZWFsbG9jYXRlIGxhcmdlciBhcnJheXMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKHRlYW0sIG5ld19ucHJvYyk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2ljdnMsIE5VTEwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfbnByb2MsIG5ld19zZXRfZHluYW1pYywgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfYmxvY2t0aW1lLCBuZXdfYnRfaW50ZXJ2YWxzLCBuZXdfYnRfc2V0CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBUZW1wb3JhcmlseSBzZXQgZnVsbCBtYXNrIGZvciBtYXN0ZXIgdGhyZWFkIGJlZm9yZQorICAgICAgICAgICAgICAgY3JlYXRpb24gb2Ygd29ya2Vycy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdvcmtlcnMgaW5oZXJpdAorICAgICAgICAgICAgICAgdGhlIGFmZmluaXR5IGZyb20gbWFzdGVyLCBzbyBpZiBhIGxvdCBvZiB3b3JrZXJzIGFyZQorICAgICAgICAgICAgICAgY3JlYXRlZCBvbiB0aGUgc2luZ2xlIGNvcmUgcXVpY2tseSwgdGhleSBkb24ndCBnZXQKKyAgICAgICAgICAgICAgIGEgY2hhbmNlIHRvIHNldCB0aGVpciBvd24gYWZmaW5pdHkgZm9yIGEgbG9uZyB0aW1lLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fa21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19mdWxsX3RtcCggb2xkX21hc2sgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgdGhyZWFkcyBmb3IgdGhlIGhvdCB0ZWFtICovCisgICAgICAgICAgICBmb3IoIGYgPSB0ZWFtLT50LnRfbnByb2MgIDsgIGYgPCBuZXdfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogbmV3X3dvcmtlciA9IF9fa21wX2FsbG9jYXRlX3RocmVhZCggcm9vdCwgdGVhbSwgZiApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld193b3JrZXIgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gbmV3X3dvcmtlcjsKKyAgICAgICAgICAgICAgICBuZXdfd29ya2VyLT50aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBUIyVkIGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIF9fa21wX2d0aWRfZnJvbV90aWQoIGYsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2Jhcltic19wbGFpbl9iYXJyaWVyXS5iX2Fycml2ZWQgKSApOworCisgICAgICAgICAgICAgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YSBmb3IgbmV3IHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfd29ya2VyLT50aC50aF9iYXI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnBfbGFzdF9iYXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBpbml0aWFsIG1hc3RlciB0aHJlYWQncyBhZmZpbml0eSBtYXNrICovCisgICAgICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggb2xkX21hc2ssIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBldmVyeW9uZSBpcyBzeW5jcm9uaXplZCAqLworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgbmV3X2ljdnMsCisgICAgICAgICAgICAgIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQKKyNlbHNlCisgICAgICAgICAgICAgIG5ld19zZXRfbnByb2MsIG5ld19zZXRfZHluYW1pYywgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgIG5ld19zZXRfYmxvY2t0aW1lLCBuZXdfYnRfaW50ZXJ2YWxzLCBuZXdfYnRfc2V0CisjZW5kaWYKKyAgICAgICAgICAgICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW07CisgICAgICAgICAgICAgICAgaWYgKCB0YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISBUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSApOworICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID0gbmV3X25wcm9jOworICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF9yZWZfY3QgPSBuZXdfbnByb2MgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiByZWluaXRpYWxpemUgdGhlIG9sZCB0aHJlYWRzICovCisgICAgICAgICAgICBmb3IoIGYgPSAwICA7ICBmIDwgdGVhbS0+dC50X25wcm9jICA7ICBmKysgKQorICAgICAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggdGVhbS0+dC50X3RocmVhZHNbIGYgXSwgdGVhbSwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGYsIHRlYW0gKSApOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiByZXVzaW5nIGhvdCB0ZWFtXG4iICkpOworI2lmIEtNUF9NSUMKKyAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBjYW4gbWVhbiB0aGF0IG9tcF9zZXRfbnVtX3RocmVhZHMoKSB3YXMgY2FsbGVkIGFuZCB0aGUgaG90IHRlYW0gc2l6ZQorICAgICAgICAgICAgLy8gd2FzIGFscmVhZHkgcmVkdWNlZCwgc28gd2UgY2hlY2sgdGhlIHNwZWNpYWwgZmxhZworICAgICAgICAgICAgaWYgKCB0ZWFtIC0+IHQudF9zaXplX2NoYW5nZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0gLT4gdC50X21heF9hY3RpdmVfbGV2ZWxzID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2NoZWQgPSAgbmV3X2ljdnMtPnNjaGVkOworI2VuZGlmCisKKyAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2ljdnMsIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2V0X2Jsb2NrdGltZSwgbmV3X2J0X2ludGVydmFscywgbmV3X2J0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTI6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0gLT4gdC50X3RocmVhZHNbIDAgXSwgdGVhbSwgMCApOworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoIHRlYW0tPnQudF9wcm9jX2JpbmQgPT0gbmV3X3Byb2NfYmluZCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHJldXNpbmcgaG90IHRlYW0gIyVkIGJpbmRpbmdzOiBwcm9jX2JpbmQgPSAlZCwgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgbmV3X3Byb2NfYmluZCwgdGVhbS0+dC50X2ZpcnN0X3BsYWNlLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisgICAgICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworICAgICAgICAgICAgfQorIyBlbHNlCisgICAgICAgICAgICBpZiAoIHRlYW0tPnQudF9wcm9jX2JpbmQgIT0gbmV3X3Byb2NfYmluZCApIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIH0KKworICAgICAgICAvKiByZWFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgVFJVRSApOworICAgICAgICB0ZWFtIC0+IHQudF9hcmdjICAgICA9IGFyZ2M7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBob3QgdGVhbSByZS11c2VzIHRoZSBwcmV2aW91cyB0YXNrIHRlYW0sCisgICAgICAgIC8vIGlmIHVudG91Y2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbGVhc2UtPmdhdGhlciBwaGFzZS4KKyAgICAgICAgLy8KKworICAgICAgICBLRl9UUkFDRSggMTAsICggIiBob3RfdGVhbSA9ICVwXG4iLCB0ZWFtICkgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVEICYmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbSA9ICVwIGFmdGVyIHJlaW5pdFxuIiwKKyAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGFza190ZWFtICkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICByZXR1cm4gdGVhbTsKKyAgICB9CisKKyAgICAvKiBuZXh0LCBsZXQncyB0cnkgdG8gdGFrZSBvbmUgZnJvbSB0aGUgdGVhbSBwb29sICovCisgICAgS01QX01CKCk7CisgICAgZm9yKCB0ZWFtID0gKGttcF90ZWFtX3QqKSBfX2ttcF90ZWFtX3Bvb2wgOyAodGVhbSkgOyApCisgICAgeworICAgICAgICAvKiBUT0RPOiBjb25zaWRlciByZXNpemluZyB1bmRlcnNpemVkIHRlYW1zIGluc3RlYWQgb2YgcmVhcGluZyB0aGVtLCBub3cgdGhhdCB3ZSBoYXZlIGEgcmVzaXppbmcgbWVjaGFuaXNtICovCisgICAgICAgIGlmICggdGVhbS0+dC50X21heF9ucHJvYyA+PSBtYXhfbnByb2MgKSB7CisgICAgICAgICAgICAvKiB0YWtlIHRoaXMgdGVhbSBmcm9tIHRoZSB0ZWFtIHBvb2wgKi8KKyAgICAgICAgICAgIF9fa21wX3RlYW1fcG9vbCA9IHRlYW0tPnQudF9uZXh0X3Bvb2w7CisKKyAgICAgICAgICAgIC8qIHNldHVwIHRoZSB0ZWFtIGZvciBmcmVzaCB1c2UgKi8KKyAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X25wcm9jLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgIG5ld19pY3ZzLAorICAgICAgICAgICAgICBOVUxMIC8vIFRPRE86ICEhIQorI2Vsc2UKKyAgICAgICAgICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgbmV3X3NldF9ibG9ja3RpbWUsIG5ld19idF9pbnRlcnZhbHMsIG5ld19idF9zZXQKKyNlbmRpZgorICAgICAgICAgICAgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3RlYW06IHNldHRpbmcgdGFza190ZWFtICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90YXNrX3RlYW0gKSApOworICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGFza190ZWFtID0gTlVMTDsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiByZWFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2FyZ2MgICAgID0gYXJnYzsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjZW5kaWYKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHVzaW5nIHRlYW0gZnJvbSBwb29sICVkLlxuIiwgdGVhbS0+dC50X2lkICkpOworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0ZWFtOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhcCB0ZWFtIGlmIGl0IGlzIHRvbyBzbWFsbCwgdGhlbiBsb29wIGJhY2sgYW5kIGNoZWNrIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAvKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHdpc2UsIGJ1dCwgd2lsbCBiZSByZWRvbmUgZHVyaW5nIHRoZSBob3QtdGVhbXMgcmV3cml0ZS4gKi8KKyAgICAgICAgLyogVE9ETzogVXNlIHRlY2huaXF1ZSB0byBmaW5kIHRoZSByaWdodCBzaXplIGhvdC10ZWFtLCBkb24ndCByZWFwIHRoZW0gKi8KKyAgICAgICAgdGVhbSA9ICBfX2ttcF9yZWFwX3RlYW0oIHRlYW0gKTsKKyAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbTsKKyAgICB9CisKKyAgICAvKiBub3RoaW5nIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCwgbm8gbWF0dGVyLCBtYWtlIGEgbmV3IHRlYW0hICovCisgICAgS01QX01CKCk7CisgICAgdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZigga21wX3RlYW1fdCApICk7CisKKyAgICAvKiBhbmQgc2V0IGl0IHVwICovCisgICAgdGVhbSAtPiB0LnRfbWF4X25wcm9jICAgPSBtYXhfbnByb2M7CisgICAgLyogTk9URSB3ZWxsLCBmb3Igc29tZSByZWFzb24gYWxsb2NhdGluZyBvbmUgYmlnIGJ1ZmZlciBhbmQgZGl2aWRpbmcgaXQKKyAgICAgKiB1cCBzZWVtcyB0byByZWFsbHkgaHVydCBwZXJmb3JtYW5jZSBhIGxvdCBvbiB0aGUgUDQsIHNvLCBsZXQncyBub3QgdXNlCisgICAgICogdGhpcy4uLiAqLworICAgIF9fa21wX2FsbG9jYXRlX3RlYW1fYXJyYXlzKCB0ZWFtLCBtYXhfbnByb2MgKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogbWFraW5nIGEgbmV3IHRlYW1cbiIgKSApOworICAgIF9fa21wX2luaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X25wcm9jLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICBuZXdfaWN2cywKKyAgICAgIE5VTEwgLy8gVE9ETzogISEhCisjZWxzZQorICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgIG5ld19zZXRfYmxvY2t0aW1lLCBuZXdfYnRfaW50ZXJ2YWxzLCBuZXdfYnRfc2V0CisjZW5kaWYKKyAgICApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3RlYW06IHNldHRpbmcgdGFza190ZWFtICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICB0ZWFtIC0+IHQudF90YXNrX3RlYW0gPSBOVUxMOyAgICAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90ZWFtX3N0b3JhZ2VfbWFwKCAidGVhbSIsIHRlYW0sIHRlYW0tPnQudF9pZCwgbmV3X25wcm9jICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyAqLworICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgRkFMU0UgKTsKKyAgICB0ZWFtIC0+IHQudF9hcmdjICAgICAgICA9IGFyZ2M7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICB9CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZG9uZSBjcmVhdGluZyBhIG5ldyB0ZWFtICVkLlxuIiwgdGVhbS0+dC50X2lkICkpOworCisgICAgcmV0dXJuIHRlYW07Cit9CisKKy8qIFRPRE8gaW1wbGVtZW50IGhvdC10ZWFtcyBhdCBhbGwgbGV2ZWxzICovCisvKiBUT0RPIGltcGxlbWVudCBsYXp5IHRocmVhZCByZWxlYXNlIG9uIGRlbWFuZCAoZGlzYmFuZCByZXF1ZXN0KSAqLworCisvKiBmcmVlIHRoZSB0ZWFtLiAgcmV0dXJuIGl0IHRvIHRoZSB0ZWFtIHBvb2wuICByZWxlYXNlIGFsbCB0aGUgdGhyZWFkcworICogYXNzb2NpYXRlZCB3aXRoIGl0ICovCit2b2lkCitfX2ttcF9mcmVlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGludCBmOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mcmVlX3RlYW06IFQjJWQgZnJlZWluZyB0ZWFtICVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICAvKiB2ZXJpZnkgc3RhdGUgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKworICAgIC8qIHRlYW0gaXMgZG9uZSB3b3JraW5nICovCisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBOVUxMKTsgLy8gSW1wb3J0YW50IGZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorICAgIHRlYW0gLT4gdC50X2NvcHlpbl9jb3VudGVyID0gMDsgLy8gaW5pdCBjb3VudGVyIGZvciBwb3NzaWJsZSByZXVzZQorICAgIC8vIERvIG5vdCByZXNldCBwb2ludGVyIHRvIHBhcmVudCB0ZWFtIHRvIE5VTEwgZm9yIGhvdCB0ZWFtcy4KKworICAgIC8qIGlmIHdlIGFyZSBhIG5lc3RlZCB0ZWFtLCByZWxlYXNlIG91ciB0aHJlYWRzICovCisgICAgaWYoIHRlYW0gIT0gcm9vdC0+ci5yX2hvdF90ZWFtICkgeworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBTaWduYWwgdGhlIHdvcmtlciB0aHJlYWRzIHRvIHN0b3AgbG9va2luZyBmb3IgdGFza3Mgd2hpbGUKKyAgICAgICAgICAgICAgICAvLyBzcGluIHdhaXRpbmcuICBUaGUgdGFzayB0ZWFtcyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIHdpbGwKKyAgICAgICAgICAgICAgICAvLyBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbGFzdCB3b3JrZXIgdGhyZWFkIHZpYSB0aGUgdGhyZWFkJ3MKKyAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSB0YXNrIHRlYW0uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2ZyZWVfdGVhbTogZGVhY3RpdmF0aW5nIHRhc2tfdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtICkgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfbnByb2MgPiAxICk7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9hY3RpdmUsIEZBTFNFICk7CisgICAgICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgICAgIC8vIFJlc2V0IHBvaW50ZXIgdG8gcGFyZW50IHRlYW0gb25seSBmb3Igbm9uLWhvdCB0ZWFtcy4KKyAgICAgICAgdGVhbSAtPiB0LnRfcGFyZW50ID0gTlVMTDsKKworCisgICAgICAgIC8qIGZyZWUgdGhlIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgdGVhbS0+dC50X25wcm9jOyArKyBmICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgX19rbXBfZnJlZV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgICAgICB9CisKKworICAgICAgICAvKiBwdXQgdGhlIHRlYW0gYmFjayBpbiB0aGUgdGVhbSBwb29sICovCisgICAgICAgIC8qIFRPRE8gbGltaXQgc2l6ZSBvZiB0ZWFtIHBvb2wsIGNhbGwgcmVhcF90ZWFtIGlmIHBvb2wgdG9vIGxhcmdlICovCisgICAgICAgIHRlYW0gLT4gdC50X25leHRfcG9vbCAgPSAoa21wX3RlYW1fdCopIF9fa21wX3RlYW1fcG9vbDsKKyAgICAgICAgX19rbXBfdGVhbV9wb29sICAgICAgICA9ICh2b2xhdGlsZSBrbXBfdGVhbV90KikgdGVhbTsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiByZWFwIHRoZSB0ZWFtLiAgZGVzdHJveSBpdCwgcmVjbGFpbSBhbGwgaXRzIHJlc291cmNlcyBhbmQgZnJlZSBpdHMgbWVtb3J5ICovCitrbXBfdGVhbV90ICoKK19fa21wX3JlYXBfdGVhbSgga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX3RlYW1fdCAqbmV4dF9wb29sID0gdGVhbSAtPiB0LnRfbmV4dF9wb29sOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2Rpc3BhdGNoICAgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfZGlzcF9idWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF90aHJlYWRzICAgICApOworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfc2V0X25wcm9jICAgKTsKKyAgICAjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF9hcmd2ICAgICAgICApOworCisgICAgLyogVE9ETyBjbGVhbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBhIHBhcnQgb2YgdGhpcz8gKi8KKworICAgIC8qIGZyZWUgc3R1ZmYgKi8KKworICAgIF9fa21wX2ZyZWVfdGVhbV9hcnJheXMoIHRlYW0gKTsKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisgICAgaWYgKCB0ZWFtIC0+IHQudF9hcmd2ICE9ICZ0ZWFtIC0+IHQudF9pbmxpbmVfYXJndlswXSApCisgICAgICAgIF9fa21wX2ZyZWUoICh2b2lkKikgdGVhbSAtPiB0LnRfYXJndiApOworI2Vsc2UKKyAgICBfX2ttcF9mcmVlKCAodm9pZCopIHRlYW0gLT4gdC50X2FyZ3YgKTsKKyNlbmRpZgorICAgIF9fa21wX2ZyZWUoIHRlYW0gKTsKKworICAgIEtNUF9NQigpOworICAgIHJldHVybiBuZXh0X3Bvb2w7Cit9CisKKy8vCisvLyBGcmVlIHRoZSB0aHJlYWQuICBEb24ndCByZWFwIGl0LCBqdXN0IHBsYWNlIGl0IG9uIHRoZSBwb29sIG9mIGF2YWlsYWJsZQorLy8gdGhyZWFkcy4KKy8vCisvLyBDaGFuZ2VzIGZvciBRdWFkIGlzc3VlIDUyNzg0NTogV2UgbmVlZCBhIHByZWRpY3RhYmxlIE9NUCB0aWQgPC0+IGd0aWQKKy8vIGJpbmRpbmcgZm9yIHRoZSBhZmZpbml0eSBtZWNoYW5pc20gdG8gYmUgdXNlZnVsLgorLy8KKy8vIE5vdywgd2UgYWx3YXlzIGtlZXAgdGhlIGZyZWUgbGlzdCAoX19rbXBfdGhyZWFkX3Bvb2wpIHNvcnRlZCBieSBndGlkLgorLy8gSG93ZXZlciwgd2Ugd2FudCB0byBhdm9pZCBhIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBwcm9ibGVtIGJ5IGFsd2F5cworLy8gc2Nhbm5pbmcgdGhyb3VnaCB0aGUgbGlzdCB0byBmaW5kIHRoZSBjb3JyZWN0IHBvaW50IGF0IHdoaWNoIHRvIGluc2VydAorLy8gdGhlIHRocmVhZCAocG90ZW50aWFsIE4qKjIgYmVoYXZpb3IpLiAgVG8gZG8gdGhpcyB3ZSBrZWVwIHRyYWNrIG9mIHRoZQorLy8gbGFzdCBwbGFjZSBhIHRocmVhZCBzdHJ1Y3Qgd2FzIGluc2VydGVkIChfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQpLgorLy8gV2l0aCBzaW5nbGUtbGV2ZWwgcGFyYWxsZWxpc20sIHRocmVhZHMgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIHRhaWwKKy8vIG9mIHRoZSBsaXN0LCBrZXB0IHRyYWNrIG9mIGJ5IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC4gIFdpdGggbmVzdGVkCisvLyBwYXJhbGxlbGlzbSwgYWxsIGJldHMgYXJlIG9mZiBhbmQgd2UgbWF5IG5lZWQgdG8gc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUKKy8vIGZyZWUgbGlzdC4KKy8vCisvLyBUaGlzIGNoYW5nZSBhbHNvIGhhcyBhIHBvdGVudGlhbGx5IGxhcmdlIHBlcmZvcm1hbmNlIGJlbmVmaXQsIGZvciBzb21lCisvLyBhcHBsaWNhdGlvbnMuICBQcmV2aW91c2x5LCBhcyB0aHJlYWRzIHdlcmUgZnJlZWQgZnJvbSB0aGUgaG90IHRlYW0sIHRoZXkKKy8vIHdvdWxkIGJlIHBsYWNlZCBiYWNrIG9uIHRoZSBmcmVlIGxpc3QgaW4gaW52ZXJzZSBvcmRlci4gIElmIHRoZSBob3QgdGVhbQorLy8gZ3JldyBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgc2l6ZSwgdGhlbiB0aGUgZnJlZWQgdGhyZWFkIHdvdWxkIGJlIHBsYWNlZAorLy8gYmFjayBvbiB0aGUgaG90IHRlYW0gaW4gcmV2ZXJzZSBvcmRlci4gIFRoaXMgY291bGQgY2F1c2UgYmFkIGNhY2hlCisvLyBsb2NhbGl0eSBwcm9ibGVtcyBvbiBwcm9ncmFtcyB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgaG90IHRlYW0gcmVndWxhcmx5CisvLyBncmV3IGFuZCBzaHJ1bmsuCisvLworLy8gTm93LCBmb3Igc2luZ2xlLWxldmVsIHBhcmFsbGVsaXNtLCB0aGUgT01QIHRpZCBpcyBhbHdheSA9PSBndGlkLgorLy8KK3ZvaWQKK19fa21wX2ZyZWVfdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RoICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfaW5mb190ICoqc2NhbjsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mcmVlX3RocmVhZDogVCMlZCBwdXR0aW5nIFQjJWQgYmFjayBvbiBmcmVlIHBvb2wuXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGggKTsKKworCisgICAgLyogcHV0IHRocmVhZCBiYWNrIG9uIHRoZSBmcmVlIHBvb2wgKi8KKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX3RlYW0sIE5VTEwpOworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfcm9vdCwgTlVMTCk7CisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9kaXNwYXRjaCwgTlVMTCk7ICAgICAgICAgICAgICAgLyogTk9UIE5FRURFRCAqLworCisgICAgLy8KKyAgICAvLyBJZiB0aGUgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0IGlzIGFscmVhZHkgcGFzdCB0aGUgbmV3IGluc2VydAorICAgIC8vIHBvaW50LCB0aGVuIHdlIG5lZWQgdG8gcmUtc2NhbiB0aGUgZW50aXJlIGxpc3QuCisgICAgLy8KKyAgICBndGlkID0gdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sICE9IE5VTEwgKTsKKyAgICAgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA+IGd0aWQgKSB7CisgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gU2NhbiBkb3duIHRoZSBsaXN0IHRvIGZpbmQgdGhlIHBsYWNlIHRvIGluc2VydCB0aGUgdGhyZWFkLgorICAgIC8vIHNjYW4gaXMgdGhlIGFkZHJlc3Mgb2YgYSBsaW5rIGluIHRoZSBsaXN0LCBwb3NzaWJseSB0aGUgYWRkcmVzcyBvZgorICAgIC8vIF9fa21wX3RocmVhZF9wb29sIGl0c2VsZi4KKyAgICAvLworICAgIC8vIEluIHRoZSBhYnNlbmNlIG9mIG5lc3RlZCBwYXJhbGxpc20sIHRoZSBmb3IgbG9vcCB3aWxsIGhhdmUgMCBpdGVyYXRpb25zLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCApIHsKKyAgICAgICAgc2NhbiA9ICYoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfbmV4dF9wb29sICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzY2FuID0gKGttcF9pbmZvX3QgKiopJl9fa21wX3RocmVhZF9wb29sOworICAgIH0KKyAgICBmb3IgKDsgKCAqc2NhbiAhPSBOVUxMICkgJiYgKCAoKnNjYW4pLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPCBndGlkICk7CisgICAgICBzY2FuID0gJiggKCpzY2FuKS0+dGgudGhfbmV4dF9wb29sICkgKTsKKworICAgIC8vCisgICAgLy8gSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBvbiB0aGUgbGlzdCwgYW5kIHNldCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQKKyAgICAvLyB0byBpdHMgYWRkcmVzcy4KKyAgICAvLworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfbmV4dF9wb29sLCAqc2Nhbik7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gKnNjYW4gPSB0aGlzX3RoOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggdGhpc190aC0+dGgudGhfbmV4dF9wb29sID09IE5VTEwgKQorICAgICAgfHwgKCB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQKKyAgICAgIDwgdGhpc190aC0+dGgudGhfbmV4dF9wb29sLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIFRDV180KHRoaXNfdGgtPnRoLnRoX2luX3Bvb2wsIFRSVUUpOworICAgIF9fa21wX3RocmVhZF9wb29sX250aCsrOworCisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggLSAxKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHVzZXIgc2V0dGluZyBvciBkZWZhdWx0IGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIEtNUF9NQigpOworfQorCit2b2lkCitfX2ttcF9qb2luX2JhcnJpZXIoIGludCBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKnRoaXNfdGhyICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfdWludCAgICAgIG5wcm9jOworICAgIGttcF9pbmZvX3QgICAgICAgICAgICAqbWFzdGVyX3RocmVhZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRpZDsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdGVhbV9pZDsKKyAgICAjZW5kaWYgLyogS01QX0RFQlVHICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBOVUxMOworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgLy8gZG9uJ3QgY2FsbCByb3V0aW5lIHdpdGhvdXQgbmVlZAorICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7IC8vIGdldCBvYmplY3QgY3JlYXRlZCBhdCBmb3JrX2JhcnJpZXIKKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIGdldCBjdXJyZW50IGluZm8gKi8KKyAgICB0ZWFtICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICAvKiAgICBucHJvYyAgICAgICAgID0gdGVhbSAtPiB0LnRfbnByb2M7Ki8KKyAgICBucHJvYyAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbV9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICB0aWQgICAgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHRlYW1faWQgICAgICAgPSB0ZWFtIC0+IHQudF9pZDsKKyAgICAjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgLyogICAgbWFzdGVyX3RocmVhZCA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF07Ki8KKyAgICBtYXN0ZXJfdGhyZWFkID0gdGhpc190aHIgLT4gdGgudGhfdGVhbV9tYXN0ZXI7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpZiAoIG1hc3Rlcl90aHJlYWQgIT0gdGVhbS0+dC50X3RocmVhZHNbMF0gKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICAgICAgfQorICAgICNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGhyZWFkID09IHRlYW0tPnQudF90aHJlYWRzWzBdICk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiB2ZXJpZnkgc3RhdGUgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0gdGVhbSAtPiB0LnRfdGhyZWFkc1t0aWRdICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBhcnJpdmVkIGF0IGpvaW4gYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQgKSk7CisKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyICkgeworICAgICAgICAgICAgX19rbXBfdGFza2luZ19iYXJyaWVyKCB0ZWFtLCB0aGlzX3RociwgZ3RpZCApOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRha2luZyBiYXJyaWVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbV9pZCwgdGlkICkpOworICAgICAgICB9CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkLCBvbGQgdGVhbSA9ICVkLCBvbGQgdGFza190ZWFtID0gJXAsIHRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0ZWFtX2lkLCB0ZWFtIC0+IHQudF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gKSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSB0ZWFtLT50LnRfdGFza190ZWFtICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgICNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3NsZWVwKCkKKyAgICAvLyBjYW4gYWNjZXNzIGl0IHdoZW4gdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LgorICAgIC8vCisgICAgLy8gRG9pbmcgdGhlc2UgbG9hZHMgY2F1c2VzIGEgY2FjaGUgbWlzcyBzbG93cyBkb3duIEVQQ0MgcGFyYWxsZWwgYnkgMnguCisgICAgLy8gQXMgYSB3b3JrYXJvdW5kLCB3ZSBkbyBub3QgcGVyZm9ybSB0aGUgY29weSBpZiBibG9ja3RpbWU9aW5maW5pdGUsCisgICAgLy8gc2luY2UgdGhlIHZhbHVlcyBhcmUgbm90IHVzZWQgYnkgX19rbXBfd2FpdF9zbGVlcCgpIGluIHRoYXQgY2FzZS4KKyAgICAvLworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X3NldCA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1t0aWRdOworICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9zZXQ9IHRlYW0gLT4gdC50X3NldF9idF9zZXRbdGlkXTsKKyAgICAgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKQorICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gYnBfbGluZWFyX2JhciB8fCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgYnNfZm9ya2pvaW5fYmFycmllciBdID09IDAgKSB7CisgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlciggYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIGlmICggX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgYnNfZm9ya2pvaW5fYmFycmllciBdID09IGJwX3RyZWVfYmFyICkgeworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfTsgLy8gaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvLworICAgIC8vIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUgbWF5IGJlIGRlYWxsb2NhdGVkCisgICAgLy8gYXQgYW55IHRpbWUgYnkgdGhlIG1hc3RlciB0aHJlYWQgLSBpdCBpcyB1bnNhZmUgdG8gcmVmZXJlbmNlIGl0CisgICAgLy8gaW4gYW55IG9mIHRoZSB3b3JrZXIgdGhyZWFkcy4KKyAgICAvLworICAgIC8vIEFueSBwZXItdGVhbSBkYXRhIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSByZWZlcmVuY2VkIGJlZm9yZSB0aGUgZW5kCisgICAgLy8gb2YgdGhlIGJhcnJpZXIgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0cy4KKyAgICAvLworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggS01QX01BU1RFUl9USUQoIHRpZCApICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgc2hvdWxkbid0IGNhbGwgZGVjcmVhc2VfbG9hZCgpLiAgICAgICAgIC8vIFRPRE86IGVuYWJsZSBtYXN0ZXIgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgc2hvdWxkIGhhdmUgdGhfbWF5X2RlY3JlYXNlX2xvYWQgPT0gMC4gIC8vIFRPRE86IGVuYWJsZSBtYXN0ZXIgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCggdGhpc190aHIsIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgLy8gSm9pbiBiYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZAorICAgICAgICAgICAgaWYoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCB0bXAgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgaWRlbnRfdCAqIGxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCB0bXAsIDAsIGxvYyApOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSwgdG1wLCAxLCBsb2MgKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCB0bXAsIDAsIGxvYyApOworICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSwgdG1wLCAxLCBsb2MgKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIH0KKyAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICNpZiBLTVBfREVCVUcKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfVElEKCB0aWQgKSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHNheXMgYWxsICVkIHRlYW0gdGhyZWFkcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW1faWQsIHRpZCwgbnByb2MgKSk7CisgICAgICAgIH0KKyAgICAjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiBUT0RPIG5vdywgbWFyayB3b3JrZXIgdGhyZWFkcyBhcyBkb25lIHNvIHRoZXkgbWF5IGJlIGRpc2JhbmRlZCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgbGVhdmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQgKSk7Cit9CisKKworLyogVE9ETyByZWxlYXNlIHdvcmtlciB0aHJlYWRzJyBmb3JrIGJhcnJpZXJzIGFzIHdlIGFyZSByZWFkeSBpbnN0ZWFkIG9mIGFsbCBhdCBvbmNlICovCisKK3ZvaWQKK19fa21wX2ZvcmtfYmFycmllciggaW50IGd0aWQsIGludCB0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gICAgID0gKCB0aWQgPT0gMCApID8gdGhpc190aHIgLT4gdGgudGhfdGVhbSA6IE5VTEw7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBOVUxMOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgKCB0ZWFtICE9IE5VTEwgKSA/IHRlYW0tPnQudF9pZCA6IC0xLCB0aWQgKSk7CisKKyAgICAvKiB0aF90ZWFtIHBvaW50ZXIgb25seSB2YWxpZCBmb3IgbWFzdGVyIHRocmVhZCBoZXJlICovCisgICAgaWYgKCBLTVBfTUFTVEVSX1RJRCggdGlkICkgKSB7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDEgKTsgLy8gY3JlYXRlIGl0dCBiYXJyaWVyIG9iamVjdAorICAgICAgICAgICAgICAgIC8vX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOyAgIC8vIEFDOiBubyBuZWVkIHRvIGNhbGwgcHJlcGFyZSByaWdodCBiZWZvcmUgYWNxdWlyZWQKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoIGd0aWQsIGl0dF9zeW5jX29iaiApOyAgICAgICAvLyBjYWxsIGFjcXVpcmVkIC8gcmVsZWFzaW5nCisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworCisjaWZkZWYgS01QX0RFQlVHCisKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtIC0+IHQudF90aHJlYWRzOworICAgICAgICByZWdpc3RlciBpbnQgICAgICAgICAgaTsKKworICAgICAgICAvKiB2ZXJpZnkgc3RhdGUgKi8KKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgZm9yKCBpID0gMTsgaSA8IHRlYW0gLT4gdC50X25wcm9jIDsgaSsrICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDUwMCwgKCAiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOjApIGNoZWNraW5nIFQjJWQoJWQ6JWQpIGZvcmsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28gPT0gJXUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9nbyApICk7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggVENSXzQoIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi5iX2dvICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+KEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gS01QX0lOSVRfQkFSUklFUl9TVEFURSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbSA9PSB0ZWFtICk7CisKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKCB0aGlzX3RociwgdGVhbSApOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbWFzdGVyIHRocmVhZCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBibG9ja3RpbWUgYmV0d2VlbiB0aGUKKyAgICAgICAgLy8gam9pbiBiYXJyaWVyIGFuZCB0aGUgZm9yayBiYXJyaWVyLgorICAgICAgICAvLworICAgICAgICAvLyBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3NsZWVwKCkKKyAgICAgICAgLy8gY2FuIGFjY2VzcyBpdCB3aGVuIHRoZSB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VlIHRoZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkKKyAgICAgICAgLy8gYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisjZWxzZQorICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzW3RpZF07CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X3NldD0gdGVhbSAtPiB0LnRfc2V0X2J0X3NldFt0aWRdOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgIH0KKyAgICB9IC8vIG1hc3RlcgorCisgICAgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfZm9ya2pvaW5fYmFycmllciBdID09IGJwX2xpbmVhcl9iYXIgfHwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gMCApIHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZSggYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfZm9ya2pvaW5fYmFycmllciBdID09IGJwX3RyZWVfYmFyICkgeworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZSggYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZSggYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfTsgLy8gaWYKKworICAgIC8vCisgICAgLy8gZWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgLy8KKyAgICBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmICggS01QX01BU1RFUl9USUQoIHRpZCApICkgeworICAgICAgICAgICAgICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0oIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgaWYgKCAhS01QX01BU1RFUl9USUQoIHRpZCApICkgeworICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgaXMgbGVhdmluZyBlYXJseVxuIiwgZ3RpZCApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UgY2FuIG5vdyBhc3N1bWUgdGhhdCBhIHZhbGlkIHRlYW0gc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZAorICAgIC8vIGJ5IHRoZSBtYXN0ZXIgYW5kIHByb3BhZ2F0ZWQgdG8gYWxsIHdvcmtlciB0aHJlYWRzLgorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgdGhyZWFkLCBob3dldmVyLCBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIHRlYW0sIHNvIHdlIGNhbid0CisgICAgLy8gYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgdGVhbSBwb2ludGVyIGlzIG5vbi1udWxsLgorICAgIC8vCisgICAgdGVhbSA9IChrbXBfdGVhbV90ICopVENSX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSBOVUxMICk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKworIyBpZiBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorICAgIC8vIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLgorICAgIC8vIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcyB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICAgIC8vIFdlIGNhbm5vdCBtb2RpZnkgX19rbXBfZm9ya19jYWxsKCkgdG8gbG9vayBhdCB0aGUgZml4ZWQgSUNWcyBpbiB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCwgYmVjYXVzZSBpdCBpcworICAgIC8vIG5vdCBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkcyBhcnJheXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aGVuIF9fa21wX2ZvcmtfY2FsbCgpIGlzIGV4ZWN1dGVkLgorICAgIGlmICghIEtNUF9NQVNURVJfVElEKCB0aWQgKSApIHsgIC8vIG1hc3RlciB0aHJlYWQgYWxyZWFkeSBoYXMgSUNWcworICAgICAgICAvLyBDb3B5IHRoZSBpbml0aWFsIElDVnMgZnJvbSB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCB0byB0aGUgaW1wbGljaXQgdGFzayBmb3IgdGhpcyB0aWQuCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkKSBpcyBQVUxMaW5nIElDVnNcbiIsIGd0aWQsIHRpZCApKTsKKyAgICAgICAgbG9hZF9pY3ZzKCZ0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfZml4ZWRfaWN2cyk7CisgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggdGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdLCB0ZWFtLCB0aWQsIEZBTFNFICk7CisgICAgICAgIHN0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywgJnRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgc3luY19pY3ZzKCk7CisgICAgfQorIyBlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmMoIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgfQorCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfaW50ZWwgKSB7CisjZW5kaWYKKyNpZiBLTVBfTUlDCisgICAgICAgIC8vCisgICAgICAgIC8vIENhbGwgZHluYW1pYyBhZmZpbml0eSBzZXR0aW5ncworICAgICAgICAvLworICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCAmJiB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkICkgeworICAgICAgICAgICAgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkoIHRpZCwgdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB9CisgICAgZWxzZSBpZiAoICggcHJvY19iaW5kICE9IHByb2NfYmluZF9mYWxzZSApCisgICAgICAgICAgICAgICYmICggcHJvY19iaW5kICE9IHByb2NfYmluZF9kaXNhYmxlZCApKSB7CisgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX25ld19wbGFjZSA9PSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCBhbHJlYWR5IGluIGNvcnJlY3QgcGxhY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZSggZ3RpZCApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgaWYgKCAhS01QX01BU1RFUl9USUQoIHRpZCApICkgeworICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOyAvLyBnZXQgY29ycmVjdCBiYXJyaWVyIG9iamVjdAorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOyAgIC8vIHdvcmtlcnMgY2FsbCBhY3F1aXJlZAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocHJlcGFyZSBjYWxsZWQgaW5zaWRlIGJhcnJpZXJfcmVsZWFzZSkKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nXG4iLAorICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQgKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqCitfX2ttcF9sYXVuY2hfdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGd0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworLyogICAgdm9pZCAgICAgICAgICAgICAgICAgKnN0YWNrX2RhdGE7Ki8KKyAgICBrbXBfdGVhbV90ICooKnZvbGF0aWxlIHB0ZWFtKTsKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIHN0YXJ0XG4iLCBndGlkICkgKTsKKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2NvbnMgPSBfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBndGlkICk7ICAvLyBBVFQ6IE1lbW9yeSBsZWFrPworICAgIH0KKworICAgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRocmVhZHMgd2FpdCBmb3Igd29yayAqLworICAgIHdoaWxlKCAhIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09IF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAvKiB3YWl0IGZvciB3b3JrIHRvIGRvICovCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIHdhaXRpbmcgZm9yIHdvcmtcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgLyogTm8gdGlkIHlldCBzaW5jZSBub3QgcGFydCBvZiBhIHRlYW0gKi8KKyAgICAgICAgX19rbXBfZm9ya19iYXJyaWVyKCBndGlkLCBLTVBfR1RJRF9ETkUgKTsKKworICAgICAgICBwdGVhbSA9IChrbXBfdGVhbV90ICooKikpKCYgdGhpc190aHItPnRoLnRoX3RlYW0pOworCisgICAgICAgIC8qIGhhdmUgd2UgYmVlbiBhbGxvY2F0ZWQ/ICovCisgICAgICAgIGlmICggVENSX1NZTkNfUFRSKCpwdGVhbSkgJiYgIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgICAgICAvKiB3ZSB3ZXJlIGp1c3Qgd29rZW4gdXAsIHNvIHJ1biBvdXIgbmV3IHRhc2sgKi8KKyAgICAgICAgICAgIGlmICggVENSX1NZTkNfUFRSKCgqcHRlYW0pLT50LnRfcGtmbikgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpbnQgcmM7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgKCpwdGVhbSktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgKCpwdGVhbSktPnQudF9wa2ZuICkpOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmICgqcHRlYW0pLT50LnRfZnBfY29udHJvbF9zYXZlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCAmKCpwdGVhbSktPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9sb2FkX214Y3NyKCAmKCpwdGVhbSktPnQudF9teGNzciApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgICAgICAgICByYyA9ICgqcHRlYW0pIC0+IHQudF9pbnZva2UoIGd0aWQgKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCByYyApOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCAoKnB0ZWFtKS0+dC50X3BrZm4gKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGpvaW4gYmFycmllciBhZnRlciBwYXJhbGxlbCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2pvaW5fYmFycmllciggZ3RpZCApOworICAgICAgICB9CisgICAgfQorICAgIFRDUl9TWU5DX1BUUihfX2ttcF9nbG9iYWwuZy5nX2RvbmUpOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpZiAoIFRDUl9QVFIoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gKSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0oIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyICk7CisgICAgfQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAvKiBydW4gdGhlIGRlc3RydWN0b3JzIGZvciB0aGUgdGhyZWFkcHJpdmF0ZSBkYXRhIGZvciB0aGlzIHRocmVhZCAqLworICAgIF9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQoIGd0aWQgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIGRvbmVcbiIsIGd0aWQgKSApOworICAgIEtNUF9NQigpOworICAgIHJldHVybiB0aGlzX3RocjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkICpzcGVjaWZpY19ndGlkICkKK3sKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6ICA4MTAgKSAvLyBjb252ZXJzaW9uIGZyb20gInZvaWQgKiIgdG8gImludCIgbWF5IGxvc2Ugc2lnbmlmaWNhbnQgYml0cworICAgICNlbmRpZgorICAgIC8vIE1ha2Ugc3VyZSBubyBzaWduaWZpY2FudCBiaXRzIGFyZSBsb3N0CisgICAgaW50IGd0aWQgPSAoa21wX2ludHB0cl90KXNwZWNpZmljX2d0aWQgLSAxOworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAjZW5kaWYKKworICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdDogVCMlZFxuIiwgZ3RpZCkpOworICAgIC8qIE5PVEU6IHRoZSBndGlkIGlzIHN0b3JlZCBhcyBnaXRkKzEgaW4gdGhlIHRocmVhZC1sb2NhbC1zdG9yYWdlCisgICAgICogdGhpcyBpcyBiZWNhdXNlIDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBub3RoaW5nLXN0b3JlZCBjYXNlICovCisKKyAgICAvKiBqb3NoOiBPbmUgcmVhc29uIGZvciBzZXR0aW5nIHRoZSBndGlkIHNwZWNpZmljIGRhdGEgZXZlbiB3aGVuIGl0IGlzIGJlaW5nCisgICAgICAgZGVzdHJveWVkIGJ5IHB0aHJlYWQgaXMgdG8gYWxsb3cgZ3RpZCBsb29rdXAgdGhyb3VnaCB0aHJlYWQgc3BlY2lmaWMgZGF0YQorICAgICAgIChfX2ttcF9ndGlkX2dldF9zcGVjaWZpYykuICBTb21lIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5IHN0YXQgY29kZSwKKyAgICAgICB0aGF0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGNhbGwgdG8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCwgYWN0dWFsbHkKKyAgICAgICBnZXRzIHRoZSBndGlkIHRocm91Z2ggdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLiAgU2V0dGluZyBpdCBoZXJlIHNlZW1zCisgICAgICAgcmF0aGVyIGluZWxlZ2FudCBhbmQgcGVyaGFwcyB3cm9uZywgYnV0IGFsbG93cyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgdG8gcnVuIHNtb290aGx5LgorICAgICAgIHRvZG86IGdldCByaWQgb2YgdGhpcyBhZnRlciB3ZSByZW1vdmUgdGhlIGRlcGVuZGVuY2Ugb24KKyAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYworICAgICovCisgICAgaWYoZ3RpZCA+PSAwICYmIEtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGd0aWQgKTsKK30KKworI2lmIEtNUF9PU19VTklYICYmIEdVSURFRExMX0VYUE9SVFMKKworLy8gMjAwOS0wOS0wOCAobGV2KTogSXQgbG9va3MgdGhlIGRlc3RydWN0b3IgZG9lcyBub3Qgd29yay4gSW4gc2ltcGxlIHRlc3QgY2FzZXMgZGVzdHJ1Y3RvcnMgd29yaworLy8gcGVyZmVjdGx5LCBidXQgaW4gcmVhbCBsaWJpb21wNS5zbyBJIGhhdmUgbm8gZXZpZGVuY2UgaXQgaXMgZXZlciBjYWxsZWQuIEhvd2V2ZXIsIC1maW5pIGxpbmtlcgorLy8gb3B0aW9uIGluIG1ha2VmaWxlLm1rIHdvcmtzIGZpbmUuCisKK19fYXR0cmlidXRlX18oKCBkZXN0cnVjdG9yICkpCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCisjZW5kaWYKKworLyogW1dpbmRvd3NdIGpvc2g6IHdoZW4gdGhlIGF0ZXhpdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGFsaXZlICovCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICkKK3sKKyAgICBLQV9UUkFDRSggMzAsICggIl9fa21wX2ludGVybmFsX2VuZF9hdGV4aXRcbiIgKSApOworICAgIC8qIFtXaW5kb3dzXQorICAgICAgIGpvc2g6IGlkZWFsbHksIHdlIHdhbnQgdG8gY29tcGxldGVseSBzaHV0ZG93biB0aGUgbGlicmFyeSBpbiB0aGlzIGF0ZXhpdCBoYW5kbGVyLCBidXQKKyAgICAgICBzdGF0IGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRocmVhZCBzcGVjaWZpYyBkYXRhIGZvciBndGlkIGZhaWxzIGJlY2F1c2UgdGhhdCBkYXRhIGJlY29tZXMKKyAgICAgICB1bmF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGR1cmluZyB0aGUgc2h1dGRvd24sIHNvIHdlIGNhbGwgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorICAgICAgIGluc3RlYWQuICBXZSBzaG91bGQgZXZlbnR1YWxseSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgaW4gdGhlCisgICAgICAgc3RhdCBjb2RlIGFuZCB1c2UgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgbGlicmFyeS4KKworLy8gVE9ETzogQ2FuIHNvbWUgb2YgdGhpcyBjb21tZW50IGFib3V0IEdWUyBiZSByZW1vdmVkPworICAgICAgIEkgc3VzcGVjdCB0aGF0IHRoZSBvZmZlbmRpbmcgc3RhdCBjb2RlIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIHRyaWVzIHRvCisgICAgICAgY2xlYW4gdXAgYSBkZWFkIHJvb3QgdGhyZWFkJ3MgZGF0YSBzdHJ1Y3R1cmVzLCByZXN1bHRpbmcgaW4gR1ZTIGNvZGUgdHJ5aW5nIHRvIGNsb3NlCisgICAgICAgdGhlIEdWUyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHRocmVhZCwgYnV0IHNpbmNlIHRoZSBzdGF0IGNvZGUgdXNlcworICAgICAgIF9fa21wX2dldF9zcGVjaWZpY19ndGlkIHRvIGdldCB0aGUgZ3RpZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIGlzCisgICAgICAgY2xlYW5pbmcgdXAgaXRzZWxmIGluc3RlYWQgb2YgYW5vdGhlciB0aHJlYWQsIGl0IGdldHMgY29uZnVzZWQuICBUaGlzIGhhcHBlbnMgYmVjYXVzZQorICAgICAgIGFsbG93aW5nIGEgdGhyZWFkIHRvIHVucmVnaXN0ZXIgYW5kIGNsZWFudXAgYW5vdGhlciB0aHJlYWQgaXMgYSByZWNlbnQgbW9kaWZpY2F0aW9uIGZvcgorICAgICAgIGFkZHJlc3NpbmcgYW4gaXNzdWUgd2l0aCBNYXhvbiBDaW5lbWE0RC4gIEJhc2VkIG9uIHRoZSBjdXJyZW50IGRlc2lnbiAoMjAwNTA3MjIpLCBhCisgICAgICAgdGhyZWFkIG1heSBlbmQgdXAgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgYW5vdGhlciB0aHJlYWQgb25seSBpZiB0aHJlYWQgZGVhdGggZG9lcyBub3QKKyAgICAgICB0cmlnZ2VyIHRoZSBjYWxsaW5nIG9mIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQuICBGb3IgTGludXgqIE9TLCB0aGVyZSBpcyB0aGUgdGhyZWFkCisgICAgICAgc3BlY2lmaWMgZGF0YSBkZXN0cnVjdG9yIGZ1bmN0aW9uIHRvIGRldGVjdCB0aHJlYWQgZGVhdGguICBGb3IgV2luZG93cyBkeW5hbWljLCB0aGVyZQorICAgICAgIGlzIERsbE1haW4oVEhSRUFEX0RFVEFDSCkuICBGb3IgV2luZG93cyBzdGF0aWMsIHRoZXJlIGlzIG5vdGhpbmcuICBUaHVzLCB0aGUKKyAgICAgICB3b3JrYXJvdW5kIGlzIGFwcGxpY2FibGUgb25seSBmb3IgV2luZG93cyBzdGF0aWMgc3RhdCBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIC0xICk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYXBfdGhyZWFkKAorICAgIGttcF9pbmZvX3QgKiB0aHJlYWQsCisgICAgaW50IGlzX3Jvb3QKKykgeworCisgICAgLy8gSXQgaXMgYXNzdW1lZCBfX2ttcF9mb3Jram9pbl9sb2NrIGlzIGFjcXVpcmVkLgorCisgICAgaW50IGd0aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgIT0gTlVMTCApOworCisgICAgZ3RpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworCisgICAgaWYgKCAhIGlzX3Jvb3QgKSB7CisKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIC8qIEFzc3VtZSB0aGUgdGhyZWFkcyBhcmUgYXQgdGhlIGZvcmsgYmFycmllciBoZXJlICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVhcF90aHJlYWQ6IHJlbGVhc2luZyBUIyVkIGZyb20gZm9yayBiYXJyaWVyIGZvciByZWFwXG4iLCBndGlkICkgKTsKKyAgICAgICAgICAgIC8qIE5lZWQgcmVsZWFzZSBmZW5jZSBoZXJlIHRvIHByZXZlbnQgc2VnIGZhdWx0cyBmb3IgdHJlZSBmb3Jram9pbiBiYXJyaWVyIChHRUgpICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlKAorICAgICAgICAgICAgICAgIHRocmVhZCwKKyAgICAgICAgICAgICAgICAmdGhyZWFkLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2dvLAorICAgICAgICAgICAgICAgIGttcF9yZWxlYXNlX2ZlbmNlCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorCisKKyAgICAgICAgLy8gVGVybWluYXRlIE9TIHRocmVhZC4KKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXIoIHRocmVhZCApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB0aHJlYWQgd2FzIGtpbGxlZCBhc3luY2hyb25vdXNseS4gIElmIGl0IHdhcyBhY3RpdmVseQorICAgICAgICAvLyBzcGlubmluZyBpbiB0aGUgaW4gdGhlIHRocmVhZCBwb29sLCBkZWNyZW1lbnQgdGhlIGdsb2JhbCBjb3VudC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCB0aW1pbmcgaG9sZSBoZXJlIC0gaWYgdGhlIHdvcmtlciB0aHJlYWQgd2FzCisgICAgICAgIC8vIGp1c3Qgd2FraW5nIHVwIGFmdGVyIHNsZWVwaW5nIGluIHRoZSBwb29sLCBoYWQgcmVzZXQgaXQncworICAgICAgICAvLyB0aF9hY3RpdmVfaW5fcG9vbCBmbGFnIGJ1dCBub3QgZGVjcmVtZW50ZWQgdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgIC8vIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggeWV0LCB0aGVuIHRoZSBnbG9iYWwgY291bnRlcgorICAgICAgICAvLyBtaWdodCBub3QgZ2V0IHVwZGF0ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEN1cnJlbnRseSwgdGhpcyBjYW4gb25seSBoYXBwZW4gYXMgdGhlIGxpYnJhcnkgaXMgdW5sb2FkZWQsCisgICAgICAgIC8vIHNvIHRoZXJlIGFyZSBubyBoYXJtZnVsIHNpZGUgZWZmZWN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2FjdGl2ZV9pbl9wb29sICkgeworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigKKyAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVjcmVtZW50ICMgb2YgW3dvcmtlcl0gdGhyZWFkcyBpbiB0aGUgcG9vbC4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfbnRoID4gMCApOworICAgICAgICAtLV9fa21wX3RocmVhZF9wb29sX250aDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRnJlZSB0aGUgZmFzdCBtZW1vcnkgZm9yIHRhc2tpbmcKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIHRocmVhZCApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCggdGhyZWFkICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0gPT0gdGhyZWFkICk7CisgICAgVENXX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0sIE5VTEwpOworCisgICAgLS0gX19rbXBfYWxsX250aDsKKyAgICAvLyBfX2ttcF9udGggd2FzIGRlY3JlbWVudGVkIHdoZW4gdGhyZWFkIGlzIGFkZGVkIHRvIHRoZSBwb29sLgorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPD0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogZnJlZSB0aGUgbWVtb3J5IGJlaW5nIHVzZWQgKi8KKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfY29ucyApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdGhyZWFkLT50aC50aF9jb25zICk7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2NvbnMgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgIH0KKworICAgIGlmICggdGhyZWFkLT50aC50aF9wcmlfY29tbW9uICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiApOworICAgICAgICB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gPSBOVUxMOworICAgIH07IC8vIGlmCisKKyAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZpbmFsaXplX2JnZXQoIHRocmVhZCApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRSggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICk7CisgICAgICAgIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayA9IE5VTEw7CisgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yZWFwX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0gTlVMTDsKKyAgICBfX2ttcF9mcmVlKCB0aHJlYWQgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX3JlYXBfdGhyZWFkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpcnN0LCB1bnJlZ2lzdGVyIHRoZSBsaWJyYXJ5ICovCisgICAgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCk7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogSW4gV2luIHN0YXRpYyBsaWJyYXJ5LCB3ZSBjYW4ndCB0ZWxsIHdoZW4gYSByb290IGFjdHVhbGx5IGRpZXMsIHNvIHdlCisgICAgICAgICAgIHJlY2xhaW0gdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IHJvb3QgdGhyZWFkcyB0aGF0IGhhdmUgZGllZCBidXQgbm90CisgICAgICAgICAgIHVucmVnaXN0ZXJlZCB0aGVtc2VsdmVzLCBpbiBvcmRlciB0byBzaHV0IGRvd24gY2xlYW5seS4KKyAgICAgICAgICAgSW4gV2luIGR5bmFtaWMgbGlicmFyeSB3ZSBhbHNvIGNhbid0IHRlbGwgd2hlbiBhIHRocmVhZCBkaWVzLgorICAgICAgICAqLworICAgICAgICBfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHMoKTsgLy8gQUM6IG1vdmVkIGhlcmUgdG8gYWx3YXlzIGNsZWFuIHJlc291cmNlcyBvZiBkZWFkIHJvb3RzCisgICAgI2VuZGlmCisKKyAgICBmb3IoIGk9MCA7IGk8X19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGkrKyApCisgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkKKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldIC0+IHIucl9hY3RpdmUgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKworICAgIGlmICggaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKSB7CisgICAgICAgIC8vIDIwMDktMDktMDggKGxldik6IE90aGVyIGFsaXZlIHJvb3RzIGZvdW5kLiBXaHkgZG8gd2Uga2lsbCB0aGUgbW9uaXRvcj8/CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgdGhhdCBtb25pdG9yIHdhcyBpbml0aWFsaXplZCBiZWZvcmUgcmVhcGluZyBpdC4KKyAgICAgICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBmb3JtIF9fa21wX2F0Zm9ya19jaGlsZCAod2hpY2ggc2V0cworICAgICAgICAvLyBfX2ttcF9pbml0X3BhcmFsbGVsID0gMCksIHRoZW4gX19rbXBfbW9uaXRvciB3aWxsIGFwcGVhciB0bworICAgICAgICAvLyBjb250YWluIHZhbGlkIGRhdGEsIGJ1dCBpdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBwYXJlbnQgcHJvY2VzcywKKyAgICAgICAgLy8gbm90IHRoZSBjaGlsZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT25lIG9mIHRoZSBwb3NzaWJsZSBmaXhlcyBmb3IgQ1ExMzg0MzQgLyBDUTE0MDEyNgorICAgICAgICAvLyAodXNlZCBpbiAyMDA5MTEwM19kcmVhbXdvcmtzIHBhdGNoKQorICAgICAgICAvLworICAgICAgICAvLyBOZXcgYmVoYXZpb3IgKDIwMTAwOCk6IGluc3RlYWQgb2Yga2V5aW5nIG9mZiBvZiB0aGUgZmxhZworICAgICAgICAvLyBfX2ttcF9pbml0X3BhcmFsbGVsLCB0aGUgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gaXMga2V5ZWQgb2ZmCisgICAgICAgIC8vIG9mIHRoZSBuZXcgZmxhZyBfX2ttcF9pbml0X21vbml0b3IuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gY2xlYW51cCBjb2RlICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHByb3Blcmx5IGVuZGVkICovCisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtpXSApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggISBLTVBfVUJFUl9HVElEKCBpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggISBfX2ttcF9yb290W2ldIC0+IHIucl9hY3RpdmUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vIFJlYXAgdGhlIHdvcmtlciB0aHJlYWRzLgorICAgICAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBub3csIGJ1dCBiZSBjYXJlZnVsIGlmIHRocmVhZHMgYXJlIHJlYXBlZCBzb29uZXIuCisgICAgICAgIHdoaWxlICggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApIHsgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGhyZWFkIGluIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHRocmVhZCBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX2luZm9fdCAqIHRocmVhZCA9IChrbXBfaW5mb190ICopIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgICAgIC8vIFJlYXAgaXQuCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGhyZWFkKCB0aHJlYWQsIDAgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworICAgICAgICAvLyBSZWFwIHRlYW1zLgorICAgICAgICB3aGlsZSAoIF9fa21wX3RlYW1fcG9vbCAhPSBOVUxMICkgeyAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGVhbXMgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGVhbSBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX3RlYW1fdCAqIHRlYW0gPSAoa21wX3RlYW1fdCAqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfcmVhcF90ZWFtKCB0ZWFtICk7CisgICAgICAgIH07IC8vIHdoaWxlCisKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoICk7CisgICAgICAgICNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFRCRDogQWRkIHNvbWUgY2hlY2tpbmcuLi4KKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBsaWtlIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZFsgaSBdID09IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBnZXQgcnVuIGJ5IGpvaW5pbmcgd2l0aCBhbGwgd29ya2VyCisgICAgICAgICAgIHRocmVhZHMgYmVmb3JlIHJlc2V0dGluZyB0aGlzIGZsYWcgKi8KKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IGFsbCB3b3JrZXJzIHJlYXBlZFxuIiApICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBwdXNoIGJvdGggY29kZSBmcmFnbWVudHMgZG93biBhbmQgQ1NFIHRoZW0/CisgICAgICAgIC8vIHB1c2ggdGhlbSBpbnRvIF9fa21wX2NsZWFudXAoKSA/CisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisKKyAgICB9IC8qIGVsc2UgIV9fa21wX2dsb2JhbC50X2FjdGl2ZSAqLworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisKKyAgICBfX2ttcF9jbGVhbnVwKCk7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZF9yZXEgKQoreworICAgIGludCBpOworCisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYWFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIGFuZCB3aGF0IHdlIHNob3VsZCBkbyAqLworICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSAoZ3RpZF9yZXE+PTApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgcmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSwgYnV0IHdlIG1heSBzdGlsbCBzaHV0ZG93biB0aGUgbGlicmFyeSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0gLT4gci5yX2FjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gLTE7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogcm9vdCBzdGlsbCBhY3RpdmUsIGFib3J0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IHVucmVnaXN0ZXJpbmcgc2libGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgICAgIF9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZCggZ3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogd29ya2VyIHRocmVhZHMgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiB0aHJvdWdoIHRoZSBhdGV4aXQgaGFuZGxlciwgaWYgdGhleSBjYWxsIGV4aXQoKSAqLworICAgICAgICAgICAgLyogRm9yIG5vdywgc2tpcCB0aGUgdXN1YWwgc3Vic2VxdWVudCBwcm9jZXNzaW5nIGFuZCBqdXN0IGR1bXAgdGhlIGRlYnVnIGJ1ZmZlci4KKyAgICAgICAgICAgICAgIFRPRE86IGRvIGEgdGhvcm91Z2ggc2h1dGRvd24gaW5zdGVhZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3luY2hyb25pemUgdGhlIHRlcm1pbmF0aW9uIHByb2Nlc3MgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0aGlzIGxvY2sgdG8gZW5mb3JjZSBtdXRleCBiZXR3ZWVuIHRoaXMgcmVhZGluZyBvZgorICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgYW5kIHRoZSB3cml0aW5nIGJ5IF9fa21wX3JlZ2lzdGVyX3Jvb3QuCisgICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHVzZSBhIGNvdW50ZXIgb2Ygcm9vdHMgdGhhdCBpcworICAgICAgIGF0b21pY2FsbHkgdXBkYXRlZCBieSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcsCisgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgYW5kIF9fa21wX2ludGVybmFsX2VuZF8qLgorICAgICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgIC8qIG5vdyB3ZSBjYW4gc2FmZWx5IGNvbmR1Y3QgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbiAqLworICAgIF9fa21wX2ludGVybmFsX2VuZCgpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBleGl0XG4iICkgKTsKKworICAgICNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAjZW5kaWYKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF9jbG9zZV9jb25zb2xlKCk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9maW5pX2FsbG9jYXRvcigpOworCit9IC8vIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGludCBndGlkX3JlcSApCit7CisgICAgaW50IGk7CisKKyAgICAvKiBpZiB3ZSBoYXZlIGFscmVhZHkgY2xlYW5lZCB1cCwgZG9uJ3QgdHJ5IGFnYWluLCBpdCB3b3VsZG4ndCBiZSBwcmV0dHkgKi8KKyAgICAvKiB0aGlzIHNob3VsZG4ndCBiZSBhIHJhY2UgY29uZGl0aW9uIGJlY2F1c2UgX19rbXBfaW50ZXJuYWxfZW5kKCkgaXMgdGhlCisgICAgICogb25seSBwbGFjZSB0byBjbGVhciBfX2ttcF9zZXJpYWxfaW5pdCAqLworICAgIC8qIHdlJ2xsIGNoZWNrIHRoaXMgbGF0ZXIgdG9vLCBhZnRlciB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICAvLyAyMDA5LTA5LTA2OiBXZSBkbyBub3Qgc2V0IGdfYWJvcnQgd2l0aG91dCBzZXR0aW5nIGdfZG9uZS4gVGhpcyBjaGVjayBsb29rcyByZWR1bmRhbnQsCisgICAgLy8gYmVjYXVzZSB0aGUgbmV4dCBjaGVjayB3aWxsIHdvcmsgaW4gYW55IGNhc2UuCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMSwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhbHJlYWR5IGZpbmlzaGVkXG4iICkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIGFuZCB3aGF0IHdlIHNob3VsZCBkbyAqLworICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSAoZ3RpZF9yZXE+PTApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZW50ZXIgVCMlZCAgKCVkKVxuIiwgZ3RpZCwgZ3RpZF9yZXEgKSk7CisgICAgICAgIGlmKCBndGlkID09IEtNUF9HVElEX1NIVVRET1dOICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6ICFfX2ttcF9pbml0X3J1bnRpbWUsIHN5c3RlbSBhbHJlYWR5IHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgcmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGd0aWQgbm90IHJlZ2lzdGVyZWQgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLyogd2UgZG9uJ3Qga25vdyB3aG8gd2UgYXJlICovCisgICAgICAgIH0gZWxzZSBpZiggS01QX1VCRVJfR1RJRCggZ3RpZCApKSB7CisgICAgICAgIC8qIHVucmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIHViZXIgdGhyZWFkLiAgZ3RpZCBpcyBubyBsb25nZXIgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2d0aWRdIC0+IHIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogcm9vdCBzdGlsbCBhY3RpdmUsIGFib3J0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBqdXN0IGEgd29ya2VyIHRocmVhZCwgbGV0J3MgbGVhdmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGlmICggZ3RpZCA+PSAwICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdW5yZWZfdGFza190ZWFtKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogd29ya2VyIHRocmVhZCBkb25lLCBleGl0aW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgI2lmIGRlZmluZWQgR1VJREVETExfRVhQT1JUUworICAgIC8vIEFDOiBsZXRzIG5vdCBzaHV0ZG93biB0aGUgTGludXgqIE9TIGR5bmFtaWMgbGlicmFyeSBhdCB0aGUgZXhpdCBvZiB1YmVyIHRocmVhZCwKKyAgICAvLyAgICAgYmVjYXVzZSB3ZSB3aWxsIGJldHRlciBzaHV0ZG93biBsYXRlciBpbiB0aGUgbGlicmFyeSBkZXN0cnVjdG9yLgorICAgIC8vICAgICBUaGUgcmVhc29uIG9mIHRoaXMgY2hhbmdlIGlzIHBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiBub24tb3Blbm1wIHRocmVhZAorICAgIC8vICAgICBpbiBhIGxvb3AgZm9ya3MgYW5kIGpvaW5zIG1hbnkgb3Blbm1wIHRocmVhZHMuIFdlIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUKKyAgICAvLyAgICAga2VlcGluZyB3b3JrZXIgdGhyZWFkcyBhbGl2ZSB1bnRpbCB0aGUgcHJvZ3JhbSBzaHV0ZG93bi4KKyAgICAvLyBPTTogUmVtb3ZlZCBMaW51eCogT1MgcmVzdHJpY3Rpb24gdG8gZml4IHRoZSBjcmFzaCBvbiBPUyBYKiAoRFBEMjAwMjM5OTY2KSBhbmQKKyAgICAvLyAgICAgV2luZG93cyhEUEQyMDAyODc0NDMpIHRoYXQgb2NjdXJzIHdoZW4gdXNpbmcgY3JpdGljYWwgc2VjdGlvbnMgZnJvbSBmb3JlaWduIHRocmVhZHMuCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0aW5nXG4iKSApOworICAgICAgICByZXR1cm47CisgICAgI2VuZGlmCisgICAgLyogc3luY2hyb25pemUgdGhlIHRlcm1pbmF0aW9uIHByb2Nlc3MgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKworICAgIC8qIHNob3VsZCB3ZSBmaW5pc2ggdGhlIHJ1bi10aW1lPyAgYXJlIGFsbCBzaWJsaW5ncyBkb25lPyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGkgKSB7CisgICAgICAgIGlmICggS01QX1VCRVJfR1RJRCggaSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHJlbWFpbmluZyBzaWJsaW5nIHRhc2s6IGd0aWQ9PSVkXG4iLCBpICkpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH07CisgICAgfQorCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0XG4iICkgKTsKKworICAgICNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKworc3RhdGljIGxvbmcgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgLy8gUmFuZG9tIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KK3N0YXRpYyBjaGFyICogX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworICAgIC8vIFZhbHVlIHRvIGJlIHNhdmVkIGluIGVudiB2YXIgX19LTVBfUkVHSVNURVJFRF9MSUJfPHBpZD4uCisKKworc3RhdGljIGlubGluZQorY2hhciAqCitfX2ttcF9yZWdfc3RhdHVzX25hbWUoKSB7CisgICAgLyoKKyAgICAgICAgT24gUkhFTCAzdTUgaWYgbGlua2VkIHN0YXRpY2FsbHksIGdldHBpZCgpIHJldHVybnMgZGlmZmVyZW50IHZhbHVlcyBpbiBlYWNoIHRocmVhZC4KKyAgICAgICAgSWYgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiBnbyBpbiBkaWZmZXJlbnQgdGhyZWFkcyAob21wX21pc2Nfb3RoZXJfcm9vdF9leGl0LmNwcCB0ZXN0IGNhc2UpLAorICAgICAgICB0aGUgbmFtZSBvZiByZWdpc3RlcmVkX2xpYl9lbnYgZW52IHZhciBjYW4gbm90IGJlIGZvdW5kLCBiZWNhdXNlIHRoZSBuYW1lIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgcGlkLgorICAgICovCisgICAgcmV0dXJuIF9fa21wX3N0cl9mb3JtYXQoICJfX0tNUF9SRUdJU1RFUkVEX0xJQl8lZCIsIChpbnQpIGdldHBpZCgpICk7Cit9IC8vIF9fa21wX3JlZ19zdGF0dXNfZ2V0CisKKwordm9pZAorX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKAorICAgIHZvaWQKKykgeworCisgICAgY2hhciAqIG5hbWUgICA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOyAgLy8gTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaW50ICAgIGRvbmUgICA9IDA7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZHRpbWU7CisgICAgICAgIGxvbmcgICBsdGltZTsKKyAgICB9IHRpbWU7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCAmIHRpbWUuZHRpbWUgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDB4Q0FGRTAwMDBMIHwgKCB0aW1lLmx0aW1lICYgMHgwMDAwRkZGRkwgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0KKyAgICAgICAgX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICIlcC0lbHgtJXMiLAorICAgICAgICAgICAgJiBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnLAorICAgICAgICAgICAgS01QX0xJQlJBUllfRklMRQorICAgICAgICApOworCisgICAgS0FfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXA6ICVzPVwiJXNcIlxuIiwgbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApICk7CisKKyAgICB3aGlsZSAoICEgZG9uZSApIHsKKworICAgICAgICBjaGFyICogdmFsdWUgID0gTlVMTDsgLy8gQWN0dWFsIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGJ1dCBkbyBub3Qgb3ZlcndyaXRlIGlmIGl0IGlzIGV4aXN0LgorICAgICAgICBfX2ttcF9lbnZfc2V0KCBuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyLCAwICk7CisgICAgICAgIC8vIENoZWNrIHRoZSB2YXJpYWJsZSBpcyB3cml0dGVuLgorICAgICAgICB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICYmIHN0cmNtcCggdmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSA9PSAwICkgeworCisgICAgICAgICAgICBkb25lID0gMTsgICAgLy8gT2ssIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBzdWNjZXNzZnVsbHksIGV4aXQgdGhlIGxvb3AuCisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gT29wcy4gV3JpdGUgZmFpbGVkLiBBbm90aGVyIGNvcHkgb2YgT3Blbk1QIFJUTCBpcyBpbiBtZW1vcnkuCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0IGFsaXZlIG9yIGRlYWQuCisgICAgICAgICAgICBpbnQgICAgbmVpZ2hib3IgPSAwOyAvLyAwIC0tIHVua25vd24gc3RhdHVzLCAxIC0tIGFsaXZlLCAyIC0tIGRlYWQuCisgICAgICAgICAgICBjaGFyICogdGFpbCAgICAgICAgICA9IHZhbHVlOworICAgICAgICAgICAgY2hhciAqIGZsYWdfYWRkcl9zdHIgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqIGZsYWdfdmFsX3N0ciAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGZpbGVfbmFtZSAgICAgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ19hZGRyX3N0ciwgJiB0YWlsICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICctJywgJiBmbGFnX3ZhbF9zdHIsICAmIHRhaWwgKTsKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IHRhaWw7CisgICAgICAgICAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBsb25nICogZmxhZ19hZGRyID0gMDsKKyAgICAgICAgICAgICAgICBsb25nICAgZmxhZ192YWwgID0gMDsKKyAgICAgICAgICAgICAgICBzc2NhbmYoIGZsYWdfYWRkcl9zdHIsICIlcCIsICAmIGZsYWdfYWRkciApOworICAgICAgICAgICAgICAgIHNzY2FuZiggZmxhZ192YWxfc3RyLCAgIiVseCIsICYgZmxhZ192YWwgICk7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnX2FkZHIgIT0gMCAmJiBmbGFnX3ZhbCAhPSAwICYmIHN0cmNtcCggZmlsZV9uYW1lLCAiIiApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayB3aGV0aGVyIGVudmlyb25tZW50LWVuY29kZWQgYWRkcmVzcyBpcyBtYXBwZWQgaW50byBhZGRyIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgZGVyZWZlcmVuY2UgaXQgdG8gc2VlIGlmIGl0IHN0aWxsIGhhcyB0aGUgcmlnaHQgdmFsdWUuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggZmxhZ19hZGRyICkgJiYgKiBmbGFnX2FkZHIgPT0gZmxhZ192YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZW4gd2Uga25vdyB0aGUgb3RoZXIgY29weSBvZiB0aGUgbGlicmFyeSBpcyBubyBsb25nZXIgcnVubmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHN3aXRjaCAoIG5laWdoYm9yICkgeworICAgICAgICAgICAgICAgIGNhc2UgMCA6ICAgICAgLy8gQ2Fubm90IHBhcnNlIGVudmlyb25tZW50IHZhcmlhYmxlIC0tIG5laWdoYm9yIHN0YXR1cyB1bmtub3duLgorICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgaXQgaXMgdGhlIGluY29tcGF0aWJsZSBmb3JtYXQgb2YgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgb3RoZXIgbGlicmFyeSBpcyBhbGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTiggLi4uICk7IC8vIFRPRE86IElzc3VlIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gInVua25vd24gbGlicmFyeSI7CisgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVudGlvbiEgRmFsbGluZyB0byB0aGUgbmV4dCBjYXNlLiBUaGF0J3MgaW50ZW50aW9uYWwuCisgICAgICAgICAgICAgICAgY2FzZSAxIDogeyAgICAvLyBOZWlnaGJvciBpcyBhbGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaXQgaXMgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIGR1cGxpY2F0ZV9vayA9IF9fa21wX2Vudl9nZXQoICJLTVBfRFVQTElDQVRFX0xJQl9PSyIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhIF9fa21wX3N0cl9tYXRjaF90cnVlKCBkdXBsaWNhdGVfb2sgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQncyBub3QgYWxsb3dlZC4gSXNzdWUgZmF0YWwgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIER1cGxpY2F0ZUxpYnJhcnksIEtNUF9MSUJSQVJZX0ZJTEUsIGZpbGVfbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIER1cGxpY2F0ZUxpYnJhcnkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGR1cGxpY2F0ZV9vayApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxOyAgICAvLyBFeGl0IHRoZSBsb29wLgorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDogeyAgICAvLyBOZWlnaGJvciBpcyBkZWFkLgorICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdmFyaWFibGUgYW5kIHRyeSB0byByZWdpc3RlciBsaWJyYXJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9lbnZfdW5zZXQoIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9ICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH07IC8vIHN3aXRjaAorCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworCisgICAgfTsgLy8gd2hpbGUKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbmFtZSApOworCit9IC8vIGZ1bmMgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwCisKKwordm9pZAorX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCB2b2lkICkgeworCisgICAgY2hhciAqIG5hbWUgID0gX19rbXBfcmVnX3N0YXR1c19uYW1lKCk7CisgICAgY2hhciAqIHZhbHVlID0gX19rbXBfZW52X2dldCggbmFtZSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgIT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgICE9IE5VTEwgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgJiYgc3RyY21wKCB2YWx1ZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApID09IDAgKSB7CisgICAgICAgIC8vIE9rLCB0aGlzIGlzIG91ciB2YXJpYWJsZS4gRGVsZXRlIGl0LgorICAgICAgICBfX2ttcF9lbnZfdW5zZXQoIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggdmFsdWUgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggbmFtZSApOworCisgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgID0gTlVMTDsKKworfSAvLyBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkKKworCisvLyBFbmQgb2YgTGlicmFyeSByZWdpc3RyYXRpb24gc3R1ZmYuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IGksIGd0aWQ7CisgICAgaW50IHNpemU7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfc2VyaWFsX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQzMiApID09IDQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF91aW50NjQgKSA9PSA4ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50cHRyX3QgKSA9PSBzaXplb2YoIHZvaWQgKiApICk7CisKKyAgICBfX2ttcF92YWxpZGF0ZV9sb2NrcygpOworCisgICAgLyogSW5pdGlhbGl6ZSBpbnRlcm5hbCBtZW1vcnkgYWxsb2NhdG9yICovCisgICAgX19rbXBfaW5pdF9hbGxvY2F0b3IoKTsKKworICAgIC8qIFJlZ2lzdGVyIHRoZSBsaWJyYXJ5IHN0YXJ0dXAgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgYW5kIGNoZWNrIHRvIHNlZSB3aGV0aGVyIGFub3RoZXIgY29weSBvZiB0aGUgbGlicmFyeSBpcyBhbHJlYWR5CisgICAgICAgcmVnaXN0ZXJlZC4gKi8KKworICAgIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCggKTsKKworICAgIC8qIFRPRE8gcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5ICovCisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiByZWluaXRpYWxpemF0aW9uIG9mIGxpYnJhcnlcbiIgKSApOworICAgIH0KKworICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAwOworICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBGQUxTRSk7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBsb2NrcyAqLworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF9pbml0X3NwZWN1bGF0aXZlX3N0YXRzKCk7CisjZW5kaWYKKyNlbmRpZgorICAgIF9fa21wX2luaXRfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggJiBfX2ttcF9kaXNwYXRjaF9sb2NrICk7CisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2RlYnVnX2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2sgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOHIgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184YyAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZyICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9mb3Jram9pbl9sb2NrICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICAgICAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayAgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF90cF9jYWNoZWRfbG9jayApOworCisgICAgLyogY29uZHVjdCBpbml0aWFsaXphdGlvbiBhbmQgaW5pdGlhbCBzZXR1cCBvZiBjb25maWd1cmF0aW9uICovCisKKyAgICBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoKTsKKworICAgIC8vIFNvbWUgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIG1vdmVkIGhlcmUgZnJvbSBrbXBfZW52X2luaXRpYWxpemUoKQorI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9kaWFnID0gMDsKKyNlbmRpZgorICAgIF9fa21wX2Fib3J0X2RlbGF5ID0gMDsKKworICAgIC8vIEZyb20gX19rbXBfaW5pdF9kZmx0X3RlYW1fbnRoKCkKKyAgICAvKiBhc3N1bWUgdGhlIGVudGlyZSBtYWNoaW5lIHdpbGwgYmUgdXNlZCAqLworICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF94cHJvYzsKKyAgICBpZiggX19rbXBfZGZsdF90ZWFtX250aF91YiA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gS01QX01JTl9OVEg7CisgICAgfQorICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID4gX19rbXBfc3lzX21heF9udGggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICB9CisgICAgX19rbXBfbWF4X250aCA9IF9fa21wX3N5c19tYXhfbnRoOworCisgICAgLy8gVGhyZWUgdmFycyBiZWxvdyBtb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSAiS01QX0JMT0NLVElNRSIgcGFydAorICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX0RFRkFVTFRfQkxPQ0tUSU1FOworICAgIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9IEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIC8vIEZyb20gIktNUF9MSUJSQVJZIiBwYXJ0IG9mIF9fa21wX2Vudl9pbml0aWFsaXplKCkKKyAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgIC8vIEZyb20gS01QX1NDSEVEVUxFIGluaXRpYWxpemF0aW9uCisgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ7CisgICAgLy8gQUM6IGRvIG5vdCB1c2UgYW5hbHl0aWNhbCBoZXJlLCBiZWNhdXNlIGl0IGlzIG5vbi1tb25vdG9ub3VzCisgICAgLy9fX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvL19fa21wX2F1dG8gPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7IC8vIEFDOiBpdCBpcyB0aGUgZGVmYXVsdCwgbm8gbmVlZCB0byByZXBlYXRlIGFzc2lnbm1lbnQKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAvLyBCYXJyaWVyIGluaXRpYWxpemF0aW9uLiBNb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSBCYXJyaWVyIGJyYW5jaCBiaXQgY29udHJvbCBhbmQgYmFycmllciBtZXRob2QKKyAgICAvLyBjb250cm9sIHBhcnRzCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYiAoKGludCkxKQorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiICgoaW50KTEpCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQgYnBfaHlwZXJfYmFyCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0IGJwX2h5cGVyX2JhcgorICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIGZvciAoIGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0gPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQ7CisgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBpZiggaSA9PSBic19yZWR1Y3Rpb25fYmFycmllciApIHsgLy8gdGVzdGVkIGFuZCBjb25maXJtZWQgb24gQUxUSVggb25seSAoIGxpbl82NCApOiBoeXBlciwxCisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmI7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0OworICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdDsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICB9CisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0CisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYgorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYgorICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNpZiBLTVBfTUlDCisgICAgICAgIC8vIEFDOiBwbGFuZT0zLDIsIGZvcmtqb2luPTIsMSBhcmUgb3B0aW1hbCBmb3IgMjQwIHRocmVhZHMgb24gS05DCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgMCBdID0gMzsgIC8vIHBsYW5lIGdhdGhlcgorICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIDEgXSA9IDE7ICAvLyBmb3Jram9pbiByZWxlYXNlCisgICAgI2VuZGlmCisKKyAgICAvLyBGcm9tIEtNUF9DSEVDS1MgaW5pdGlhbGl6YXRpb24KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9lbnZfY2hlY2tzID0gVFJVRTsgICAvKiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbHNlCisgICAgX19rbXBfZW52X2NoZWNrcyA9IEZBTFNFOyAgLyogcG9ydCB2ZXJzaW9ucyBkbyBub3QgaGF2ZSB0aGUgZXh0cmEgY2hlY2tzICovCisjZW5kaWYKKworICAgIC8vIEZyb20gIktNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURSIgaW5pdGlhbGl6YXRpb24KKyAgICBfX2ttcF9mb3JlaWduX3RwID0gVFJVRTsKKworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyA9IEZBTFNFOworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19kZWZhdWx0OworCisgICAgX19rbXBfZW52X2luaXRpYWxpemUoIE5VTEwgKTsKKyAgICAvLyBQcmludCBhbGwgbWVzc2FnZXMgaW4gbWVzc2FnZSBjYXRhbG9nIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbCA9IF9fa21wX2Vudl9nZXQoICJLTVBfRFVNUF9DQVRBTE9HIiApOworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaF90cnVlKCB2YWwgKSApIHsKKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAgICAgX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coICYgYnVmZmVyICk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfZW52X2ZyZWUoICYgdmFsICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgLy8gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgIktNUF9BTExfVEhSRUFEUFJJVkFURSIgcGFydAorICAgIF9fa21wX3RwX2NhcGFjaXR5ID0gX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eShfX2ttcF9kZmx0X3RlYW1fbnRoX3ViLCBfX2ttcF9tYXhfbnRoLCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkKTsKKworCisgICAgLy8gSWYgdGhlIGxpYnJhcnkgaXMgc2h1dCBkb3duIHByb3Blcmx5LCBib3RoIHBvb2xzIG11c3QgYmUgTlVMTC4gSnVzdCBpbiBjYXNlLCBzZXQgdGhlbQorICAgIC8vIHRvIE5VTEwgLS0gc29tZSBtZW1vcnkgbWF5IGxlYWssIGJ1dCBzdWJzZXF1ZW50IGNvZGUgd2lsbCB3b3JrIGV2ZW4gaWYgcG9vbHMgYXJlIG5vdCBmcmVlZC4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbCA9PSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZWFtX3Bvb2wgICA9PSBOVUxMICk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSBOVUxMOworICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgX19rbXBfdGVhbV9wb29sICAgPSBOVUxMOworCisgICAgLyogQWxsb2NhdGUgYWxsIG9mIHRoZSB2YXJpYWJsZSBzaXplZCByZWNvcmRzICovCisgICAgLyogTk9URTogX19rbXBfdGhyZWFkc19jYXBhY2l0eSBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQsIGJ1dCB0aGUgYXJyYXlzIGFyZSBleHBhbmRhYmxlICovCisgICAgLyogU2luY2UgYWxsb2NhdGlvbiBpcyBjYWNoZS1hbGlnbmVkLCBqdXN0IGFkZCBleHRyYSBwYWRkaW5nIGF0IHRoZSBlbmQgKi8KKyAgICBzaXplID0gKHNpemVvZihrbXBfaW5mb190KikgKyBzaXplb2Yoa21wX3Jvb3RfdCopKSpfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgQ0FDSEVfTElORTsKKyAgICBfX2ttcF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemUgKTsKKyAgICBfX2ttcF9yb290ICAgID0gKGttcF9yb290X3QqKikgKChjaGFyKilfX2ttcF90aHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIGluaXQgdGhyZWFkIGNvdW50cyAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FsbF9udGggPT0gMCApOyAvLyBBc3NlcnRzIGZhaWwgaWYgdGhlIGxpYnJhcnkgaXMgcmVpbml0aWFsaXppbmcgYW5kCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbnRoID09IDAgKTsgICAgIC8vIHNvbWV0aGluZyB3YXMgd3JvbmcgaW4gdGVybWluYXRpb24uCisgICAgX19rbXBfYWxsX250aCA9IDA7CisgICAgX19rbXBfbnRoICAgICA9IDA7CisKKyAgICAvKiBzZXR1cCB0aGUgdWJlciBtYXN0ZXIgdGhyZWFkIGFuZCBoaWVyYXJjaHkgKi8KKyAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdCggVFJVRSApOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSAgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfSU5JVElBTF9HVElEKCBndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfY29tbW9uX2luaXRpYWxpemUoKTsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAvKiBpbnZva2UgdGhlIGNoaWxkIGZvcmsgaGFuZGxlciAqLworICAgICAgICBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoKTsKKyAgICAjZW5kaWYKKworICAgICNpZiAhIGRlZmluZWQgR1VJREVETExfRVhQT1JUUworICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnZva2UgdGhlIGV4aXQgaGFuZGxlciB3aGVuIHRoZSBwcm9ncmFtIGZpbmlzaGVzLCBvbmx5IGZvciBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgICAgICAgIEZvciBkeW5hbWljIGxpYnJhcnksIHdlIGFscmVhZHkgaGF2ZSBfZmluaSBhbmQgRGxsTWFpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHJjID0gYXRleGl0KCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0ICk7CisgICAgICAgICAgICBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJhdGV4aXQoKSIgKSwgS01QX0VSUiggcmMgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICAvKiBOT1RFOiBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHVzZXIgaW5zdGFsbHMKKyAgICAgICAgICAgICAqICAgICAgICAgIHRoZWlyIG93biBzaWduYWwgaGFuZGxlcnMgc28gdGhhdCB0aGUgdXNlciBoYW5kbGVycworICAgICAgICAgICAgICogICAgICAgICAgYXJlIGNhbGxlZCBmaXJzdC4gIHRoaXMgd2F5IHRoZXkgY2FuIHJldHVybiBmYWxzZSwKKyAgICAgICAgICAgICAqICAgICAgICAgIG5vdCBjYWxsIG91ciBoYW5kbGVyLCBhdm9pZCB0ZXJtaW5hdGluZyB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgICAqICAgICAgICAgIGFuZCBjb250aW51ZSBleGVjdXRpb24gd2hlcmUgdGhleSBsZWZ0IG9mZi4gKi8KKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggRkFMU0UgKTsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICNlbmRpZgorCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCB0aGUgc2VyaWFsIGluaXRpYWxpemF0aW9uICovCisgICAgX19rbXBfaW5pdF9jb3VudGVyICsrOworCisgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBUUlVFOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX2Rpc3BsYXlfZW52IHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50XzIoKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIEtNUF9NQigpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKK30KKwordm9pZAorX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmICggX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBpZiAoIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcHJldl9kZmx0X3RlYW1fbnRoOworCisgICAgaWYoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSBfX2ttcF9kZmx0X3RlYW1fbnRoIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gYXZvaWQgc29tZSByZWluaXRpYWxpemF0aW9uIGlmIGl0IGhhc24ndCBjaGFuZ2VkLgorICAgIC8vCisgICAgcHJldl9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aDsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKSB3aWxsIHRyeSB0byBzZXQgX19rbXBfbmNvcmVzIHRvIHRoZQorICAgIC8vIG51bWJlciBvZiBjb3JlcyBvbiB0aGUgbWFjaGluZS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgYWZmaW5pdHkgbWFzaworICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKysgKSB7CisgICAgICAgIGlmICggVENSX1BUUiggX19rbXBfdGhyZWFkc1sgaSBdICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGksIFRSVUUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF94cHJvYyA+IDAgKTsKKyAgICBpZiAoIF9fa21wX2F2YWlsX3Byb2MgPT0gMCApIHsKKyAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICAgIH0KKworICAgIC8vIElmIHRoZXJlIHdlcmUgZW1wdHkgcGxhY2VzIGluIG51bV90aHJlYWRzIGxpc3QgKE9NUF9OVU1fVEhSRUFEUz0sLDIsMyksIGNvcnJlY3QgdGhlbSBub3cKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAhIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIGorKzsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCApIHsKKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNjb3JlcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25jb3JlcyAoJWQpXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNhdmFpbGFibGUgT1MgcHJvY3MKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYyglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZW5kaWYgLyogS01QX0RGTFRfTlRIX0NPUkVTICovCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGggPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUncyBubyBoYXJtIGluIGNvbnRpbnVpbmcgaWYgdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywKKyAgICAvLyBidXQgaXQgaW5kaWNhdGVzIGFuIGVycm9yIGluIHRoZSBwcmV2aW91cyBsb2dpYy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2RmbHRfdGVhbV9udGggPD0gX19rbXBfZGZsdF90ZWFtX250aF91YiApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoICE9IHByZXZfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgbnVtIHRocmVhZHMgaWN2CisgICAgICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMCisgICAgICAgIC8vICh3aGljaCBoYXMgbm90IGFscmVhZHkgZXhwbGljaXRseSBzZXQgaXRzIG50aHJlYWRzLXZhciB3aXRoIGEKKyAgICAgICAgLy8gY2FsbCB0byBvbXBfc2V0X251bV90aHJlYWRzKCkpLgorICAgICAgICAvLworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGkgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkID09IE5VTEwgKSBjb250aW51ZTsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyAhPSAwICkgY29udGludWU7CisjZWxzZQorICAgICAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfbnByb2NbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXSAgIT0gMCApIGNvbnRpbnVlOworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgICAgIHNldF9fbnByb2NfcCggX19rbXBfdGhyZWFkc1sgaSBdLCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBmaW5hbCB2YWx1ZSBmb3IgX19rbXBfZGZsdF90ZWFtX250aCA9ICVkXG4iLAorICAgICAgX19rbXBfZGZsdF90ZWFtX250aCkgKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSB0byB6ZXJvIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIG5vdyB0aGF0IF9fa21wX2F2YWlsX3Byb2MgaXMgc2V0ICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgbWlkZGxlIGluaXRpYWxpemF0aW9uICovCisgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X21pZGRsZSwgVFJVRSk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworfQorCit2b2lkCitfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmICggX19rbXBfaW5pdF9taWRkbGUgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCit2b2lkCitfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgbmV3IHJvb3QKKworICAgIC8qIHN5bmNyb25pemUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKGZvciBzaWJsaW5nKSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHJldHVybjsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgcmV0dXJuOyB9CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IHNodXQgZG93biAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogYXR0ZW1wdCB0byBpbml0IHdoaWxlIHNodXR0aW5nIGRvd25cbiIgKSApOworICAgICAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgICAgfQorCisgICAgLyogamM6IFRoZSBsb2NrIF9fa21wX2luaXR6X2xvY2sgaXMgYWxyZWFkeSBoZWxkLCBzbyBjYWxsaW5nIF9fa21wX3NlcmlhbF9pbml0aWFsaXplCisgICAgICAgICAgIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suICBTbyB3ZSBjYWxsIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGRpcmVjdGx5LgorICAgICovCisgICAgaWYoICFfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKiBiZWdpbiBpbml0aWFsaXphdGlvbiAqLworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBGUCBjb250cm9sIHJlZ3MuCisgICAgLy8gV29ya2VyIHRocmVhZHMgd2lsbCBzZXQgdGhlaXJzIHRvIHRoZXNlIHZhbHVlcyBhdCB0aHJlYWQgc3RhcnR1cC4KKyAgICAvLworICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCAmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgIF9fa21wX3N0b3JlX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworICAgIF9fa21wX2luaXRfbXhjc3IgJj0gS01QX1g4Nl9NWENTUl9NQVNLOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19VTklYCisjIGlmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIC8qICBtdXN0IGJlIGFmdGVyIF9fa21wX3NlcmlhbF9pbml0aWFsaXplICAqLworICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggVFJVRSApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoKTsKKworIyAgaWYgZGVmaW5lZChVU0VfTE9BRF9CQUxBTkNFKQorICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICAgIH0KKyNlbHNlCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX3ZlcnNpb24gKSB7CisgICAgICAgIF9fa21wX3ByaW50X3ZlcnNpb25fMigpOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfcGFyYWxsZWwsIFRSVUUpOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2Rpc3BfdCAqZGlzcGF0Y2g7CisKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5vbmUgb2YgdGhlIHRocmVhZHMgaGF2ZSBlbmNvdW50ZXJlZCBhbnkgY29uc3RydWN0cywgeWV0LiAqLworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLmxhc3RfY29uc3RydWN0ID0gMDsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmdGhpc190aHIgLT4gdGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9hcnJpdmVkICk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgIGRpc3BhdGNoID0gKGttcF9kaXNwX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF9kaXNwYXRjaCApOworICAgIC8vS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2ggPT0gJnRlYW0gLT4gdC50X2Rpc3BhdGNoWyB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgXSApOworCisgICAgZGlzcGF0Y2ggLT4gdGhfZGlzcF9pbmRleCA9IDA7ICAgIC8qIHJlc2V0IHRoZSBkaXNwYXRjaCBidWZmZXIgY291bnRlciAqLworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfcGFyYWxsZWwoIGd0aWQsIHRlYW0tPnQudF9pZGVudCApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKK3ZvaWQKK19fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9wYXJhbGxlbCggZ3RpZCwgdGVhbS0+dC50X2lkZW50ICk7Cit9CisKK2ludAorX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKQoreworICAgIGludCAgICAgICAgICByYzsKKyAgICBpbnQgICAgICAgICAgdGlkICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICp0ZWFtICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBpbmZvcm0gaXR0bm90aWZ5IGFib3V0IGVudGVyaW5nIHVzZXIncyBjb2RlCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByYyA9IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIChtaWNyb3Rhc2tfdCkgVENSX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuKSwKKyAgICAgIGd0aWQsIHRpZCwgKGludCkgdGVhbS0+dC50X2FyZ2MsICh2b2lkICoqKSB0ZWFtLT50LnRfYXJndiApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgbGVhdmluZyB1c2VyJ3MgY29kZQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworCisgICAgcmV0dXJuIHJjOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX3RlYW1zX21hc3RlciggbWljcm90YXNrX3QgbWljcm90YXNrLCBpbnQgZ3RpZCApCit7CisgICAgLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhbGwgbWFzdGVyIHRocmVhZHMgaW4gdGVhbXMgY29uc3RydWN0CisgICAga21wX2luZm9fdCAgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICp0ZWFtID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpZGVudF90ICAgICAqbG9jID0gIHRlYW0tPnQudF9pZGVudDsKKworI2lmIEtNUF9ERUJVRworICAgIGludCAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3RlYW1zX21hc3RlcjogVCMlZCwgVGlkICVkLCBtaWNyb3Rhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGlkLCBtaWNyb3Rhc2spICk7CisjZW5kaWYKKworICAgIC8vIExhdW5jaCBsZWFndWUgb2YgdGVhbXMgbm93LCBidXQgbm90IGxldCB3b3JrZXJzIGV4ZWN1dGUKKyAgICAvLyAodGhleSBoYW5nIG9uIGZvcmsgYmFycmllciB1bnRpbCBuZXh0IHBhcmFsbGVsKQorICAgIHRoaXNfdGhyLT50aC50aF9zZXRfbnByb2MgPSB0aGlzX3Roci0+dGgudGhfc2V0X250aF90ZWFtczsKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgVFJVRSwKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmdjLAorICAgICAgICAgICAgbWljcm90YXNrLAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKyAgICAgICAgICAgIE5VTEwgKTsKKyAgICBfX2ttcF9qb2luX2NhbGwoIGxvYywgZ3RpZCwgMSApOyAvLyBBQzogbGFzdCBwYXJhbWV0ZXIgIjEiIGVsaW1pbmF0ZXMgam9pbiBiYXJyaWVyIHdoaWNoIHdvbid0IHdvcmsgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtlciB0aHJlYWRzIGFyZSBpbiBhIGZvcmsgYmFycmllciB3YWl0aW5nIGZvciBtb3JlIHBhcmFsbGVsIHJlZ2lvbnMKK30KKworaW50CitfX2ttcF9pbnZva2VfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApCit7CisgICAgI2lmIEtNUF9ERUJVRworICAgIGlmICggIV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCApCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICh2b2lkKilfX2ttcF90aHJlYWRzW2d0aWRdLT4gdGgudGhfdGVhbS0+dC50X3BrZm4gPT0gKHZvaWQqKV9fa21wX3RlYW1zX21hc3RlciApOworICAgICNlbmRpZgorCisgICAgX19rbXBfdGVhbXNfbWFzdGVyKCAobWljcm90YXNrX3QpX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9taWNyb3Rhc2ssIGd0aWQgKTsKKworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAqIGVuY291bnRlcmVkIGJ5IHRoaXMgdGVhbSAqLworLyogc2luY2UgdGhpcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGZvcmtqb2luIGNyaXRpY2FsIHNlY3Rpb24gaXQKKyAqIHNob3VsZCBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBhc3N5bW1ldHJpY2FsIG5lc3RlZCBwYXJhbGxlbGlzbSAqLworCit2b2lkCitfX2ttcF9wdXNoX251bV90aHJlYWRzKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgIGlmKCBudW1fdGhyZWFkcyA+IDAgKQorICAgICAgICB0aHIgLT4gdGgudGhfc2V0X25wcm9jID0gbnVtX3RocmVhZHM7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiB0aGlzIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGVhbXMgZm9yIHRoZSB0ZWFtcyByZWdpb24gYW5kL29yCisgKiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBlbmNvdW50ZXJlZCAgKi8KK3ZvaWQKK19fa21wX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGludCBudW1fdGVhbXMsIGludCBudW1fdGhyZWFkcyApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHRlYW1zIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgb3V0ZXIgInBhcmFsbGVsIgorICAgIGlmKCBudW1fdGVhbXMgPiAwICkgeworICAgICAgICB0aHIgLT4gdGgudGhfc2V0X25wcm9jID0gbnVtX3RlYW1zOworICAgIH0gZWxzZSB7CisgICAgICAgIHRociAtPiB0aC50aF9zZXRfbnByb2MgPSAxOyAgLy8gQUM6IGRlZmF1bHQgbnVtYmVyIG9mIHRlYW1zIGlzIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGl0IGJlIF9fa21wX25jb3JlcyA/CisgICAgfQorICAgIC8vIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyBmb3IgaW5uZXIgcGFyYWxsZWwgcmVnaW9ucworICAgIGlmKCBudW1fdGhyZWFkcyA+IDAgKSB7CisgICAgICAgIHRociAtPiB0aC50aF9zZXRfbnRoX3RlYW1zID0gbnVtX3RocmVhZHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYoICFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKQorICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgdGhyIC0+IHRoLnRoX3NldF9udGhfdGVhbXMgPSBfX2ttcF9hdmFpbF9wcm9jIC8gdGhyIC0+IHRoLnRoX3NldF9ucHJvYzsKKyAgICB9Cit9CisKKworLy8KKy8vIFNldCB0aGUgcHJvY19iaW5kIHZhciB0byB1c2UgaW4gdGhlIGZvbGxvd2luZyBwYXJhbGxlbCByZWdpb24uCisvLwordm9pZAorX19rbXBfcHVzaF9wcm9jX2JpbmQoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3Byb2NfYmluZF90IHByb2NfYmluZCApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0aHIgLT4gdGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZDsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIExhdW5jaCB0aGUgd29ya2VyIHRocmVhZHMgaW50byB0aGUgbWljcm90YXNrLiAqLworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9mb3JrKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBmOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB0ZWFtIC0+IHQudF9jb25zdHJ1Y3QgPSAwOyAgICAgICAgICAvKiBubyBzaW5nbGUgZGlyZWN0aXZlcyBzZWVuIHlldCAqLworICAgIHRlYW0gLT4gdC50X29yZGVyZWQuZHQudF92YWx1ZSA9IDA7IC8qIHRocmVhZCAwIGVudGVycyB0aGUgb3JkZXJlZCBzZWN0aW9uIGZpcnN0ICovCisKKyAgICAvKiBSZXNldCB0aGUgaWRlbnRpZmllcnMgb24gdGhlIGRpc3BhdGNoIGJ1ZmZlciAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyICk7CisgICAgaWYgKCB0ZWFtLT50LnRfbWF4X25wcm9jID4gMSApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAgS01QX01BWF9ESVNQX0JVRjsgKytpKQorICAgICAgICAgICAgdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIGkgXS5idWZmZXJfaW5kZXggPSBpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyWyAwIF0uYnVmZmVyX2luZGV4ID0gMDsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90ZWFtICA9PSAgdGVhbSApOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgZm9yKCBmPTAgOyBmPHRlYW0tPnQudF9ucHJvYyA7IGYrKyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLyogcmVsZWFzZSB0aGUgd29ya2VyIHRocmVhZHMgc28gdGhleSBtYXkgYmVnaW4gd29ya2luZyAqLworICAgIF9fa21wX2ZvcmtfYmFycmllciggZ3RpZCwgMCApOworfQorCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2pvaW4oIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBKb2luIGJhcnJpZXIgYWZ0ZXIgZm9yayAqLworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaWYgKF9fa21wX3RocmVhZHNbZ3RpZF0gJiYgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYyAhPSB0ZWFtLT50LnRfbnByb2MgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiR1RJRDogJWQsIF9fa21wX3RocmVhZHNbJWRdPSVwXG4iLGd0aWQsIGd0aWQsIF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgICAgICBfX2ttcF9wcmludGYoIl9fa21wX3RocmVhZHNbJWRdLT50aC50aF90ZWFtX25wcm9jPSVkLCBURUFNOiAlcCwgdGVhbS0+dC50X25wcm9jPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYywgdGVhbSwgdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlKCk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbZ3RpZF0gJiYKKyAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBfX2ttcF9qb2luX2JhcnJpZXIoIGd0aWQgKTsgIC8qIHdhaXQgZm9yIGV2ZXJ5b25lICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90ZWFtICA9PSAgdGVhbSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vCisvLyBSZXR1cm4gdGhlIHdvcmtlciB0aHJlYWRzIGFjdGl2ZWx5IHNwaW5uaW5nIGluIHRoZSBob3QgdGVhbSwgaWYgd2UKKy8vIGFyZSBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIG9mIHBhcmFsbGVsaXNtLiAgT3RoZXJ3aXNlLCByZXR1cm4gMC4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hY3RpdmVfaG90X3RlYW1fbnByb2MoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCBpOworICAgIGludCByZXR2YWw7CisgICAga21wX3RlYW1fdCAqaG90X3RlYW07CisKKyAgICBpZiAoIHJvb3QtPnIucl9hY3RpdmUgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICByZXR1cm4gaG90X3RlYW0tPnQudF9ucHJvYyAtIDE7ICAvLyBEb24ndCBjb3VudCBtYXN0ZXIgdGhyZWFkCisgICAgfQorCisgICAgLy8KKyAgICAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkIC0gaXQgaXMgYWNjb3VudGVkIGZvciBlbHNld2hlcmUuCisgICAgLy8KKyAgICByZXR2YWwgPSAwOworICAgIGZvciAoIGkgPSAxOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgaSsrICkgeworICAgICAgICBpZiAoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXS0+dGgudGhfYWN0aXZlICkgeworICAgICAgICAgICAgcmV0dmFsKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8KKy8vIFBlcmZvcm0gYW4gYXV0b21hdGljIGFkanVzdG1lbnQgdG8gdGhlIG51bWJlciBvZgorLy8gdGhyZWFkcyB1c2VkIGJ5IHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoIGttcF9yb290X3QgKnJvb3QsIGludCBzZXRfbnByb2MgKQoreworICAgIGludCByZXR2YWw7CisgICAgaW50IHBvb2xfYWN0aXZlOworICAgIGludCBob3RfdGVhbV9hY3RpdmU7CisgICAgaW50IHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaW50IHN5c3RlbV9hY3RpdmU7CisKKyAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBjYWxsZWQgcm9vdDolcCBzZXRfbnByb2M6JWRcbiIsCisgICAgICAgICAgICAgICAgcm9vdCwgc2V0X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX3Jvb3RfdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljID09IFRSVUUgKTsKKyAgICAjZWxzZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9yb290X3RlYW0tPnQudF9zZXRfZHluYW1pY1swXSA9PSBUUlVFICk7CisgICAgI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2V0X25wcm9jID4gMSApOworCisgICAgaWYgKCBzZXRfbnByb2MgPT0gMSkgeworICAgICAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBzZXJpYWwgZXhlY3V0aW9uLlxuIiApICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhyZWFkcyB0aGF0IGFyZSBhY3RpdmUgaW4gdGhlIHRocmVhZCBwb29sLCBhY3RpdmUgaW4gdGhlIGhvdCB0ZWFtCisgICAgLy8gZm9yIHRoaXMgcGFydGljdWxhciByb290IChpZiB3ZSBhcmUgYXQgdGhlIG91dGVyIHBhciBsZXZlbCksIGFuZAorICAgIC8vIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZCAodG8gYmVjb21lIHRoZSBtYXN0ZXIpIGFyZSBhdmFpbGFibGUKKyAgICAvLyB0byBhZGQgdG8gdGhlIG5ldyB0ZWFtLCBidXQgYXJlIGN1cnJlbnRseSBjb250cmlidXRpbmcgdG8gdGhlIHN5c3RlbQorICAgIC8vIGxvYWQsIGFuZCBtdXN0IGJlIGFjY291bnRlZCBmb3IuCisgICAgLy8KKyAgICBwb29sX2FjdGl2ZSA9IFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgIGhvdF90ZWFtX2FjdGl2ZSA9IF9fa21wX2FjdGl2ZV9ob3RfdGVhbV9ucHJvYyggcm9vdCApOworICAgIHRlYW1fY3Vycl9hY3RpdmUgPSBwb29sX2FjdGl2ZSArIGhvdF90ZWFtX2FjdGl2ZSArIDE7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRoZSBzeXN0ZW0gbG9hZC4KKyAgICAvLworICAgIHN5c3RlbV9hY3RpdmUgPSBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBfX2ttcF9hdmFpbF9wcm9jICsgdGVhbV9jdXJyX2FjdGl2ZSApOworICAgIEtCX1RSQUNFKCAzMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHN5c3RlbSBhY3RpdmUgPSAlZCBwb29sIGFjdGl2ZSA9ICVkIGhvdCB0ZWFtIGFjdGl2ZSA9ICVkXG4iLAorICAgICAgc3lzdGVtX2FjdGl2ZSwgcG9vbF9hY3RpdmUsIGhvdF90ZWFtX2FjdGl2ZSApICk7CisKKyAgICBpZiAoIHN5c3RlbV9hY3RpdmUgPCAwICkgeworICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgbmVjZXNzYXJ5IGluZm8gZnJvbSAvcHJvYywKKyAgICAgICAgLy8gc28gdXNlIHRoZSB0aHJlYWQgbGltaXQgYWxnb3JpdGhtIGluc3RlYWQuICBPbmNlIHdlIHNldAorICAgICAgICAvLyBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0LAorICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgd2luZCB1cCBnZXR0aW5nIGJhY2sgaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICAgICAgS01QX1dBUk5JTkcoIENhbnRMb2FkQmFsVXNpbmcsICJLTVBfRFlOQU1JQ19NT0RFPXRocmVhZCBsaW1pdCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBNYWtlIHRoaXMgY2FsbCBiZWhhdmUgbGlrZSB0aGUgdGhyZWFkIGxpbWl0IGFsZ29yaXRobS4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dmFsID0gX19rbXBfYXZhaWxfcHJvYyAtIF9fa21wX250aCArIChyb290LT5yLnJfYWN0aXZlID8gMQorICAgICAgICAgIDogcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MpOworICAgICAgICBpZiAoIHJldHZhbCA+IHNldF9ucHJvYyApIHsKKyAgICAgICAgICAgIHJldHZhbCA9IHNldF9ucHJvYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJldHZhbCA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICAgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgICAgICAgIH0KKworICAgICAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiB0aHJlYWQgbGltaXQgZXhpdC4gcmV0dmFsOiVkXG4iLCByZXR2YWwgKSApOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgZGVsYXkgaW4gdGhlIGxvYWQgYmFsYW5jZSBhbGdvcml0aG0gaW4gZGV0ZWN0aW5nCisgICAgLy8gbmV3IHJ1bm5pbmcgcHJvY3MuICBUaGUgcmVhbCBzeXN0ZW0gbG9hZCBhdCB0aGlzIGluc3RhbnQgc2hvdWxkIGJlCisgICAgLy8gYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlICNhY3RpdmUgb21wIHRocmVhZCB0aGF0IGFyZSBhdmFpbGFibGUgdG8KKyAgICAvLyBhZGQgdG8gdGhlIHRlYW0uCisgICAgLy8KKyAgICBpZiAoIHN5c3RlbV9hY3RpdmUgPCB0ZWFtX2N1cnJfYWN0aXZlICkgeworICAgICAgICBzeXN0ZW1fYWN0aXZlID0gdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICB9CisgICAgcmV0dmFsID0gX19rbXBfYXZhaWxfcHJvYyAtIHN5c3RlbV9hY3RpdmUgKyB0ZWFtX2N1cnJfYWN0aXZlOworICAgIGlmICggcmV0dmFsID4gc2V0X25wcm9jICkgeworICAgICAgICByZXR2YWwgPSBzZXRfbnByb2M7CisgICAgfQorICAgIGlmICggcmV0dmFsIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIHJldHZhbCA9IEtNUF9NSU5fTlRIOworICAgIH0KKworICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGV4aXQuIHJldHZhbDolZFxuIiwgcmV0dmFsICkgKTsKKyAgICByZXR1cm4gcmV0dmFsOworfSAvLyBfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoKQorCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE5PVEU6IHRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIF9fa21wX2luaXRfbG9jayBoZWxkICovCit2b2lkCitfX2ttcF9jbGVhbnVwKCB2b2lkICkKK3sKKyAgICBpbnQgZjsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBlbnRlclxuIiApICk7CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAgICAgX19rbXBfcmVtb3ZlX3NpZ25hbHMoKTsKKyNlbmRpZgorICAgICAgICBUQ1dfNChfX2ttcF9pbml0X3BhcmFsbGVsLCBGQUxTRSk7CisgICAgfQorCisgICAgaWYgKFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X21pZGRsZSwgRkFMU0UpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBnbyBzZXJpYWwgY2xlYW51cFxuIiApICk7CisKKyAgICBpZiAoX19rbXBfaW5pdF9zZXJpYWwpIHsKKworICAgICAgICBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koKTsKKworICAgICAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICAgIH0KKworICAgIGZvciAoIGYgPSAwOyBmIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgZisrICkgeworICAgICAgICBpZiAoIF9fa21wX3Jvb3RbIGYgXSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggX19rbXBfcm9vdFsgZiBdICk7CisgICAgICAgICAgICBfX2ttcF9yb290WyBmIF0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2ZyZWUoIF9fa21wX3RocmVhZHMgKTsKKyAgICAvLyBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290IHdlcmUgYWxsb2NhdGVkIGF0IG9uY2UsIGFzIHNpbmdsZSBibG9jaywgc28gdGhlcmUgaXMgbm8gbmVlZCBpbgorICAgIC8vIGZyZWVpbmcgX19rbXBfcm9vdC4KKyAgICBfX2ttcF90aHJlYWRzID0gTlVMTDsKKyAgICBfX2ttcF9yb290ICAgID0gTlVMTDsKKyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gMDsKKworICAgIF9fa21wX2NsZWFudXBfdXNlcl9sb2NrcygpOworCisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICBfX2ttcF9jcHVpbmZvX2ZpbGUgPSBOVUxMOworICAgICNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyAgICNlbmRpZgorICAgI2VuZGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIF9fa21wX25lc3RlZF9udGgubnRoICk7CisgICAgX19rbXBfbmVzdGVkX250aC5udGggPSBOVUxMOworICAgIF9fa21wX25lc3RlZF9udGguc2l6ZSA9IDA7CisgICAgX19rbXBfbmVzdGVkX250aC51c2VkID0gMDsKKworICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBleGl0XG4iICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50CitfX2ttcF9pZ25vcmVfbXBwYmVnKCB2b2lkICkKK3sKKyAgICBjaGFyICplbnY7CisKKyAgICBpZiAoKGVudiA9IGdldGVudiggIktNUF9JR05PUkVfTVBQQkVHIiApKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGVudiApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wY19iZWdpbigpIGlzIG5vLW9wLgorICAgIHJldHVybiBUUlVFOworfQorCitpbnQKK19fa21wX2lnbm9yZV9tcHBlbmQoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBFTkQiICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2VuZCgpIGlzIG5vLW9wLgorICAgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9iZWdpbiggdm9pZCApCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKworICAgIC8qIHRoaXMgaXMgYSB2ZXJ5IGltcG9ydGFudCBzdGVwIGFzIGl0IHdpbGwgcmVnaXN0ZXIgbmV3IHNpYmxpbmcgdGhyZWFkcworICAgICAqIGFuZCBhc3NpZ24gdGhlc2UgbmV3IHViZXIgdGhyZWFkcyBhIG5ldyBndGlkICovCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICByb290ID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX3Jvb3Q7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSByZXR1cm47CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICBpZiggcm9vdC0+ci5yX2JlZ2luICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJvb3QgLT4gci5yX2JlZ2luID0gVFJVRTsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiByb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3VzZXJfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIGZpcnN0LCBtYWtlIHN1cmUgd2UgYXJlIGluaXRpYWxpemVkIHNvIHdlIGNhbiBnZXQgb3VyIGd0aWQgKi8KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgcm9vdCA9IHRocmVhZCAtPiB0aC50aF9yb290OworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3VzZXJfc2V0X2xpYnJhcnk6IGVudGVyIFQjJWQsIGFyZzogJWQsICVkXG4iLCBndGlkLCBhcmcsIGxpYnJhcnlfc2VyaWFsICkpOworICAgIGlmIChyb290LT5yLnJfaW5fcGFyYWxsZWwpIHsgLyogTXVzdCBiZSBjYWxsZWQgaW4gc2VyaWFsIHNlY3Rpb24gb2YgdG9wLWxldmVsIHRocmVhZCAqLworICAgICAgICBLTVBfV0FSTklORyggU2V0TGlicmFyeUluY29ycmVjdENhbGwgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoIGFyZyApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgdGhyZWFkIC0+IHRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2NfcCggdGhyZWFkLCAxICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDoKKyAgICAgICAgdGhyZWFkIC0+IHRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2NfcCggdGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aCA6IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICB0aHJlYWQgLT4gdGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvY19wKCB0aHJlYWQsIF9fa21wX2RmbHRfdGVhbV9udGggPyBfX2ttcF9kZmx0X3RlYW1fbnRoIDogX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfRkFUQUwoIFVua25vd25MaWJyYXJ5VHlwZSwgYXJnICk7CisgICAgfQorCisgICAgX19rbXBfYXV4X3NldF9saWJyYXJ5ICggYXJnICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBzaXplX3QgYXJnICkKK3sKKyAgICBpZiAoISBfX2ttcF9pbml0X3NlcmlhbCkKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKworI2lmIEtNUF9PU19EQVJXSU4KKyAgICBpZiAoYXJnICYgKDB4MTAwMCAtIDEpKSB7CisgICAgICAgIGFyZyAmPSB+KDB4MTAwMCAtIDEpOworICAgICAgICBpZihhcmcgKyAweDEwMDApIC8qIGNoZWNrIGZvciBvdmVyZmxvdyBpZiB3ZSByb3VuZCB1cCAqLworICAgICAgICAgICAgYXJnICs9IDB4MTAwMDsKKyAgICB9CisjZW5kaWYKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogb25seSBjaGFuZ2UgdGhlIGRlZmF1bHQgc3RhY2tzaXplIGJlZm9yZSB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uICovCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyAgICAgICAgc2l6ZV90IHZhbHVlID0gYXJnOyAgICAgICAvKiBhcmd1bWVudCBpcyBpbiBieXRlcyAqLworCisgICAgICAgIGlmICh2YWx1ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApCisgICAgICAgICAgICB2YWx1ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZSA7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gS01QX01BWF9TVEtTSVpFKQorICAgICAgICAgICAgdmFsdWUgPSBLTVBfTUFYX1NUS1NJWkU7CisKKyAgICAgICAgX19rbXBfc3Rrc2l6ZSA9IHZhbHVlOworCisgICAgICAgIF9fa21wX2Vudl9zdGtzaXplID0gVFJVRTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKKy8qIHNldCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgKi8KKy8qIFRPRE8gdGhpcyBjYW4gY2F1c2Ugc29tZSBvZGQgYmVoYXZpb3VyIHdpdGggc2libGluZyBwYXJhbGxlbGlzbS4uLiAqLwordm9pZAorX19rbXBfYXV4X3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpCit7CisgICAgX19rbXBfbGlicmFyeSA9IGFyZzsKKworICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIExpYnJhcnlJc1NlcmlhbCApOworICAgICAgICAgICAgKHZvaWQpIF9fa21wX2NoYW5nZV9saWJyYXJ5KCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOgorICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIEZBTFNFICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2F1eF9zZXRfYmxvY2t0aW1lIChpbnQgYXJnLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCB0aWQpCit7CisgICAgaW50IGJsb2NrdGltZSA9IGFyZzsgICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGludCBidF9pbnRlcnZhbHM7CisgICAgaW50IGJ0X3NldDsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgLyogTm9ybWFsaXplIGFuZCBzZXQgYmxvY2t0aW1lIGZvciB0aGUgdGVhbXMgKi8KKyAgICBpZiAoYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUpCisgICAgICAgIGJsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgIGVsc2UgaWYgKGJsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FKQorICAgICAgICBibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKworICAgIHNldF9fYmxvY2t0aW1lX3RlYW0oIHRocmVhZCAtPiB0aC50aF90ZWFtLCB0aWQsIGJsb2NrdGltZSApOworICAgIHNldF9fYmxvY2t0aW1lX3RlYW0oIHRocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSwgMCwgYmxvY2t0aW1lICk7CisKKyAgICAvKiBDYWxjdWxhdGUgYW5kIHNldCBibG9ja3RpbWUgaW50ZXJ2YWxzIGZvciB0aGUgdGVhbXMgKi8KKyAgICBidF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKworICAgIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHRocmVhZCAtPiB0aC50aF90ZWFtLCB0aWQsIGJ0X2ludGVydmFscyApOworICAgIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHRocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfaW50ZXJ2YWxzICk7CisKKyAgICAvKiBTZXQgd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gc2V0IHRvICJUUlVFIiAqLworICAgIGJ0X3NldCA9IFRSVUU7CisKKyAgICBzZXRfX2J0X3NldF90ZWFtKCB0aHJlYWQgLT4gdGgudGhfdGVhbSwgdGlkLCBidF9zZXQgKTsKKyAgICBzZXRfX2J0X3NldF90ZWFtKCB0aHJlYWQgLT4gdGgudGhfc2VyaWFsX3RlYW0sIDAsIGJ0X3NldCApOworICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfc2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZCwgYnRfaW50ZXJ2YWxzPSVkLCBtb25pdG9yX3VwZGF0ZXM9JWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHRpZCwgdGhyZWFkLT50aC50aF90ZWFtKSwKKyAgICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2lkLCB0aWQsIGJsb2NrdGltZSwgYnRfaW50ZXJ2YWxzLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKSApOworfQorCit2b2lkCitfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKAorICAgIGNoYXIgY29uc3QgKiBzdHIsCisgICAgaW50ICAgICAgICAgIGxlbgorKSB7CisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH07CisgICAgX19rbXBfZW52X2luaXRpYWxpemUoIHN0ciApOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgfHwgX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgICAgICkgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgICB9Cit9IC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbnRlcm5hbCBmYXN0IHJlZHVjdGlvbiByb3V0aW5lcworICovCisKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApCit7CisKKyAgICAvLyBEZWZhdWx0IHJlZHVjdGlvbiBtZXRob2Q6IGNyaXRpY2FsIGNvbnN0cnVjdCAoIGxjayAhPSBOVUxMLCBsaWtlIGluIGN1cnJlbnQgUEFST1BUICkKKyAgICAvLyBJZiAoIHJlZHVjZV9kYXRhIT1OVUxMICYmIHJlZHVjZV9mdW5jIT1OVUxMICk6IHRoZSB0cmVlLXJlZHVjdGlvbiBtZXRob2QgY2FuIGJlIHNlbGVjdGVkIGJ5IFJUTAorICAgIC8vIElmIGxvYy0+ZmxhZ3MgY29udGFpbnMgS01QX0lERU5UX0FUT01JQ19SRURVQ0UsIHRoZSBhdG9taWMgcmVkdWNlIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gRmluYWxseSwgaXQncyB1cCB0byBPcGVuTVAgUlRMIHRvIG1ha2UgYSBkZWNpc2lvbiBvbiB3aGljaCBtZXRob2QgdG8gc2VsZWN0IGFtb25nIGdlbmVyYXRlZCBieSBQQVJPUFQuCisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHJldHZhbDsKKworICAgIGludCB0ZWFtX3NpemU7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsb2MgKTsgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB0ZXN0ICggbG9jICE9IDAgKQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsY2sgIT0gMCApCisKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEICggKCBsb2MtPmZsYWdzICYgKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkgPT0gKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRCAgICggKCByZWR1Y2VfZGF0YSApICYmICggcmVkdWNlX2Z1bmMgKSApCisKKyAgICByZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisKKyAgICB0ZWFtX3NpemUgPSBfX2ttcF9nZXRfdGVhbV9udW1fdGhyZWFkcyggZ2xvYmFsX3RpZCApOyAvLyBhbm90aGVyIGNob2ljZSBvZiBnZXR0aW5nIGEgdGVhbSBzaXplICggd2l0aCAxIGR5bmFtaWMgZGVmZXJlbmNlICkgaXMgc2xvd2VyCisKKyAgICBpZiggdGVhbV9zaXplID09IDEgKSB7CisKKyAgICAgICAgcmV0dmFsID0gZW1wdHlfcmVkdWNlX2Jsb2NrOworCisgICAgfSBlbHNlIHsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgICAgICBpbnQgdHJlZV9hdmFpbGFibGUgICA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKworICAgICAgICAjaWYgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgICNpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgUkVEVUNUSU9OX1RFQU1TSVpFX0NVVE9GRiA4CisgICAgICAgICAgICAgICAgI2Vsc2UgLy8gS01QX01JQworICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIFJFRFVDVElPTl9URUFNU0laRV9DVVRPRkYgNAorICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfTUlDCisgICAgICAgICAgICAgICAgaWYoIHRyZWVfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdGVhbV9zaXplIDw9IFJFRFVDVElPTl9URUFNU0laRV9DVVRPRkYgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorCisgICAgICAgICAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgICAgICAgICAgICAgLy8gYmFzaWMgdHVuaW5nCisKKyAgICAgICAgICAgICAgICBpZiggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG51bV92YXJzIDw9IDIgKSB7IC8vICYmICggdGVhbV9zaXplIDw9IDggKSBkdWUgdG8gZmFsc2Utc2hhcmluZyA/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgICAgICAgICAgaWYoIGF0b21pY19hdmFpbGFibGUgJiYgKCBudW1fdmFycyA8PSAzICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHJlZHVjZV9zaXplID4gKCA5ICogc2l6ZW9mKCBrbXBfcmVhbDY0ICkgKSApICYmICggcmVkdWNlX3NpemUgPCAoIDIwMDAgKiBzaXplb2YoIGttcF9yZWFsNjQgKSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1BMQUlOX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyAgICAgICAgI2VuZGlmCisKKyAgICB9CisKKyAgICAvLyBLTVBfRk9SQ0VfUkVEVUNUSU9OCisKKyAgICBpZiggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCAhPSByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkICkgeworCisgICAgICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgZm9yY2VkX3JldHZhbDsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSwgdHJlZV9hdmFpbGFibGU7CisKKyAgICAgICAgc3dpdGNoKCAoIGZvcmNlZF9yZXR2YWwgPSBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGNyaXRpY2FsX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBsY2sgKTsgICAgICAgICAgICAgIC8vIGxjayBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgIGlmKCB0ZWFtX3NpemUgPD0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VkX3JldHZhbCA9IGVtcHR5X3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgYXRvbWljX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggYXRvbWljX2F2YWlsYWJsZSApOyAvLyBhdG9taWNfYXZhaWxhYmxlIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgICAgICAgICAgdHJlZV9hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdHJlZV9hdmFpbGFibGUgKTsgICAvLyB0cmVlX2F2YWlsYWJsZSBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuc3VwcG9ydGVkIG1ldGhvZCBzcGVjaWZpZWQiCisgICAgICAgIH0KKworICAgICAgICByZXR2YWwgPSBmb3JjZWRfcmV0dmFsOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoICJyZWR1Y3Rpb24gbWV0aG9kIHNlbGVjdGVkPSUwOHhcbiIsIHJldHZhbCApICk7CisKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVECisgICAgI3VuZGVmIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVECisKKyAgICByZXR1cm4gKCByZXR2YWwgKTsKK30KKworLy8gdGhpcyBmdW5jdGlvbiBpcyBmb3IgdGVzdGluZyBzZXQvZ2V0L2RldGVybWluZSByZWR1Y2UgbWV0aG9kCitrbXBfaW50MzIKK19fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICkgeworICAgIHJldHVybiAoICggX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA+PiA4ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAgYi9yYzEvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU1YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBrbXBfc2NoZWQuYyAtLSBzdGF0aWMgc2NoZWR1bGluZyAtLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24KKyAqICRSZXZpc2lvbjogNDIzNTggJAorICogJERhdGU6IDIwMTMtMDUtMDcgMTM6NDM6MjYgLTA1MDAgKFR1ZSwgMDcgTWF5IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIFN0YXRpYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uLgorICoKKyAqIE5PVEU6IHRlYW0tPnQudF9ucHJvYyBpcyBhIGNvbnN0YW50IGluc2lkZSBvZiBhbnkgZGlzcGF0Y2ggbG9vcCwgaG93ZXZlcgorICogICAgICAgaXQgbWF5IGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBwYXJhbGxlbCByZWdpb25zLiAgX19rbXBfbWF4X250aAorICogICAgICAgaXMgdGhlIGxhcmdlc3QgdmFsdWUgX19rbXBfbnRoIG1heSB0YWtlLCAxIGlzIHRoZSBzbWFsbGVzdC4KKyAqCisgKi8KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisvLyB0ZW1wbGF0ZSBmb3IgdHlwZSBsaW1pdHMKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0cnVjdCBpX21heG1pbiB7CisgICAgc3RhdGljIGNvbnN0IFQgbXg7CisgICAgc3RhdGljIGNvbnN0IFQgbW47Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IGludCBteCA9IDB4N2ZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IGludCBtbiA9IDB4ODAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBteCA9IDB4ZmZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtbiA9IDB4MDAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBteCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbW4gPSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG14ID0gMHhmZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBtbiA9IDB4MDAwMDAwMDAwMDAwMDAwMExMOworfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9ERUJVRworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0ZW1wbGF0ZSBmb3IgZGVidWcgcHJpbnRzIHNwZWNpZmljYXRpb24gKCBkLCB1LCBsbGQsIGxsdSApCisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBpbnQgPjo6c3BlYyA9ICJkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGludCA+OjpzcGVjID0gInUiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgbG9uZyBsb25nID46OnNwZWMgPSAibGxkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGxvbmcgbG9uZyA+OjpzcGVjID0gImxsdSI7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdHlwZSwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAvKiAgdGhpcyBhbGwgaGFzIHRvIGJlIGNoYW5nZWQgYmFjayB0byBUSUQgYW5kIHN1Y2guLiAqLworICAgIHJlZ2lzdGVyIGttcF9pbnQzMiAgIGd0aWQgPSBnbG9iYWxfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGg7CisgICAgcmVnaXN0ZXIgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJSVkIHNjaGVkPSUlZCBsaXRlcj0lJWQgaXRlcj0oJSUlcywiIFwKKyAgICAgICAgICAgICIgJSUlcywgJSUlcykgaW5jcj0lJSVzIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ2xvYmFsX3RpZCwgc2NoZWR0eXBlLCAqcGxhc3RpdGVyLAorICAgICAgICAgICAgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUsIGluY3IsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworICAgICAgICBpZiAoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciB6ZXJvLXRyaXAgbG9vcHMgKi8KKyAgICBpZiAoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICpwbGFzdGl0ZXIgPSBGQUxTRTsKKyAgICAgICAgLyogbGVhdmUgcHVwcGVyIGFuZCBwbG93ZXIgc2V0IHRvIGVudGlyZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBzdHJpZGUgPSBpbmNyOyAgIC8qIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkICovCisJLy8gICAgICAgICpwbG93ZXIgPSAqcHVwcGVyIC0gaW5jcjsgICAvLyBsZXQgY29tcGlsZXIgYnlwYXNzIHRoZSBpbGxlZ2FsIGxvb3AgKGxpa2UgZm9yKGk9MTtpPDEwO2ktLSkpICBUSElTIExJTkUgQ0FVU0VEIHNoYXBlMkYvaF90ZXN0c18xLmYgVE8gSEFWRSBBIEZBSUxVUkUgT04gQSBaRVJPLVRSSVAgTE9PUCAobG93ZXI9MSxcCisJICB1cHBlcj0wLHN0cmlkZT0xKSAtIEpQSCBKdW5lIDIzLCAyMDA5LgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDooWkVSTyBUUklQKSBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgc2lnbmVkPzwlcz4sIGxvYyA9ICUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlLCBsb2MtPnBzb3VyY2UgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIHNjaGVkdHlwZSA+IGttcF9vcmRfdXBwZXIgKSB7CisgICAgICAgIC8vIHdlIGFyZSBpbiBESVNUUklCVVRFIGNvbnN0cnVjdAorICAgICAgICBzY2hlZHR5cGUgKz0ga21wX3NjaF9zdGF0aWMgLSBrbXBfZGlzdHJpYnV0ZV9zdGF0aWM7ICAgICAgLy8gQUM6IGNvbnZlcnQgdG8gdXN1YWwgc2NoZWR1bGUgdHlwZQorICAgICAgICB0aWQgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF90ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfdGVhbS0+dC50X3BhcmVudDsKKyAgICB9IGVsc2UKKyAgICAjZW5kaWYKKyAgICB7CisgICAgICAgIHRpZCAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3RlYW07CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIGlmICJmb3IiIGxvb3AgaXMgYW4gYWN0aXZlIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgIGlmICggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgLyogc2VyaWFsaXplZCBwYXJhbGxlbCwgZWFjaCB0aHJlYWQgZXhlY3V0ZXMgd2hvbGUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwbGFzdGl0ZXIgPSBUUlVFOworICAgICAgICAvKiBsZWF2ZSBwdXBwZXIgYW5kIHBsb3dlciBzZXQgdG8gZW50aXJlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICAqcHN0cmlkZSA9IChpbmNyID4gMCkgPyAoKnB1cHBlciAtICpwbG93ZXIgKyAxKSA6ICgtKCpwbG93ZXIgLSAqcHVwcGVyICsgMSkpOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiAoc2VyaWFsKSBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBudGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgaWYgKCBudGggPT0gMSApIHsKKyAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY29tcHV0ZSB0cmlwIGNvdW50ICovCisgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyIC0gKnBsb3dlciArIDE7CisgICAgfSBlbHNlIGlmIChpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBpbmNyID4gMSApIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAoKnB1cHBlciAtICpwbG93ZXIpIC8gaW5jciArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKCpwbG93ZXIgLSAqcHVwcGVyKSAvICggLWluY3IgKSArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIC8qIHRyaXBjb3VudCBvdmVyZmxvdz8gKi8KKyAgICAgICAgaWYgKCB0cmlwX2NvdW50ID09IDAgJiYgKnB1cHBlciAhPSAqcGxvd2VyICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbXB1dGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBzd2l0Y2ggKCBzY2hlZHR5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmlwX2NvdW50IDwgbnRoICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgICAgICAgICApOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKCB0aWQgPCB0cmlwX2NvdW50ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IHRyaXBfY291bnQgLSAxICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBzbWFsbF9jaHVuayA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGlkICogc21hbGxfY2h1bmsgKyAoIHRpZCA8IGV4dHJhcyA/IHRpZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc21hbGxfY2h1bmsgKiBpbmNyIC0gKCB0aWQgPCBleHRyYXMgPyAwIDogaW5jciApOworICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKCB0aWQgPT0gbnRoIC0gMSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgYmlnX2NodW5rX2luY19jb3VudCA9ICggdHJpcF9jb3VudC9udGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggdHJpcF9jb3VudCAlIG50aCApID8gMSA6IDApICkgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIG9sZF91cHBlciA9ICpwdXBwZXI7CisKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorCisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gdGlkICogYmlnX2NodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBiaWdfY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKnB1cHBlciA8ICpwbG93ZXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om14OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gb2xkX3VwcGVyICYmICpwdXBwZXIgPiBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyID4gb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKnB1cHBlciA+ICpwbG93ZXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gb2xkX3VwcGVyICYmICpwdXBwZXIgPCBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyIDwgb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBUIHNwYW47CisgICAgICAgICAgICBpZiAoIGNodW5rIDwgMSApIHsKKyAgICAgICAgICAgICAgICBjaHVuayA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBzdHJpZGUgPSBzcGFuICogbnRoOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgLyogVE9ETzogaXMgdGhlIGZvbGxvd2luZyBsaW5lIGEgYnVnPyAgU2hvdWxkbid0IGl0IGJlIHBsYXN0aXRlciBpbnN0ZWFkIG9mICpwbGFzdGl0ZXIgPyAqLworICAgICAgICAgICAgaWYgKCpwbGFzdGl0ZXIpIHsgLyogb25seSBjYWxjdWxhdGUgdGhpcyBpZiBpdCB3YXMgcmVxdWVzdGVkICovCisgICAgICAgICAgICAgICAga21wX2ludDMyIGxhc3R0aWQgPSAoKHRyaXBfY291bnQgLSAxKSAvICggVVQgKWNodW5rKSAlIG50aDsKKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKHRpZCA9PSBsYXN0dGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVDIoIDAsICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtICAgIGxvYyAgICAgICBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtICAgIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIGlkIG9mIHRoaXMgdGhyZWFkCitAcGFyYW0gICAgc2NoZWR0eXBlICBTY2hlZHVsaW5nIHR5cGUKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kCitAcGFyYW0gICAgcHN0cmlkZSAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZQorQHBhcmFtICAgIGluY3IgICAgICBMb29wIGluY3JlbWVudAorQHBhcmFtICAgIGNodW5rICAgICBUaGUgY2h1bmsgc2l6ZQorCitFYWNoIG9mIHRoZSBmb3VyIGZ1bmN0aW9ucyBoZXJlIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgYXJndW1lbnQgdHlwZXMuCisKK1RoZSBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBhbmQgc3RyaWRlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXQgb2YgaXRlcmF0aW9ucwordG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYnJvdW5kLCBzdHJpZGUsIGluY3JlbWVudCBhbmQgY2h1bmsgc2l6ZS4KKworQHsKKyovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcGxvd2VyLCBrbXBfaW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpwbG93ZXIsIGttcF91aW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQzMiA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBsb3dlciwga21wX2ludDY0ICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQ2NCA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqcGxvd2VyLCBrbXBfdWludDY0ICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50NjQgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKy8qIQorQH0KKyovCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMgYi9yYzEvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3NDVjYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuYwpAQCAtMCwwICsxLDUyMzggQEAKKy8qCisgKiBrbXBfc2V0dGluZ3MuYyAtLSBJbml0aWFsaXplIGVudmlyb25tZW50IHZhcmlhYmxlcworICogJFJldmlzaW9uOiA0MjgxNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0xMSAxNTozMzozNyAtMDYwMCAoTW9uLCAxMSBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworCitzdGF0aWMgaW50IF9fa21wX2Vudl9pc0RlZmluZWQoIGNoYXIgY29uc3QgKiBuYW1lICk7CitzdGF0aWMgaW50IF9fa21wX2Vudl90b1ByaW50KCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IGZsYWcgKTsKKworYm9vbCBfX2ttcF9lbnZfZm9ybWF0ID0gMDsgLy8gMCAtIG9sZCBmb3JtYXQ7IDEgLSBuZXcgZm9ybWF0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgc3RyaW5nIGZ1bmN0aW9ucy4gU3ViamVjdCB0byBtb3ZlIHRvIGttcF9zdHIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBkb3VibGUKK19fa21wX2NvbnZlcnRfdG9fZG91YmxlKCBjaGFyIGNvbnN0ICogcyApCit7CisgICAgZG91YmxlIHJlc3VsdDsKKworICAgIGlmICggc3NjYW5mKCBzLCAiJWxmIiwgJnJlc3VsdCApIDwgMSApIHsKKyAgICAgICAgcmVzdWx0ID0gMC4wOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK19fa21wX3JlYWRzdHJfd2l0aF9zZW50aW5lbChjaGFyICpkZXN0LCBjaGFyIGNvbnN0ICogc3JjLCBzaXplX3QgbGVuLCBjaGFyIHNlbnRpbmVsKSB7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmICgoKnNyYyA9PSAnXDAnKSB8fCAoKnNyYyA9PSBzZW50aW5lbCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICooZGVzdCsrKSA9ICooc3JjKyspOworICAgIH0KKyAgICAqZGVzdCA9ICdcMCc7CisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX21hdGNoX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgc2l6ZV90IGxlbiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBzaXplX3QgbCA9IDA7CisKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICsrbDsKKyAgICAgICAgKythOworICAgICAgICArK2I7CisgICAgfQorICAgIHJldHVybiBsID49IGxlbjsKK30KKworLy8KKy8vIEV4cGVjdGVkIHVzYWdlOgorLy8gICAgIHRva2VuIGlzIHRoZSB0b2tlbiB0byBjaGVjayBmb3IuCisvLyAgICAgYnVmIGlzIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLgorLy8gICAgICplbmQgcmV0dXJucyB0aGUgY2hhciBhZnRlciB0aGUgZW5kIG9mIHRoZSB0b2tlbi4KKy8vICAgICAgICBpdCBpcyBub3QgbW9kaWZpZWQgdW5sZXNzIGEgbWF0Y2ggb2NjdXJzLgorLy8KKy8vCisvLyBFeGFtcGxlIDE6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIDxkbyBzb21ldGhpbmc+CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworLy8gIEV4YW1wbGUgMjoKKy8vCisvLyAgICAgaWYgKF9fa21wX21hdGNoX3N0cigidG9rZW4iLCBidWYsICplbmQpIHsKKy8vICAgICAgICAgY2hhciAqc2F2ZSA9ICoqZW5kOworLy8gICAgICAgICAqKmVuZCA9IHNlbnRpbmVsOworLy8gICAgICAgICA8dXNlIGFueSBvZiB0aGUgX19rbXAqX3dpdGhfc2VudGluZWwoKSBmdW5jdGlvbnM+CisvLyAgICAgICAgICoqZW5kID0gc2F2ZTsKKy8vICAgICAgICAgYnVmID0gZW5kOworLy8gICAgIH0KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX21hdGNoX3N0ciggY2hhciBjb25zdCAqdG9rZW4sIGNoYXIgY29uc3QgKmJ1ZiwgY29uc3QgY2hhciAqKmVuZCkgeworCisgICAgS01QX0FTU0VSVCh0b2tlbiAhPSBOVUxMKTsKKyAgICBLTVBfQVNTRVJUKGJ1ZiAhPSBOVUxMKTsKKyAgICBLTVBfQVNTRVJUKGVuZCAhPSBOVUxMKTsKKworICAgIHdoaWxlICgqdG9rZW4gJiYgKmJ1ZikgeworICAgICAgICBjaGFyIGN0ID0gKnRva2VuLCBjYiA9ICpidWY7CisKKyAgICAgICAgaWYoY3QgPj0gJ2EnICYmIGN0IDw9ICd6JykKKyAgICAgICAgICAgIGN0IC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGN0ICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK3Rva2VuOworICAgICAgICArK2J1ZjsKKyAgICB9CisgICAgaWYgKCp0b2tlbikgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICplbmQgPSBidWY7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjaGFyICoKK19fa21wX3N0cmlwX3F1b3RlcyggY2hhciAqdGFyZ2V0LCBpbnQgbGVuKSB7CisgICAgY2hhciAqZW5kID0gdGFyZ2V0ICsgbGVuIC0gMTsKKworICAgIHdoaWxlKCp0YXJnZXQgPT0gJyInIHx8ICp0YXJnZXQgPT0gJ1wnJykgeworICAgICAgICBpZihlbmQgPD0gdGFyZ2V0IHx8ICgqZW5kICE9ICciJyAmJiAqZW5kICE9ICdcJycpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICplbmQgPSAwOworICAgICAgICAtLWVuZDsKKyAgICAgICAgKnRhcmdldCA9IDA7CisgICAgICAgICsrdGFyZ2V0OworICAgIH0KKyAgICByZXR1cm4gdGFyZ2V0OworfQorCisKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kNGsoIHNpemVfdCBzaXplICkgeworICAgIHNpemVfdCBfNGsgPSA0ICogMTAyNDsKKyAgICBpZiAoIHNpemUgJiAoIF80ayAtIDEgKSApIHsKKyAgICAgICAgc2l6ZSAmPSB+ICggXzRrIC0gMSApOworICAgICAgICBpZiAoIHNpemUgPD0gS01QX1NJWkVfVF9NQVggLSBfNGsgKSB7CisgICAgICAgICAgICBzaXplICs9IF80azsgICAgLy8gUm91bmQgdXAgaWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gc2l6ZTsKK30gLy8gX19rbXBfcm91bmQ0aworCisKK3N0YXRpYyBpbnQKK19fa21wX2NvbnZlcnRfdG9fc2Vjb25kcyggY2hhciBjb25zdCAqIGRhdGEgKQoreworICAgIGludCBudmFsdWVzLCB2YWx1ZSwgZmFjdG9yOworICAgIGNoYXIgbXVsdCwgZXh0cmE7CisKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gKDApOworICAgIHZhbHVlID0gMDsKKyAgICBtdWx0ID0gJ1wwJzsKKyAgICBudmFsdWVzID0gc3NjYW5mIChkYXRhLCAiJWQlYyVjIiwgJnZhbHVlLCAmbXVsdCwgJmV4dHJhKTsKKyAgICBpZiAobnZhbHVlcyA8IDEpIHJldHVybiAoMCk7CisgICAgaWYgKG52YWx1ZXMgPT0gMSkgbXVsdCA9ICdcMCc7CisgICAgaWYgKG52YWx1ZXMgPT0gMykgcmV0dXJuICgtMSk7CisKKyAgICBzd2l0Y2ggKG11bHQpIHsKKyAgICBjYXNlICdzJzogY2FzZSAnUyc6CisgICAgICAgIGZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgZmFjdG9yID0gNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICAgZmFjdG9yID0gNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICAgZmFjdG9yID0gNjAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgICBmYWN0b3IgPSAyNCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmICh2YWx1ZSA+IChJTlRfTUFYIC8gZmFjdG9yKSkKKyAgICAgICAgdmFsdWUgPSBJTlRfTUFYOworICAgIGVsc2UKKyAgICAgICAgdmFsdWUgKj0gZmFjdG9yOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKgorICAgIEhlcmUsIG11bHRpcGxpZXJzIGFyZSBsaWtlIF9fa21wX2NvbnZlcnRfdG9fc2Vjb25kcywgYnV0IGZsb2F0aW5nLXBvaW50CisgICAgdmFsdWVzIGFyZSBhbGxvd2VkLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiBtaWxsaXNlY29uZHMuICBUaGUgZGVmYXVsdAorICAgIG11bHRpcGxpZXIgaXMgbWlsbGlzZWNvbmRzLiAgUmV0dXJucyBJTlRfTUFYIG9ubHkgaWYgdGhlIHZhbHVlIHNwZWNpZmllZAorICAgIG1hdGNoZXMgImluZmluaXQqIi4gIFJldHVybnMgLTEgaWYgc3BlY2lmaWVkIHN0cmluZyBpcyBpbnZhbGlkLgorKi8KK2ludAorX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIGNoYXIgY29uc3QgKiBkYXRhICkKK3sKKyAgICBpbnQgcmV0LCBudmFsdWVzLCBmYWN0b3I7CisgICAgY2hhciBtdWx0LCBleHRyYTsKKyAgICBkb3VibGUgdmFsdWU7CisKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gKC0xKTsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggImluZmluaXQiLCAtMSwgZGF0YSkpIHJldHVybiAoSU5UX01BWCk7CisgICAgdmFsdWUgPSAoZG91YmxlKSAwLjA7CisgICAgbXVsdCA9ICdcMCc7CisgICAgbnZhbHVlcyA9IHNzY2FuZiAoZGF0YSwgIiVsZiVjJWMiLCAmdmFsdWUsICZtdWx0LCAmZXh0cmEpOworICAgIGlmIChudmFsdWVzIDwgMSkgcmV0dXJuICgtMSk7CisgICAgaWYgKG52YWx1ZXMgPT0gMSkgbXVsdCA9ICdcMCc7CisgICAgaWYgKG52YWx1ZXMgPT0gMykgcmV0dXJuICgtMSk7CisKKyAgICBpZiAodmFsdWUgPCAwKSAgICByZXR1cm4gKC0xKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgLyogIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmRzICAqLworICAgICAgICBmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzogY2FzZSAnUyc6CisgICAgICAgIGZhY3RvciA9IDEwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiAyNCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmICggdmFsdWUgPj0gKCAoSU5UX01BWC0xKSAvIGZhY3RvcikgKQorICAgICAgICByZXQgPSBJTlRfTUFYLTE7ICAgICAgICAvKiBEb24ndCBhbGxvdyBpbmZpbml0ZSB2YWx1ZSBoZXJlICovCisgICAgZWxzZQorICAgICAgICByZXQgPSAoaW50KSAodmFsdWUgKiAoZG91YmxlKSBmYWN0b3IpOyAgLyogdHJ1bmNhdGUgdG8gaW50ICAqLworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGttcF91aW50NjQKK19fa21wX2NvbnZlcnRfdG9fbmFub3NlY29uZHMoICAgICAgICAgLy8gUjogVGltZSBpbiBuYW5vc2Vjb25kcywgb3IgfjAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICBjaGFyIGNvbnN0ICogc3RyICAgICAgICAgICAgICAgICAgLy8gSTogU3RyaW5nIHJlcHJlc2VudGluZyB0aW1lLgorKSB7CisKKyAgICBkb3VibGUgICAgIHZhbHVlOyAgICAvLyBQYXJzZWQgdmFsdWUuCisgICAgY2hhciAgICAgICB1bml0OyAgICAgLy8gVW5pdDogJ3MnLCAnbScsICd1Jywgb3IgJ24nLgorICAgIGNoYXIgICAgICAgZXh0cmE7ICAgIC8vIEJ1ZmZlciBmb3IgZXh0cmEgY2hhcmFjdGVyIChpZiBhbnkpLgorICAgIGludCAgICAgICAgcmM7ICAgICAgIC8vIFJldHVybiBjb2RlIG9mIHNzY2FuZigpLgorICAgIGRvdWJsZSAgICAgZmFjdG9yOyAgIC8vIE51bWVyaWMgZmFjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdW5pdC4KKyAgICBrbXBfdWludDY0IHJlc3VsdDsKKworICAgIGlmICggc3RyID09IE5VTEwgfHwgc3RyWyAwIF0gPT0gMCApIHsgICAgLy8gTm8gc3RyaW5nIG9yIGVtcHR5IHN0cmluZy4KKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUuCisgICAgfTsgLy8gaWYKKyAgICByYyA9IHNzY2FuZiggc3RyLCAiJWxmJWMlYyIsICZ2YWx1ZSwgJnVuaXQsICZleHRyYSApOworICAgIHN3aXRjaCAoIHJjICkgeworICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgLy8gVmFsdWUgaXMgbm90IHBhcnNlZC4KKyAgICAgICAgICAgIHJldHVybiB+IDA7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMTogeyAgICAgICAgICAgICAvLyBPbmUgdmFsdWUgcGFyc2VkLCBubyB1bml0IGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIHVuaXQgPSAncyc7ICAgICAgIC8vIFVzZSBkZWZhdWx0IHVuaXQuCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAvLyBWYWx1ZSBhbmQgdW5pdCBhcmUgcGFyc2VkLgorICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAzOiB7ICAgICAgICAgICAgIC8vIEV4dHJhIGNoYXJhY3RlcnMgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgcmV0dXJuIH4gMDsKKyAgICAgICAgfSBicmVhazsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgICBzd2l0Y2ggKCB1bml0ICkgeworICAgICAgICBjYXNlICdzJzogeworICAgICAgICAgICAgZmFjdG9yID0gMS4wRSs5OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICdtJzogeworICAgICAgICAgICAgZmFjdG9yID0gMS4wRSs2OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICd1JzogeworICAgICAgICAgICAgZmFjdG9yID0gMS4wRSszOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICduJzogeworICAgICAgICAgICAgZmFjdG9yID0gMS4wOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWxsZWdhbCB1bml0LgorICAgICAgICAgICAgcmV0dXJuIH4gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGVycm9yLgorICAgICAgICB9IGJyZWFrOworICAgIH07IC8vIHN3aXRjaAorICAgIHJlc3VsdCA9IChrbXBfdWludDY0KSggdmFsdWUgKiBmYWN0b3IgKTsKKyAgICByZXR1cm4gcmVzdWx0OworCit9OyAvLyBmdW5jIF9fa21wX2NvbnZlcnRfdG9fbmFub3NlY29uZHMKKworCitzdGF0aWMgaW50CitfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmI7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gKmEgPworICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmIgOiAxIDoKKyAgICAgICAgKCpiICYmICpiICE9IHNlbnRpbmVsKSA/IC0xIDogMDsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWJsZSBzdHJ1Y3R1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zZXR0aW5nICAgICAgICBrbXBfc2V0dGluZ190OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgICAga21wX3N0Z19zc19kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSAgICBrbXBfc3RnX3dwX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhICAgIGttcF9zdGdfZnJfZGF0YV90OworCit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcGFyc2VfZnVuY190ICkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICk7Cit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcHJpbnRfZnVuY190ICkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApOworCitzdHJ1Y3QgX19rbXBfc2V0dGluZyB7CisgICAgY2hhciBjb25zdCAqICAgICAgICAgbmFtZTsgICAgICAgIC8vIE5hbWUgb2Ygc2V0dGluZyAoZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgIGttcF9zdGdfcGFyc2VfZnVuY190IHBhcnNlOyAgICAgICAvLyBQYXJzZXIgZnVuY3Rpb24uCisgICAga21wX3N0Z19wcmludF9mdW5jX3QgcHJpbnQ7ICAgICAgIC8vIFByaW50IGZ1bmN0aW9uLgorICAgIHZvaWQgKiAgICAgICAgICAgICAgIGRhdGE7ICAgICAgICAvLyBEYXRhIHBhc3NlZCB0byBwYXJzZXIgYW5kIHByaW50ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgc2V0OyAgICAgICAgIC8vIFZhcmlhYmxlIHNldCBkdXJpbmcgdGhpcyAic2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIG9yIGttcF9zZXRfZGVmYXVsdHMoKSBjYWxsKS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWZpbmVkOyAgICAgLy8gVmFyaWFibGUgc2V0IGluIGFueSAic2Vzc2lvbiIuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc2V0dGluZworCitzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgeworICAgIHNpemVfdCAgICAgICAgICAgICBmYWN0b3I7ICAvLyBEZWZhdWx0IGZhY3RvcjogMSBmb3IgS01QX1NUQUNLU0laRSwgMTAyNCBmb3Igb3RoZXJzLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19zc19kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIG9tcDsgICAgIC8vIDAgLS0gS01QX0xJQlJBUlksIDEgLS0gT01QX1dBSVRfUE9MSUNZLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z193cF9kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIGZvcmNlOyAgLy8gMCAtLSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04sIDEgLS0gS01QX0ZPUkNFX1JFRFVDVElPTi4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YQorCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcGFyc2UgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jvb2woCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXQKKykgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbHVlICkgKSB7CisgICAgICAgICogb3V0ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgIEtNUF9NU0coIEJhZEJvb2xWYWx1ZSwgbmFtZSwgdmFsdWUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFZhbGlkQm9vbFZhbHVlcyApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYm9vbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIHNpemVfdCAgICAgICBzaXplX21pbiwKKyAgICBzaXplX3QgICAgICAgc2l6ZV9tYXgsCisgICAgaW50ICogICAgICAgIGlzX3NwZWNpZmllZCwKKyAgICBzaXplX3QgKiAgICAgb3V0LAorICAgIHNpemVfdCAgICAgICBmYWN0b3IKKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgPSBOVUxMOworICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIHNpemVfbWluID0gX19rbXBfcm91bmQ0ayggc2l6ZV9taW4gKTsKKyAgICAgICAgc2l6ZV9tYXggPSBfX2ttcF9yb3VuZDRrKCBzaXplX21heCApOworICAgICNlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgaWYgKCBpc19zcGVjaWZpZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogaXNfc3BlY2lmaWVkID0gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX3RvX3NpemUoIHZhbHVlLCBvdXQsIGZhY3RvciwgJiBtc2cgKTsKKyAgICAgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmICggKiBvdXQgPiBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWluOworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm91bmQ0ayA9IF9fa21wX3JvdW5kNGsoICogb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKiBvdXQgIT0gcm91bmQ0ayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICogb3V0ID0gcm91bmQ0azsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggTm90TXVsdGlwbGU0SyApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJyZWQsICogb3V0ID09IEtNUF9TSVpFX1RfTUFYLiBDdXQgaXQgdG8gc2l6ZV9tYXggc2lsZW50bHkuCisgICAgICAgICAgICBpZiAoICogb3V0IDwgc2l6ZV9taW4gKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAqIG91dCA+ICBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoICYgYnVmLCAqIG91dCApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgYnVmLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZiApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zaXplCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RyKAorICAgIGNoYXIgY29uc3QgKiAgICAgIG5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgdmFsdWUsCisgICAgY2hhciBjb25zdCAqICogICAgb3V0CispIHsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiBvdXQgKTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdHIKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ludCgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwgICAvLyBJOiBOYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICh1c2VkIGluIHdhcm5pbmcgbWVzc2FnZXMpLgorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwgIC8vIEk6IFZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBhcnNlLgorICAgIGludCAgICAgICAgICBtaW4sICAgIC8vIEk6IE1pbWluYWwgYWxsb3dlZCB2YWx1ZS4KKyAgICBpbnQgICAgICAgICAgbWF4LCAgICAvLyBJOiBNYXhpbXVtIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICogICAgICAgIG91dCAgICAgLy8gTzogT3V0cHV0IChwYXJzZWQpIHZhbHVlLgorKSB7CisgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgIGttcF91aW50NjQgICB1aW50ID0gKiBvdXQ7CisgICAgX19rbXBfc3RyX3RvX3VpbnQoIHZhbHVlLCAmIHVpbnQsICYgbXNnICk7CisgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0gZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgdWludCA9IG1heDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBvdmVyZmxvdyBvY2N1cnJlZCBtc2cgY29udGFpbnMgZXJyb3IgbWVzc2FnZSBhbmQgdWludCBpcyB2ZXJ5IGJpZy4gQ3V0IHRtcCBpdAorICAgICAgICAvLyB0byBJTlRfTUFYLgorICAgICAgICBpZiAoIHVpbnQgPCAodW5zaWduZWQgaW50KW1pbiApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiUiIEtNUF9VSU5UNjRfU1BFQyAiIiwgdWludCApOworICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50NjRfVmFsdWUsIG5hbWUsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmYnVmICk7CisgICAgfTsgLy8gaWYKKyAgICAqIG91dCA9IHVpbnQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbnQKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZpbGUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGNoYXIgKiAgICAgICBzdWZmaXgsCisgICAgY2hhciAqICogICAgIG91dAorKSB7CisgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICBjaGFyICp0OworICAgIGludCBoYXNTdWZmaXg7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogb3V0ICk7CisgICAgdCA9IChjaGFyICopIHN0cnJjaHIodmFsdWUsICcuJyk7CisgICAgaGFzU3VmZml4ID0gdCAmJiBfX2ttcF9zdHJfZXFmKCB0LCBzdWZmaXggKTsKKyAgICB0ID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzJXMiLCB2YWx1ZSwgaGFzU3VmZml4ID8gIiIgOiBzdWZmaXggKTsKKyAgICBfX2ttcF9leHBhbmRfZmlsZV9uYW1lKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCB0KTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSh0KTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZmlsZQorCitzdGF0aWMgY2hhciAqIHBhcl9yYW5nZV90b19wcmludCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X3JhbmdlLAorICAgIGNoYXIgKiAgICAgICBvdXRfcm91dGluZSwKKyAgICBjaGFyICogICAgICAgb3V0X2ZpbGUsCisgICAgaW50ICogICAgICAgIG91dF9sYiwKKyAgICBpbnQgKiAgICAgICAgb3V0X3ViCispIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKCB2YWx1ZSArIDEgKTsKKyAgICBwYXJfcmFuZ2VfdG9fcHJpbnQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKzEgKTsKKyAgICBzdHJuY3B5KCBwYXJfcmFuZ2VfdG9fcHJpbnQsIHZhbHVlLCBsZW4gKyAxKTsKKyAgICBfX2ttcF9wYXJfcmFuZ2UgPSArMTsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworICAgIF9fa21wX3Bhcl9yYW5nZV91YiA9IElOVF9NQVg7CisgICAgZm9yICg7OykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgICBpZiAoKCB2YWx1ZSA9PSBOVUxMICkgfHwgKCAqdmFsdWUgPT0gJ1wwJyApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicm91dGluZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9yb3V0aW5lLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAtIDEsICcsJyApOworICAgICAgICAgICAgaWYgKCBsZW4gPT0gMCApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJmaWxlbmFtZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9maWxlLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicmFuZ2UiLCB2YWx1ZSwgJz0nICkpCisgICAgICAgICAgfHwgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImluY2xfcmFuZ2UiLCB2YWx1ZSwgJz0nICkpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggc3NjYW5mKCB2YWx1ZSwgIiVkOiVkIiwgb3V0X2xiLCBvdXRfdWIgKSAhPSAyICkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dF9yYW5nZSA9ICsxOworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImV4Y2xfcmFuZ2UiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgaWYgKCBzc2NhbmYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YikgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSAtMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBhcl9yYW5nZV9lcnJvcjoKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhclJhbmdlU3ludGF4LCBuYW1lICk7CisgICAgICAgIF9fa21wX3Bhcl9yYW5nZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZQorCisKK2ludAorX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICkKK3sKKyAgICBpbnQgbnRoID0gMzI7CisKKyAgICAvKiBNSU4oIE1BWCggMzIsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoKSAqLworICAgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgICAgIG50aCA9ICg0ICogcmVxX25wcm9jKTsKKyAgICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgICAgIG50aCA9ICg0ICogX19rbXBfeHByb2MpOworCisgICAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgICAgIG50aCA9IF9fa21wX21heF9udGg7CisKKyAgICByZXR1cm4gbnRoOworfQorCisKK2ludAorX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSggaW50IHJlcV9ucHJvYywgaW50IG1heF9udGgsIGludCBhbGxfdGhyZWFkc19zcGVjaWZpZWQpIHsKKyAgICBpbnQgbnRoID0gMTI4OworCisgICAgaWYoYWxsX3RocmVhZHNfc3BlY2lmaWVkKQorICAgICAgICByZXR1cm4gbWF4X250aDsKKyAgICAvKiBNSU4oIE1BWCAoMTI4LCA0ICogJE9NUF9OVU1fVEhSRUFEUywgNCAqIG9tcF9nZXRfbnVtX3Byb2NzKCkgKSwgX19rbXBfbWF4X250aCApICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHByaW50IGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ib29sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9CT09MOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ib29sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW50KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9JTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JWRcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW50CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdWludDY0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwga21wX3VpbnQ2NCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3VpbnQ2NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0cigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfU1RSOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0cgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBzaXplX3QgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgdmFsdWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zaXplCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIE9NUF9USFJFQURfTElNSVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc2V0dGluZ190ICogKiByaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgcmM7CisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIF9fa21wX21heF9udGggPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDEsIF9fa21wX3N5c19tYXhfbnRoLCAmIF9fa21wX21heF9udGggKTsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfbWF4X250aCA9PSAlZFxuIiwgX19rbXBfbWF4X250aCApICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX21heF9udGggKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9CTE9DS1RJTUUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIHZhbHVlICk7CisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IDAgKSB7CisgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX0RFRkFVTFRfQkxPQ0tUSU1FOworICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSA9IEZBTFNFOyAgLy8gUmV2ZXJ0IHRvIGRlZmF1bHQgYXMgaWYgdmFyIG5vdCBzZXQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUlOX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIFNtYWxsVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNaW5WYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNYXhWYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gVFJVRTsgICAgLy8gS01QX0JMT0NLVElNRSB3YXMgc3BlY2lmaWVkLgorICAgIH07IC8vIGlmCisgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBtb25pdG9yIHRocmVhZCB3YWtldXAgaW50ZXJ2YWxzIGNvcnJlc29uZGluZyB0byBibG9ja3RpbWUuCisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9lbnZfYmxvY2t0aW1lID09ICVkXG4iLCBfX2ttcF9lbnZfYmxvY2t0aW1lICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9ibG9ja3RpbWUgKSB7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2RmbHRfYmxvY2t0aW1lICkgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ibG9ja3RpbWUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0RVUExJQ0FURV9MSUJfT0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvKiBhY3R1YWxseSB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQsCisgICAgICAgcHV0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIGJ1aWxkcyBhbmQgZm9yIHN0YXRpYy9keW5hbWljIGNvbWJpbmF0aW9uICovCisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTkhFUklUX0ZQX0NPTlRST0wKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2woIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MSUJSQVJZLCBPTVBfV0FJVF9QT0xJQ1kKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3dwX2RhdGFfdCAqIHdhaXQgPSAoa21wX3N0Z193cF9kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgd2FpdC0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIHdhaXQtPm9tcCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJBQ1RJVkUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJQQVNTSVZFIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJzZXJpYWwiLCAxLCB2YWx1ZSApICkgeyAgICAgICAgICAgICAvKiBTICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3NlcmlhbDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyb3VnaHB1dCIsIDIsIHZhbHVlICkgKSB7ICAvKiBUSCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0dXJuYXJvdW5kIiwgMiwgdmFsdWUgKSApIHsgIC8qIFRVICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRlZGljYXRlZCIsIDEsIHZhbHVlICkgKSB7ICAgLyogRCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJtdWx0aXVzZXIiLCAxLCB2YWx1ZSApICkgeyAgIC8qIE0gKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkoIF9fa21wX2xpYnJhcnkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3kKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z193cF9kYXRhX3QgKiB3YWl0ID0gKGttcF9zdGdfd3BfZGF0YV90ICopIGRhdGE7CisgICAgY2hhciBjb25zdCAqICAgICAgICB2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAoIHdhaXQtPm9tcCApIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gIkFDVElWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiUEFTU0lWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJzZXJpYWwiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInR1cm5hcm91bmQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInRocm91Z2hwdXQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsCisgICAgICAgIHZhbHVlLAorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsCisgICAgICAgIEtNUF9NQVhfU1RLU0laRSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9tb25pdG9yX3N0a3NpemUsCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBpZiAoICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwICkKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDAgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCAmJiBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TRVRUSU5HUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc2V0dGluZ3MgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zZXR0aW5ncyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLT0ZGU0VUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIEtNUF9NSU5fU1RLT0ZGU0VULCAgICAgICAgICAgICAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgJiBfX2ttcF9zdGtvZmZzZXQsICAgICAgICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja29mZnNldCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX3N0a29mZnNldCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLU0laRSwgT01QX1NUQUNLU0laRSwgR09NUF9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja3NpemUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCBzdGFja3NpemUtPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgbmFtZQorICAgICAgICB2YWx1ZSwgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLCAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtTSVpFLCAgICAgICAgICAvLyBNYXggdmFsdWUKKyAgICAgICAgJiBfX2ttcF9lbnZfc3Rrc2l6ZSwgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a3NpemUsICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIHN0YWNrc2l6ZS0+ZmFjdG9yCisgICAgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBwcmludGluZyBib3RoIEtNUF9TVEFDS1NJWkUgKGZhY3RvciBpcyAxKSBhbmQgT01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEwMjQpLgorLy8gQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcmludCBPTVBfU1RBQ0tTSVpFIHZhbHVlIGluIGJ5dGVzLiBXZSBjYW4gY29uc2lkZXIgYWRkaW5nIHRoaXMKKy8vIHBvc3NpYmlsaXR5IGJ5IGEgY3VzdG9tZXIgcmVxdWVzdCBpbiBmdXR1cmUuCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGttcF9zdGdfc3NfZGF0YV90ICogIHN0YWNrc2l6ZSA9IChrbXBfc3RnX3NzX2RhdGFfdCAqKSBkYXRhOworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSIsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIChfX2ttcF9zdGtzaXplICUgMTAyNCkgPyBfX2ttcF9zdGtzaXplIC8gc3RhY2tzaXplLT5mYWN0b3IgOiBfX2ttcF9zdGtzaXplICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIlxuIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfVkVSU0lPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF92ZXJzaW9uICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3ZlcnNpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1dBUk5JTkdTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyApOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyAhPSBrbXBfd2FybmluZ3Nfb2ZmKSB7ICAgLy8gQUM6IHdlIGhhdmUgb25seSAwLzEgdmFsdWVzIGRvY3VtZW50ZWQsCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2V4cGxpY2l0OyAvLyAgICAgc28gcmVzZXQgaXQgdG8gZXhwbGljaXQgaW4gb3JkZXIgdG8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkaXN0aW5ndWlzaCBmcm9tIGRlZmF1bHQgc2V0dGluZworfSAvLyBfX2ttcF9lbnZfcGFyc2Vfd2FybmluZ3MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YXJuaW5ncygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7IC8vIEFDOiBUT0RPOiBjaGFuZ2UgdG8gcHJpbnRfaW50PworfSAvLyBfX2ttcF9lbnZfcHJpbnRfd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAobmVlZHMgZG9jdW1lbnRhdGlvbiBjaGFuZ2UpLi4uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9ORVNURUQsIE9NUF9OVU1fVEhSRUFEUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25lc3RlZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9uZXN0ZWQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X25lc3RlZCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJzZV9uZXN0ZWRfbnVtX3RocmVhZHMoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LCBrbXBfbmVzdGVkX250aHJlYWRzX3QgKm50aF9hcnJheSApCit7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IGVudjsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gbmV4dDsKKworICAgIGludCB0b3RhbCA9IDA7ICAgICAgICAgIC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICAgIGludCBwcmV2X2NvbW1hID0gRkFMU0U7IC8vIEZvciBjb3JyZWN0IHByb2Nlc3Npbmcgc2VxdWVudGlhbCBjb21tYXMKKworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBlbnYuIHZhciBzdHJpbmcKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKworICAgICAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSA9PiBlbmQgb2YgbGlzdAorICAgICAgICBpZiAoICggKCAqbmV4dCA8ICcwJyApIHx8ICggKm5leHQgPiAnOScgKSApICYmICggKm5leHQgIT0nLCcpICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaXMgdGhlIGZpc3J0IGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgICAgICAgbmV4dCsrOyAvL3NraXAgJywnCisgICAgICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgICAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3BhY2VzTm90QWxsb3dlZCwgdmFyLCBlbnYgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTeW50YXhFcnJvciwgdmFyLCBlbnYgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZXhpc3RzCisgICAgaWYgKCAhIG50aF9hcnJheS0+bnRoICkgeworICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBkb3VibGUgc2l6ZQorICAgICAgICBudGhfYXJyYXktPm50aCA9ICggaW50ICogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKiB0b3RhbCAqIDIgKTsKKyAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIG50aF9hcnJheS0+c2l6ZSA9IHRvdGFsICogMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgdGhlIGFycmF5IHNpemUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPnNpemUgKj0gMjsKKyAgICAgICAgICAgIH0gd2hpbGUgKCBudGhfYXJyYXktPnNpemUgPCB0b3RhbCApOworCisgICAgICAgICAgICBudGhfYXJyYXktPm50aCA9IChpbnQgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGgsIHNpemVvZiggaW50ICkgKiBudGhfYXJyYXktPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggbnRoX2FycmF5LT5udGggPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG50aF9hcnJheS0+dXNlZCA9IHRvdGFsOworICAgIGludCBpID0gMDsKKworICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICB0b3RhbCA9IDA7CisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIGFycmF5CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTS0lQX1dTKCBzY2FuICk7CisgICAgICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBlcXVhbCB0byBfX2ttcF9hdmFpbF9wcm9jIGJ1dCBpdCBpcyB1bmtub3duIGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgICAgICAgLy8gU28gbGV0J3MgcHV0IGEgcGxhY2Vob2xkZXIgKCN0aHJlYWRzID0gMCkgdG8gY29ycmVjdCBpdCBsYXRlci4KKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gMDsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfWVsc2UgaWYgKCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIC8vIE51bSB0aHJlYWRzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsZXZlbAorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2ldID0gbnRoX2FycmF5LT5udGhbaSAtIDFdOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBzY2FuKys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKnNjYW4gPj0gJzAnICYmICpzY2FuIDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBzY2FuOworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIHNjYW4gKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKnNjYW4gKTsKKyAgICAgICAgICAgIGlmICggbnVtIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX01JTl9OVEg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIHZhciwgZW52LCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIHZhciwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvcHRpb24uIE9NUF9OVU1fVEhSRUFEUyBpcyBhIGxpc3Qgb2YgcG9zaXRpdmUgaW50ZWdlcnMhCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIFRoZSBhcnJheSBvZiAxIGVsZW1lbnQKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGggPSAoIGludCogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gX19rbXBfbmVzdGVkX250aC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGhbMF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggbmFtZSwgdmFsdWUsICYgX19rbXBfbmVzdGVkX250aCApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgubnRoICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25lc3RlZF9udGgubnRoWzBdOworICAgICAgICAgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgX19rbXBfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfZGZsdF90ZWFtX250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07IC8vIGlmCisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X3RlYW1fbnRoID09ICVkXG4iLCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZidWYgKTsKKyAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfbmVzdGVkX250aC51c2VkOyBpKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlZCIsIF9fa21wX25lc3RlZF9udGgubnRoW2ldICk7CisgICAgICAgICAgICBpZiAoIGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIsIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZW5NUCAzLjA6IEtNUF9UQVNLSU5HLCBPTVBfTUFYX0FDVElWRV9MRVZFTFMsCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNraW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgKGludCl0c2ttX21heCwgKGludCAqKSZfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNraW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgMSwgKGludCAqKSZfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisJIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSEFORExFX1NJR05BTFMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKwlfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfaGFuZGxlX3NpZ25hbHMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9oYW5kbGVfc2lnbmFscyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfWF9ERUJVRywgS01QX0RFQlVHLCBLTVBfREVCVUdfQlVGXyosIEtNUF9ESUFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2RlZmluZSBLTVBfU1RHX1hfREVCVUcoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlXyMjeCMjX2RlYnVnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsgICAgIFwKKwlfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBrbXBfIyN4IyNfZGVidWcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvKiBfX2ttcF9zdGdfcGFyc2VfeF9kZWJ1ZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfIyN4IyNfZGVidWcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsgXAorCV9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwga21wXyMjeCMjX2RlYnVnICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIF9fa21wX3N0Z19wcmludF94X2RlYnVnICovCisKK0tNUF9TVEdfWF9ERUJVRyggYSApCitLTVBfU1RHX1hfREVCVUcoIGIgKQorS01QX1NUR19YX0RFQlVHKCBjICkKK0tNUF9TVEdfWF9ERUJVRyggZCApCitLTVBfU1RHX1hfREVCVUcoIGUgKQorS01QX1NUR19YX0RFQlVHKCBmICkKKworI3VuZGVmIEtNUF9TVEdfWF9ERUJVRworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgZGVidWcgPSAwOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGRlYnVnICk7CisgICAgaWYgKCBrbXBfYV9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9hX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9iX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2JfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2NfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfY19kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZF9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9kX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9lX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2VfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2ZfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZl9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1ZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RlYnVnX2J1ZiApOworICAgIC8vICEhISBUT0RPOiBNb3ZlIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBvZiBvZiB0aGlzIGZpbGUhIEl0IG1heSB3b3JrcyBpbmNvcnJlY3RseSBpZgorICAgIC8vIEtNUF9ERUJVR19CVUYgaXMgcGFyc2VkIGJlZm9yZSBLTVBfREVCVUdfQlVGX0xJTkVTIG9yIEtNUF9ERUJVR19CVUZfQ0hBUlMuCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisJaW50IGk7CisJaW50IGVsZW1lbnRzID0gX19rbXBfZGVidWdfYnVmX2xpbmVzICogX19rbXBfZGVidWdfYnVmX2NoYXJzOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYWxsIGVudHJpZXMgaW4gZGVidWcgYnVmZmVyIHRvIGVtcHR5ICovCisJX19rbXBfZGVidWdfYnVmZmVyID0gKGNoYXIgKikgX19rbXBfcGFnZV9hbGxvY2F0ZSggZWxlbWVudHMgKiBzaXplb2YoIGNoYXIgKSApOworCWZvciAoIGkgPSAwOyBpIDwgZWxlbWVudHM7IGkgKz0gX19rbXBfZGVidWdfYnVmX2NoYXJzICkKKwkgICBfX2ttcF9kZWJ1Z19idWZmZXJbaV0gPSAnXDAnOworCisJX19rbXBfZGVidWdfY291bnQgPSAwOworICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2RlYnVnX2J1ZiA9ICVkXG4iLCBfX2ttcF9kZWJ1Z19idWYgKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGVidWdfYnVmX2F0b21pYyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2NoYXJzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorCW5hbWUsCisJdmFsdWUsCisJS01QX0RFQlVHX0JVRl9DSEFSU19NSU4sCisJSU5UX01BWCwKKwkmIF9fa21wX2RlYnVnX2J1Zl9jaGFycworICAgICk7Cit9IC8vIF9fa21wX3N0Z19kZWJ1Z19wYXJzZV9idWZfY2hhcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9jaGFycyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2NoYXJzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorCW5hbWUsCisJdmFsdWUsCisJS01QX0RFQlVHX0JVRl9MSU5FU19NSU4sCisJSU5UX01BWCwKKwkmIF9fa21wX2RlYnVnX2J1Zl9saW5lcworICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGlhZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYga21wX2RpYWcgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RpYWcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kaWFnKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBrbXBfZGlhZyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGlhZworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTElHTl9BTExPQworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIENBQ0hFX0xJTkUsCisgICAgICAgIElOVF9NQVgsCisgICAgICAgIE5VTEwsCisgICAgICAgICYgX19rbXBfYWxpZ25fYWxsb2MsCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9hbGlnbl9hbGxvYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVIsIEtNUF9GT1JLSk9JTl9CQVJSSUVSLCBLTVBfUkVEVUNUSU9OX0JBUlJJRVIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSB2YXJpYmFsZSwgcmVtb3ZlIGxvb3BzIGZyb20gcGFyc2UgYW5kIHByaW50CisvLyAgICAgICBmdW5jdGlvbnMsIHBhc3MgcmVxdWlyZWQgaW5mbyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisKKyAgICAvKiAtLS0tLS0tLS0tIEJhcnJpZXIgYnJhbmNoIGJpdCBjb250cm9sIC0tLS0tLS0tLS0tLSAqLworCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisKKyAgICAgICAgaWYgKCAoIHN0cmNtcCggdmFyLCBuYW1lKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBjaGFyICAgKmNvbW1hOworCisgICAgICAgICAgICBjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA9ICgga21wX3VpbnQzMiApIF9fa21wX3N0cl90b19pbnQoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIC8qIGlzIHRoZXJlIGEgc3BlY2lmaWVkIHJlbGVhc2UgcGFyYW1ldGVyPyAqLworICAgICAgICAgICAgaWYgKCBjb21tYSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gKGttcF91aW50MzIpIF9fa21wX3N0cl90b19pbnQoIGNvbW1hICsgMSwgMCApOworCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEgKSwgX19rbXBfbXNnX251bGwgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICk7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA9ICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtfRElBRygxLCAoIiVzID09ICVkLCVkXG4iLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSwgXAorICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKSkKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wKCB2YXIsIG5hbWUpID09IDAgICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKTsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRPRE86IFJlbW92ZSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSB2YXJpYWJsZSwgcmVtb3ZlIGxvb3BzIGZyb20gcGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucywKKy8vICAgICAgIHBhc3MgcmVxdWlyZWQgZGF0YSB0byBmdW5jdGlvbnMgdGhyb3VnaCBkYXRhIGFyZ3VtZW50LgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBtZXRob2QgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworCisgICAgICAgIGlmICggKCBzdHJjbXAgKCB2YXIsIG5hbWUgKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBmaXJzdCBwYXJhbWV0ZXI6IGdhdGhlciBwYXR0ZXJuICovCisgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgajxicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgdmFsdWUsIDEsICcsJyApKSB7CisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBqID09IGJwX2xhc3RfYmFyICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIGJwX2xpbmVhcl9iYXIgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgc2Vjb25kIHBhcmFtZXRlcjogcmVsZWFzZSBwYXR0ZXJuICovCisgICAgICAgICAgICBpZiAoIGNvbW1hICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgZm9yICggaiA9IGJwX2xpbmVhcl9iYXI7IGogPCBicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbal0sIDEsIGNvbW1hICsgMSApICkgeworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGJwX2xhc3RfYmFyKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworICAgICAgICBpZiAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICBpbnQgaiA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpbnQgayA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuIFsgaSBdOworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJXMnXG4iLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGogXSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgWyBrIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BQk9SVF9ERUxBWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBVbml0cyBvZiBLTVBfREVMQVlfQUJPUlQgYXJlIHNlY29uZHMsIHVuaXRzIG9mIF9fa21wX2Fib3J0X2RlbGF5IGlzIG1pbGxpc2Vjb25kcy4KKyAgICBpbnQgZGVsYXkgPSBfX2ttcF9hYm9ydF9kZWxheSAvIDEwMDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVggLyAxMDAwLCAmIGRlbGF5ICk7CisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSBkZWxheSAqIDEwMDA7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hYm9ydF9kZWxheSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NQVUlORk9fRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0ciggbmFtZSwgdmFsdWUsICYgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfY3B1aW5mb19maWxlID09ICVzXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKSApOworICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2NwdWluZm9fZmlsZSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30gLy9fX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JDRV9SRURVQ1RJT04sIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGttcF9zdGdfZnJfZGF0YV90ICogcmVkdWN0aW9uID0gKGttcF9zdGdfZnJfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJlZHVjdGlvbi0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCByZWR1Y3Rpb24tPmZvcmNlICkgeworICAgICAgICBpZiggdmFsdWUgIT0gMCApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJjcml0aWNhbCIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggImF0b21pYyIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJ0cmVlIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFVua25vd25Gb3JjZVJlZHVjdGlvbiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgICAgIGlmKCBfX2ttcF9kZXRlcm1fcmVkICkgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09ICVkXG4iLCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiY3JpdGljYWwiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiYXRvbWljIik7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gdHJlZV9yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ0cmVlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgfQorCisKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RPUkFHRV9NQVAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICAidmVyYm9zZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwICAgICAgICAgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gVFJVRTsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgPSBUUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc3RvcmFnZV9tYXAgKTsgLy8gISEhCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgfHwgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInZlcmJvc2UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RvcmFnZV9tYXAgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPyBfX2ttcF9tYXhfbnRoIDogMSwgX19rbXBfbWF4X250aCwKKyAgICAgICAgJiBfX2ttcF90cF9jYXBhY2l0eSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdHBfY2FwYWNpdHkgKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3JlaWduX3RwICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIEtNUF9UT1BPTE9HWV9NRVRIT0QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8vCisvLyBQYXJzZSB0aGUgcHJvYyBpZCBsaXN0LiAgUmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsCisgICAgY29uc3QgY2hhciAqKm5leHRFbnYsIGNoYXIgKipwcm9jbGlzdCApCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IGVudjsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBpbnQgZW1wdHkgPSBUUlVFOworCisgICAgKnByb2NsaXN0ID0gTlVMTDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpuZXh0ID09ICd7JykgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ3snCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd9JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIC8vCisgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgIGlmIChlbXB0eSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAgICAvLworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoZW5kID49IDApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICc6JykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnOicKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIERvIHNvbWUgcmFuZ2UgY2hlY2tzLgorICAgICAgICAvLworICAgICAgICBpZiAoc3RyaWRlID09IDApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZaZXJvU3RyaWRlLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0YXJ0R3JlYXRlckVuZCwgdmFyLCBzdGFydCwgZW5kICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0cmlkZUxlc3NaZXJvLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPiA2NTUzNiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZSYW5nZVRvb0JpZywgdmFyLCBlbmQsIHN0YXJ0LCBzdHJpZGUgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpuZXh0RW52ID0gbmV4dDsKKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IG5leHQgLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIG1lbWNweShyZXRsaXN0LCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwcm9jbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBJZiBLTVBfQUZGSU5JVFkgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYSB0eXBlLCB0aGVuCisvLyBfX2ttcF9hZmZpbml0eV9ub3R5cGUgc2hvdWxkIHBvaW50IHRvIGl0cyBzZXR0aW5nLgorLy8KK3N0YXRpYyBrbXBfc2V0dGluZ190ICpfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGVudW0gYWZmaW5pdHlfdHlwZSAgKiBvdXRfdHlwZSwKKyAgICBjaGFyICAgICAgICAgICAgICAgICoqIG91dF9wcm9jbGlzdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3ZlcmJvc2UsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF93YXJuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfcmVzcGVjdCwKKyAgICBlbnVtIGFmZmluaXR5X2dyYW4gICogb3V0X2dyYW4sCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9ncmFuX2xldmVscywKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X2R1cHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9jb21wYWN0LAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfb2Zmc2V0CispCit7CisgICAgY2hhciAqIGJ1ZmZlciA9IE5VTEw7ICAgIC8vIENvcHkgb2YgZW52IHZhciB2YWx1ZS4KKyAgICBjaGFyICogYnVmICAgID0gTlVMTDsgICAgLy8gQnVmZmVyIGZvciBzdHJ0b2tfcigpIGZ1bmN0aW9uLgorICAgIGNoYXIgKiBuZXh0ID0gTlVMTDsgICAgICAvLyBlbmQgb2YgdG9rZW4gLyBzdGFydCBvZiBuZXh0LgorICAgIGNvbnN0IGNoYXIgKiBzdGFydDsgICAgICAvLyBzdGFydCBvZiBjdXJyZW50IHRva2VuIChmb3IgZXJyIG1zZ3MpCisgICAgaW50ICAgIGNvdW50ICA9IDA7ICAgICAgIC8vIENvdW50ZXIgb2YgcGFyc2VkIGludGVnZXIgbnVtYmVycy4KKyAgICBpbnQgICAgbnVtYmVyWyAyIF07ICAgICAgLy8gUGFyc2VkIG51bWJlcnMuCisKKyAgICAvLyBHdWFyZHMuCisgICAgaW50IHR5cGUgICAgICAgICA9IDA7CisgICAgaW50IHByb2NsaXN0ICAgICA9IDA7CisgICAgaW50IG1heF9wcm9jbGlzdCA9IDA7CisgICAgaW50IHZlcmJvc2UgICAgICA9IDA7CisgICAgaW50IHdhcm5pbmdzICAgICA9IDA7CisgICAgaW50IHJlc3BlY3QgICAgICA9IDA7CisgICAgaW50IGdyYW4gICAgICAgICA9IDA7CisgICAgaW50IGR1cHMgICAgICAgICA9IDA7CisKKyAgICBLTVBfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudk1pZGRsZVdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgYnVmZmVyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgdmFsdWUgKTsgICAgICAgICAvLyBDb3B5IGVudiB2YXIgdG8ga2VlcCBvcmlnaW5hbCBpbnRhY3QuCisgICAgYnVmID0gYnVmZmVyOworICAgIFNLSVBfV1MoYnVmKTsKKworICAgIC8vIEhlbHBlciBtYWNyb3MuCisKKyAgICAvLworICAgIC8vIElmIHdlIHNlZSBhIHBhcnNlIGVycm9yLCBlbWl0IGEgd2FybmluZyBhbmQgc2NhbiB0byB0aGUgbmV4dCAiLCIuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBwcmludCBhbiBlcnJvcgorICAgIC8vIG1lc3NhZ2UsIGhvcGVmdWxseSB3aXRob3V0IG92ZXJ3cml0dGluZyBwZWljZXMgb2YgYnVmLgorICAgIC8vCisgICAgI2RlZmluZSBFTUlUX1dBUk4oc2tpcCxlcnJsaXN0KSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaCA9ICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfV0FSTklORyBlcnJsaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9IGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICcsJykgbmV4dCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBidWYgPSBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgICNkZWZpbmUgX3NldF9wYXJhbShfZ3VhcmQsX3ZhcixfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfZ3VhcmQgPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF92YXIgPSBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgX2d1YXJkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIHNldF90eXBlKHZhbCkgICAgICAgICAgX3NldF9wYXJhbSggdHlwZSwgICAgICpvdXRfdHlwZSwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfdmVyYm9zZSh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHZlcmJvc2UsICAqb3V0X3ZlcmJvc2UsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3dhcm5pbmdzKHZhbCkgICAgICBfc2V0X3BhcmFtKCB3YXJuaW5ncywgKm91dF93YXJuLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9yZXNwZWN0KHZhbCkgICAgICAgX3NldF9wYXJhbSggcmVzcGVjdCwgICpvdXRfcmVzcGVjdCwgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfZHVwcyh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIGR1cHMsICAgICAqb3V0X2R1cHMsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3Byb2NsaXN0KHZhbCkgICAgICBfc2V0X3BhcmFtKCBwcm9jbGlzdCwgKm91dF9wcm9jbGlzdCwgICAgdmFsICkKKworICAgICNkZWZpbmUgc2V0X2dyYW4odmFsLGxldmVscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBncmFuID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3JhbiA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3Jhbl9sZXZlbHMgPSBsZXZlbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgZ3JhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyAhPSBOVUxMICkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisgICAgaWYgKCAoIF9fa21wX2FmZmluaXR5X25vdHlwZSAhPSBOVUxMICkKKyAgICAgICYmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKQorICAgICAgfHwgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsICkgKSApIHsKKyAgICAgICAgdHlwZSA9IFRSVUU7CisgICAgfQorIyBlbmRpZgorCisgICAgd2hpbGUgKCAqYnVmICE9ICdcMCcgKSB7CisgICAgICAgIHN0YXJ0ID0gbmV4dCA9IGJ1ZjsKKworICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub25lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9ub25lICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigic2NhdHRlciIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfc2NhdHRlciApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImNvbXBhY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2NvbXBhY3QgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJsb2dpY2FsIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9sb2dpY2FsICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGh5c2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X3BoeXNpY2FsICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZXhwbGljaXQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2V4cGxpY2l0ICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworIyBpZiBLTVBfTUlDCisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJiYWxhbmNlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfYmFsYW5jZWQgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGVuZGlmCisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkaXNhYmxlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZGlzYWJsZWQgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ2ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm92ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIndhcm5pbmdzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF93YXJuaW5ncyggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vd2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInJlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3Jlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZHVwbGljYXRlcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJkdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm9kdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoIm5vZHVwcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfZHVwcyggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJncmFudWxhcml0eSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJncmFuIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJz0nCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3N0cigiZmluZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZmluZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInRocmVhZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fdGhyZWFkLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29yZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fY29yZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInBhY2thZ2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX3BhY2thZ2UsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2RlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ub2RlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyb3VwIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ncm91cCwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2RlZmF1bHQsIG4gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicHJvY2xpc3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgY2hhciAqdGVtcF9wcm9jbGlzdDsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJ1snKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJ1snCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KG5hbWUsIGJ1ZiwKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopJm5leHQsICZ0ZW1wX3Byb2NsaXN0KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gd2FybmluZyBhbHJlYWR5IGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1RPKG5leHQsICddJyk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICddJykgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnXScKKyAgICAgICAgICAgIHNldF9wcm9jbGlzdCggdGVtcF9wcm9jbGlzdCApOworICAgICAgICB9IGVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgaW50ZWdlciBudW1iZXJzIC0tIHBlcm11dGUgYW5kIG9mZnNldC4KKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbiA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoIGNvdW50IDwgMiApIHsKKyAgICAgICAgICAgICAgICBudW1iZXJbIGNvdW50IF0gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtcywgbmFtZSwgc3RhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqbmV4dCAhPSAnXDAnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCB0ZW1wICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSAvLyB3aGlsZQorCisgICAgI3VuZGVmIEVNSVRfV0FSTgorICAgICN1bmRlZiBfc2V0X3BhcmFtCisgICAgI3VuZGVmIHNldF90eXBlCisgICAgI3VuZGVmIHNldF92ZXJib3NlCisgICAgI3VuZGVmIHNldF93YXJuaW5ncworICAgICN1bmRlZiBzZXRfcmVzcGVjdAorICAgICN1bmRlZiBzZXRfZ3JhbnVsYXJpdHkKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKworICAgIGlmICggcHJvY2xpc3QgKSB7CisgICAgICAgIGlmICggISB0eXBlICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlByb2NMaXN0Tm9UeXBlLCBuYW1lICk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZXhwbGljaXQgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCwgbmFtZSApOworICAgICAgICAgICAgS01QX0FTU0VSVCggKm91dF9wcm9jbGlzdCAhPSBOVUxMICk7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKm91dF9wcm9jbGlzdCApOworICAgICAgICAgICAgKm91dF9wcm9jbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICggKm91dF90eXBlICkgeworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk1hbnlQYXJhbXNGb3JMb2dpYywgbmFtZSwgbnVtYmVyWyAxIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisjIGlmIEtNUF9NSUMKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIC8vIElmIGdyYW51bGFyaXR5IGlzIG5laXRoZXIgdGhyZWFkIG5vciBjb3JlIGxldCBpdCBiZSBkZWZhdWx0IHZhbHVlPWZpbmUKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fZGVmYXVsdCAmJiBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fZmluZQorICAgICAgICAgICAgICAgICYmIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgJiYgX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX2NvcmUgKSB7CisgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiY29yZSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyMgZW5kaWYKKyAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OiB7CisgICAgICAgICAgICBpZiAoICpvdXRfcHJvY2xpc3QgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9Qcm9jTGlzdCwgbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vUGFyYW0sIG5hbWUsICJleHBsaWNpdCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ub25lOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgIm5vbmUiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2Rpc2FibGVkOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRpc2FibGVkIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRlZmF1bHQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCit9IC8vIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoIG5hbWUsIHZhbHVlLCAmIF9fa21wX2FmZmluaXR5X3R5cGUsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzLCAmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZ3JhbiwgJiBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZHVwcywgJiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZmZpbml0eSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgInZlcmJvc2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm92ZXJib3NlIik7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJ3YXJuaW5ncyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3dhcm5pbmdzIik7CisgICAgfQorICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAicmVzcGVjdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vcmVzcGVjdCIpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X2dyYW4gKSB7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1kZWZhdWx0LCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2ZpbmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9ZmluZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl90aHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9dGhyZWFkLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9Y29yZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PXBhY2thZ2UsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ub2RlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ncm91cDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ncm91cCwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9kdXBzICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgImR1cGxpY2F0ZXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub2R1cGxpY2F0ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiICk7CisgICAgfQorICAgIGVsc2Ugc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdHlwZSApeworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJub25lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkIiwgInBoeXNpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAibG9naWNhbCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImNvbXBhY3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJzY2F0dGVyIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzPVslc10sJXMiLCAicHJvY2xpc3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgYnJlYWs7CisjIGlmIEtNUF9NSUMKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImJhbGFuY2VkIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyMgZW5kaWYKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kaXNhYmxlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRpc2FibGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICI8dW5rbm93bj4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworfSAvL19fa21wX3N0Z19wcmludF9hZmZpbml0eQorCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgY29uc3QgY2hhciAqIG5leHQgPSBOVUxMOworICAgIGNoYXIgKiB0ZW1wX3Byb2NsaXN0OworICAgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKikgZGF0YTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgaWYgKCBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QoIG5hbWUsIHZhbHVlLCAmbmV4dCwKKyAgICAgICZ0ZW1wX3Byb2NsaXN0ICkpIHsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBHT01QX0NQVV9BRkZJTklUWSA9PiBncmFudWxhcml0eT1maW5lLGV4cGxpY2l0LHByb2NsaXN0PS4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gdGVtcF9wcm9jbGlzdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIG5hbWUgKTsKKyAgICAgICAgICAgIGlmICh0ZW1wX3Byb2NsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSgodm9pZCAqKXRlbXBfcHJvY2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBXYXJuaW5nIGFscmVhZHkgZW1pdHRlZAorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eQorCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QgcGFyc2VyLiBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAorX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICoqc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX3BsYWNlKCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKiogc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIGlmICghIF9fa21wX3BhcnNlX3N1YnBsYWNlX2xpc3QodmFyLCBzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJ30nKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ30nCisgICAgfQorICAgIGVsc2UgaWYgKCoqc2NhbiA9PSAnIScpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJyEnCisgICAgICAgIHJldHVybiBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsIHNjYW4pOyAvLychJyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc6JworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBwcm9jID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHByb2MgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGNoYXIgKipwbGFjZV9saXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfcGxhY2UodmFyLCAmc2NhbikpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHNjYW4gLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIG1lbWNweShyZXRsaXN0LCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwbGFjZV9saXN0ID0gcmV0bGlzdDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGxhY2VzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGNvdW50OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBjb25zdCBjaGFyICpraW5kID0gIlwidGhyZWFkc1wiIjsKKworICAgIC8vX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggInRocmVhZHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3RocmVhZDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwidGhyZWFkc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggImNvcmVzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJjb3Jlc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggInNvY2tldHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3BhY2thZ2U7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInNvY2tldHNcIiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKilfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggbmFtZSwgdmFsdWUsICZfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2V4cGxpY2l0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuID09ICdcMCcgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFBhcnNlIG9wdGlvbiBjb3VudCBwYXJhbWV0ZXIgaW4gcGFyZW50aGVzZXMKKyAgICAvLworICAgIGlmICggKnNjYW4gIT0gJygnICkgeworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgbmFtZSwga2luZCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJygnCisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIG5leHQgPSBzY2FuOworICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICBzY2FuID0gbmV4dDsKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCAqc2NhbiAhPSAnKScgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnKScKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCAqc2NhbiAhPSAnXDAnICkgeworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VFeHRyYUNoYXJzV2FybiwgbmFtZSwgc2NhbiApOworICAgIH0KKyAgICBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGxhY2VzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwKKyAgdm9pZCAqIGRhdGEgKQoreworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID09IDAgKQorICAgICAgfHwgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZmFsc2UgKQorICAgICAgfHwgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsICkgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2V4cGxpY2l0ICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyVzJ1xuIiwgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfY29tcGFjdCApIHsKKyAgICAgICAgaW50IG51bTsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICkgeworICAgICAgICAgICAgbnVtID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW0gPSAwOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMoJWQpJ1xuIiwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMoJWQpJyBcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdjb3JlcydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworIyBpZiBPTVBfMzBfRU5BQkxFRCAmJiAoISBPTVBfNDBfRU5BQkxFRCkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgZW5hYmxlZDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDMuMSwgT01QX1BST0NfQklORCBpcyBzdHJpY3RseSBhIGJvb2xlYW4KKyAgICAvLworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBlbmFibGVkICk7CisgICAgaWYgKCBlbmFibGVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9Y29yZSxzY2F0dGVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X3NjYXR0ZXI7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorfSAvLyBfX2ttcF9wYXJzZV9wcm9jX2JpbmQKKworIyBlbmRpZiAvKiBpZiBPTVBfMzBfRU5BQkxFRCAmJiAoISBPTVBfNDBfRU5BQkxFRCkgKi8KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhbGwiLCAxLCB2YWx1ZSApICkgeworICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICB9CisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAieDJhcGljIGlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljX2lkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljLWlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljaWQiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWZfMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZi0xMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmXzExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZi0xMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYxMSIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCAxMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkXzExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZDExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZiAxMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmLTExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZjExIiwgNiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhcGljIGlkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpY19pZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWMtaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljaWQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZl80IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYtNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWZfNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYtNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWY0IiwgMTAsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIDQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF80IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYgNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYtNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWY0IiwgNSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOworICAgIH0KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICIvcHJvYy9jcHVpbmZvIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aW5mbyIsIDUsIHZhbHVlICkpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzsKKyAgICB9CisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJncm91cCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgIH0KKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImZsYXQiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2QoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApIHsKKyMgaWYgS01QX0RFQlVHCisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDoKKyAgICAgICAgdmFsdWUgPSAiYWxsIjsKKyAgICAgICAgYnJlYWs7CisKKyMgIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJ4MkFQSUMgaWQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJBUElDIGlkIjsKKyAgICAgICAgYnJlYWs7CisjICBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm86CisgICAgICAgIHZhbHVlID0gImNwdWluZm8iOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDoKKyAgICAgICAgdmFsdWUgPSAiZ3JvdXAiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OgorICAgICAgICB2YWx1ZSA9ICJmbGF0IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZAorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLworLy8gT01QX1BST0NfQklORCAvIGJpbmQtdmFyIGlzIGZ1bmN0aW9uYWwgb24gYWxsIDQuMCBidWlsZHMsIGluY2x1ZGluZyBPUyBYKgorLy8gT01QX1BMQUNFUyAvIHBsYWNlLXBhcnRpdGlvbi12YXIgaXMgbm90LgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCA0LjAgT01QX1BST0NfQklORCBpcyBhIHZlY3RvciBvZiBwcm9jX2JpbmQgdHlwZXMuCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwpCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworCisgICAgY29uc3QgY2hhciAqYnVmID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKyAgICBpbnQgbnVtOworICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgIEtNUF9BU1NFUlQoIG51bSA+PSAwICk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbnVtID0gLTE7CisgICAgfQorCisgICAgbmV4dCA9IGJ1ZjsKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggImRpc2FibGVkIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2Rpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfZmFsc2UgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiZmFsc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3RydWUgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAidHJ1ZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gInRydWUiIGN1cnJlbnRseSBtYXBzIHRvICJzcHJlYWQiCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9zcHJlYWQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZW52IHZhciBzdHJpbmcKKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqc2NhbjsKKyAgICAgICAgaW50IG5lbGVtID0gMTsKKyAgICAgICAgZm9yICggc2NhbiA9IGJ1ZjsgKnNjYW4gIT0gJ1wwJzsgc2NhbisrICkgeworICAgICAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgbmVsZW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSAvIGV4cGFuZCB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheSBhcyBuZWVkZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPCBuZWxlbSApIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfUkVBTExPQyggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzLAorICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbmVsZW0gKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gbmVsZW07CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gbmVsZW07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkKKyAgICAgICAgLy8KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBlbnVtIGttcF9wcm9jX2JpbmRfdCBiaW5kOworCisgICAgICAgICAgICBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX21hc3RlciApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggIm1hc3RlciIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfbWFzdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX2Nsb3NlICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiY2xvc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX2Nsb3NlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3NwcmVhZCApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggInNwcmVhZCIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tpKytdID0gYmluZDsKKyAgICAgICAgICAgIGlmICggaSA+PSBuZWxlbSApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICpidWYgPT0gJywnICk7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBuZXh0IHZhbHVlIGlmIGl0IHdhcyBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGlmICggKmJ1ZiAhPSAnXDAnICkgeworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VFeHRyYUNoYXJzV2FybiwgbmFtZSwgYnVmICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwKKyAgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBuZWxlbSA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZDsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBuZWxlbSA9PSAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nIiwgbmFtZSApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5lbGVtOyBpKysgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaV0gKSB7CisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZmFsc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZmFsc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF90cnVlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInRydWUiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAibWFzdGVyIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiY2xvc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAic3ByZWFkIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGlzYWJsZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZGlzYWJsZWQiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9pbnRlbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJpbnRlbCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2RlZmF1bHQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZGVmYXVsdCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaSA8IG5lbGVtIC0gMSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIsIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9EWU5BTUlDCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgKF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYykgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkIGJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkX2JhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkLWJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImJhbGFuY2UiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICAgIH0KKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRocmVhZCBsaW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZF9saW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZC1saW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZGxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGltaXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAicmFuZG9tIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3JhbmRvbTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvL19fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM6ICVzIFxuIiwgbmFtZSwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisjIGlmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgImxvYWQgYmFsYW5jZSIgKTsKKyAgICB9CisjIGVuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInRocmVhZCBsaW1pdCIgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJyYW5kb20iICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUKDApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUKKworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTE9BRF9CQUxBTkNFX0lOVEVSVkFMCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGRvdWJsZSBpbnRlcnZhbCA9IF9fa21wX2NvbnZlcnRfdG9fZG91YmxlKCB2YWx1ZSApOworICAgIGlmICggaW50ZXJ2YWwgPj0gMCApIHsKKyAgICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbGRfYmFsYW5jZV9pbnRlcnZhbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSU4LjZmXG4iLCBuYW1lLCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2xvYWRfYmFsYW5jZV9pbnRlcnZhbAorCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfQVRfRk9SSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICk7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKyAgICB9OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworICAgICAgICBpZiAoIGxlbmd0aCA+IElOVF9NQVggKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggTG9uZ1ZhbHVlLCBuYW1lICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzZW1pY29sb247CisgICAgICAgICAgICBpZiggdmFsdWVbIGxlbmd0aCAtIDEgXSA9PSAnIicgfHwgdmFsdWVbIGxlbmd0aCAtMSBdID09ICdcJycgKQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBVbmJhbGFuY2VkUXVvdGVzLCBuYW1lICk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY2hhciBzZW50aW5lbDsKKworICAgICAgICAgICAgICAgIHNlbWljb2xvbiA9IChjaGFyICopIHN0cmNociggdmFsdWUsICc7JyApOworICAgICAgICAgICAgICAgIGlmKCAqdmFsdWUgJiYgc2VtaWNvbG9uICE9IHZhbHVlICkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2NvbW1hOworICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSAnLCc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSAnOyc7CisgICAgICAgICAgICAgICAgICAgIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInN0YXRpYyIsIHZhbHVlLCBzZW50aW5lbCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJncmVlZHkiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYmFsYW5jZWQiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJndWlkZWQiLCB2YWx1ZSwgc2VudGluZWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggIml0ZXJhdGl2ZSIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbmFseXRpY2FsIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuYWx5dGljYWwgbm90IGFsbG93ZWQgZm9yIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEludmFsaWRDbGF1c2UsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbXB0eUNsYXVzZSwgbmFtZSApOworICAgICAgICAgICAgfSB3aGlsZSAoIHZhbHVlID0gc2VtaWNvbG9uID8gc2VtaWNvbG9uICsgMSA6IE5VTEwgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlX19zY2hlZHVsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJzdGF0aWMsZ3JlZWR5Iik7CisgICAgfSBlbHNlIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50ICggYnVmZmVyLCAiJXMiLCAic3RhdGljLGJhbGFuY2VkIik7CisgICAgfQorICAgIGlmICggX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI7JXMnXG4iLCAiZ3VpZGVkLGl0ZXJhdGl2ZSIpOworICAgIH0gZWxzZSBpZiAoIF9fa21wX2d1aWRlZCA9PSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsYW5hbHl0aWNhbCIpOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9TQ0hFRFVMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKyAgICBpZiggdmFsdWUgKSB7CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKKyAgICAgICAgaWYoIGxlbmd0aCApIHsKKyAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiggdmFsdWVbIGxlbmd0aCAtIDEgXSA9PSAnIicgfHwgdmFsdWVbIGxlbmd0aCAtMSBdID09ICdcJycpCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFVuYmFsYW5jZWRRdW90ZXMsIG5hbWUgKTsKKyAgICAgICAgICAgIC8qIGdldCB0aGUgc3BlY2lmaWVkIHNjaGVkdWxpbmcgc3R5bGUgKi8KKyAgICAgICAgICAgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJkeW5hbWljIiwgdmFsdWUsICcsJykpICAgICAgICAgIC8qIERZTkFNSUMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZHluYW1pY19jaHVua2VkOworICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZ3VpZGVkIiwgdmFsdWUsICcsJykpICAgICAgLyogR1VJREVEICovCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkOworLy8gQUM6IFRPRE86IGFkZCBBVVRPIHNjaGVkdWxlLCBhbmQgcHByb2JhYmx5IHJlbW92ZSBUUkFQRVpPSURBTCAoT01QIDMuMCBkb2VzIG5vdCBhbGxvdyBpdCkKKyAgICAgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYXV0byIsIHZhbHVlLCAnLCcpKSB7ICAgICAgIC8qIEFVVE8gKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfYXV0bzsKKyAgICAgICAgICAgICAgICBpZiggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIElnbm9yZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBjb21tYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJ0cmFwZXpvaWRhbCIsIHZhbHVlLCAnLCcpKSAvKiBUUkFQRVpPSURBTCAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF90cmFwZXpvaWRhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInN0YXRpYyIsIHZhbHVlLCAnLCcpKSAgICAgIC8qIFNUQVRJQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWM7CisjaWZkZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisgICAgICAgICAgICBlbHNlIGlmIChLTVBfQVJDSF9YODZfNjQgJiYKKyAgICAgICAgICAgICAgICAgICAgICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInN0YXRpY19zdGVhbCIsIHZhbHVlLCAnLCcpKQorICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWNfc3RlYWw7CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOyAvKiBza2lwIHByb2Nlc3Npbmcgb2YgY29tbWEgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB2YWx1ZSAmJiBjb21tYSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBUUlVFOworCisgICAgICAgICAgICAgICAgaWYoX19rbXBfc2NoZWQgPT0ga21wX3NjaF9zdGF0aWMpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICArK2NvbW1hOworICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gX19rbXBfc3RyX3RvX2ludCggY29tbWEsIDAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2NodW5rIDwgMSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSW52YWxpZENodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2NodW5rICk7CisvLyBBQzogbmV4dCBibG9jayBjb21tZW50ZWQgb3V0IHVudGlsIEtNUF9ERUZBVUxUX0NIVU5LICE9IEtNUF9NSU5fQ0hVTksgKHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZSA6KQorLy8gICAgIFRoZSBkZWZhdWx0IGNodW5rIHNpemUgaXMgMSBhY2NvcmRpbmcgdG8gc3RhbmRhcmQsIHRodXMgbWFraW5nIEtNUF9NSU5fQ0hVTksgbm90IDEgd2Ugd291bGQgaW50cm9kdWNlIG1lc3M6CisvLyAgICAgd3JvbmcgY2h1bmsgYmVjb21lcyAxLCBidXQgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIGV4cGxpY2l0ZWx5IHNldCAxLCBiZWNhdXNlIGl0IGJlY29tZXMgS01QX01JTl9DSFVOSy4uLgorLy8gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPCBLTVBfTUlOX0NIVU5LICkgeworLy8gICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX01JTl9DSFVOSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9jaHVuayA+IEtNUF9NQVhfQ0hVTksgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX01BWF9DSFVOSzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggTGFyZ2VDaHVuaywgbmFtZSwgY29tbWEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2Vudl9jaHVuayA9IEZBTFNFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbXB0eVN0cmluZywgbmFtZSApOworICAgIH0KKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9zdGF0aWMgPT0gJWRcbiIsIF9fa21wX3N0YXRpYykpCisgICAgS19ESUFHKDEsICgiX19rbXBfZ3VpZGVkID09ICVkXG4iLCBfX2ttcF9ndWlkZWQpKQorICAgIEtfRElBRygxLCAoIl9fa21wX3NjaGVkID09ICVkXG4iLCBfX2ttcF9zY2hlZCkpCisgICAgS19ESUFHKDEsICgiX19rbXBfY2h1bmsgPT0gJWRcbiIsIF9fa21wX2NodW5rKSkKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfY2h1bmsgKSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX3NjaGVkICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJkeW5hbWljIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImd1aWRlZCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJ0cmFwZXpvaWRhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAic3RhdGljIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJzdGF0aWNfc3RlYWwiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJhdXRvIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfc2NoZWQgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImR5bmFtaWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJndWlkZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJ0cmFwZXpvaWRhbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJzdGF0aWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljX3N0ZWFsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJhdXRvIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FUT01JQ19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIE1vZGVzOiAwIC0tIGRvIG5vdCBjaGFuZ2UgZGVmYXVsdDsgMSAtLSBJbnRlbCBwZXJmIG1vZGUsIDIgLS0gR09NUCBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaW50IG1vZGUgPSAwOworICAgIGludCBtYXggID0gMTsKKyAgICAjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIG1heCA9IDI7CisgICAgI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBtYXgsICYgbW9kZSApOworICAgIC8vIFRPRE87IHBhcnNlX2ludCBpcyBub3QgdmVyeSBzdWl0YWJsZSBmb3IgdGhpcyBjYXNlLiBJbiBjYXNlIG9mIG92ZXJmbG93IGl0IGlzIGJldHRlciB0byB1c2UKKyAgICAvLyAwIHJhdGhlciB0aGF0IG1heCB2YWx1ZS4KKyAgICBpZiAoIG1vZGUgPiAwICkgeworICAgICAgICBfX2ttcF9hdG9taWNfbW9kZSA9IG1vZGU7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2F0b21pY19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9DT05TSVNURU5DWV9DSEVDSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgLy8gTm90ZSwgdGhpcyB3aWxsIG5vdCB3b3JrIGZyb20ga21wX3NldF9kZWZhdWx0cyBiZWNhdXNlIHRoX2NvbnMgc3RhY2sgd2FzIG5vdCBhbGxvY2F0ZWQKKyAgICAgICAgLy8gZm9yIGV4aXN0ZWQgdGhyZWFkKHMpIHRodXMgdGhlIGZpcnN0IF9fa21wX3B1c2hfPGNvbnN0cnVjdD4gd2lsbCBicmVhayB3aXRoIGFzc2VydGlvbi4KKyAgICAgICAgLy8gVE9ETzogYWxsb2NhdGUgdGhfY29ucyBpZiBjYWxsZWQgZnJvbSBrbXBfc2V0X2RlZmF1bHRzLgorICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAibm9uZSIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2soIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyNpZiBLTVBfREVCVUcKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdmFsdWUgPSAiYWxsIjsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9ICJub25lIjsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaworCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSVRUX1BSRVBBUkVfREVMQVkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIFVTRV9JVFRfTk9USUZZCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICAvLyBFeHBlcmltZW50YWwgY29kZTogS01QX0lUVF9QUkVQQVJFX0RFTEFZIHNwZWNpZmllcyBudW1iZXJ0IG9mIGxvb3AgaXRlcmF0aW9ucy4KKyAgICBpbnQgZGVsYXkgPSAwOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGRlbGF5ICk7CisgICAgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSBkZWxheTsKK30gLy8gX19rbXBfc3RyX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfdWludDY0KCBidWZmZXIsIG5hbWUsIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICk7CisKK30gLy8gX19rbXBfc3RyX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5CisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX01BTExPQ19QT09MX0lOQ1IKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiwKKyAgICAgICAgICAgIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAmIF9fa21wX21hbGxvY19wb29sX2luY3IsCisgICAgICAgICAgICAxCisgICAgICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jcigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX21hbGxvY19wb29sX2luY3IgKTsKKworfSAvLyBfa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyCisKKworI2lmZGVmIEtNUF9ERUJVRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUEFSX1JBTkdFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZSwKKyAgICAgICAgICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lLAorICAgICAgICAgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2VfbGIsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZV91YgorICAgICAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlICE9IDApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCBwYXJfcmFuZ2VfdG9fcHJpbnQgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9ZSUVMRF9DWUNMRSwgS01QX1lJRUxEX09OLCBLTVBfWUlFTERfT0ZGCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCBmbGFnID0gX19rbXBfeWllbGRfY3ljbGU7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIGZsYWcgKTsKKyAgICBfX2ttcF95aWVsZF9jeWNsZSA9IGZsYWc7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfY3ljbGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMiwgSU5UX01BWCwgJiBfX2ttcF95aWVsZF9vbl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9vbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb25fY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDIsIElOVF9NQVgsICYgX19rbXBfeWllbGRfb2ZmX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vZmYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9vZmYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX29mZl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmCisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSU5JVF9XQUlULCBLTVBfTkVYVF9XQUlUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgIGludCB3YWl0OworICAgS01QX0FTU0VSVCggKCBfX2ttcF9pbml0X3dhaXQgJiAxICkgPT0gMCApOworICAgd2FpdCA9IF9fa21wX2luaXRfd2FpdCAvIDI7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIEtNUF9NSU5fSU5JVF9XQUlULCBLTVBfTUFYX0lOSVRfV0FJVCwgJiB3YWl0ICk7CisgICAgX19rbXBfaW5pdF93YWl0ID0gd2FpdCAqIDI7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9pbml0X3dhaXQgJiAxICkgPT0gMCApOworICAgIF9fa21wX3lpZWxkX2luaXQgPSBfX2ttcF9pbml0X3dhaXQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbml0X3dhaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2luaXRfd2FpdCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgd2FpdDsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX25leHRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgd2FpdCA9IF9fa21wX25leHRfd2FpdCAvIDI7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIEtNUF9NSU5fTkVYVF9XQUlULCBLTVBfTUFYX05FWFRfV0FJVCwgJiB3YWl0ICk7CisgICAgX19rbXBfbmV4dF93YWl0ID0gd2FpdCAqIDI7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9uZXh0X3dhaXQgJiAxICkgPT0gMCApOworICAgIF9fa21wX3lpZWxkX25leHQgPSBfX2ttcF9uZXh0X3dhaXQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9uZXh0X3dhaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX25leHRfd2FpdCApOworfSAvL19fa21wX3N0Z19wcmludF9uZXh0X3dhaXQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfR1RJRF9NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZ3RpZF9tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLworICAgIC8vIE1vZGVzOgorICAgIC8vICAgMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQKKyAgICAvLyAgIDEgLS0gc3Agc2VhcmNoCisgICAgLy8gICAyIC0tIHVzZSAia2V5ZWQiIFRMUyB2YXIsIGkuZS4KKyAgICAvLyAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhMaW51eCogT1MvT1MgWCopIG9yIFRsc0dldFZhbHVlKFdpbmRvd3MqIE9TKQorICAgIC8vICAgMyAtLSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHZhciBpbiB0ZGF0YSBzZWN0aW9uCisgICAgLy8KKyAgICBpbnQgbW9kZSA9IDA7CisgICAgaW50IG1heCAgPSAyOworICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICBtYXggPSAzOworICAgICNlbmRpZiAvKiBLTVBfVERBVEFfR1RJRCAqLworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBtYXgsICYgbW9kZSApOworICAgIC8vIFRPRE87IHBhcnNlX2ludCBpcyBub3QgdmVyeSBzdWl0YWJsZSBmb3IgdGhpcyBjYXNlLiBJbiBjYXNlIG9mIG92ZXJmbG93IGl0IGlzIGJldHRlciB0byB1c2UKKyAgICAvLyAwIHJhdGhlciB0aGF0IG1heCB2YWx1ZS4KKyAgICBpZiAoIG1vZGUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSBtb2RlOworICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RyX3BhcnNlX2d0aWRfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfYWRqdXN0X2d0aWRfbW9kZSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCAwICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2d0aWRfbW9kZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9OVU1fTE9DS1NfSU5fQkxPQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX0lOVF9NQVgsICYgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9sb2NrX2Jsb2NrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0NLX0tJTkQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sb2NrX2tpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TG9ja1dhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAidGFzIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdCBhbmQgc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdF9hbmRfc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdC1hbmQtc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdCBhbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0X2FuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QtYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZCBzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kX3NldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmQtc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZHNldCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfdGFzOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJmdXRleCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIGlmICggX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKSApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZnV0ZXg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRnV0ZXhOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGlja2V0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190aWNrZXQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJxdWV1aW5nIiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAicXVldWUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYSB0aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYV90aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYS10aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYXRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kcmRwYTsKKyAgICB9CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhZGFwdGl2ZSIsIDEsIHZhbHVlICkgICkgeworICAgICAgICBpZiggX19rbXBfY3B1aW5mby5ydG0gKSB7IC8vID8/PyBJcyBjcHVpbmZvIGF2YWlsYWJsZSBoZXJlPworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19hZGFwdGl2ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xvY2tfa2luZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAoIF9fa21wX3VzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3RhczoKKyAgICAgICAgdmFsdWUgPSAidGFzIjsKKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGNhc2UgbGtfZnV0ZXg6CisgICAgICAgIHZhbHVlID0gImZ1dGV4IjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIGxrX3RpY2tldDoKKyAgICAgICAgdmFsdWUgPSAidGlja2V0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19xdWV1aW5nOgorICAgICAgICB2YWx1ZSA9ICJxdWV1aW5nIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19kcmRwYToKKyAgICAgICAgdmFsdWUgPSAiZHJkcGEiOworICAgICAgICBicmVhazsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbGtfYWRhcHRpdmU6CisgICAgICAgIHZhbHVlID0gImFkYXB0aXZlIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTLCBLTVBfU1BFQ1VMQVRJVkVfU1RBVFNGSUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBhcnNlIG91dCB2YWx1ZXMgZm9yIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMgZnJvbSBhIHN0cmluZyBvZiB0aGUgZm9ybQorLy8gS01QX0FEQVBUSVZFX0xPQ0tfUFJPUFM9bWF4X3NvZnRfcmV0cmllc1ssbWF4X2JhZG5lc3NdCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FkYXB0aXZlX2xvY2tfcHJvcHMoIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpkYXRhICkKK3sKKyAgICBpbnQgbWF4X3JldHJpZXMgPSAwOworICAgIGludCBtYXhfYmFkbmVzcyA9IDA7CisKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IG5leHQ7CisKKyAgICBpbnQgdG90YWwgPSAwOyAgICAgICAgICAvLyBDb3VudCBlbGVtZW50cyB0aGF0IHdlcmUgc2V0LiBJdCdsbCBiZSB1c2VkIGFzIGFuIGFycmF5IHNpemUKKyAgICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisgICAgaW50IGk7CisKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgc3RydWN0dXJlIF9fa21wX3NwZWN1bGF0aXZlX2JhY2tvZmZfcGFyYW1zCisgICAgLy8gUnVuIG9ubHkgMyBpdGVyYXRpb25zIGJlY2F1c2UgaXQgaXMgZW5vdWdoIHRvIHJlYWQgdHdvIHZhbHVlcyBvciBmaW5kIGEgc3ludGF4IGVycm9yCisgICAgZm9yICggaSA9IDA7IGkgPCAzIDsgaSsrKSB7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKworICAgICAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSBPUiBudW1iZXIgb2YgdmFsdWVzID4gMiA9PiBlbmQgb2YgbGlzdAorICAgICAgICBpZiAoICggKCAqbmV4dCA8ICcwJyApIHx8ICggKm5leHQgPiAnOScgKSApICYmICggKm5leHQgIT0nLCcpIHx8ICggdG90YWwgPiAyICkgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBuZXh0OworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3BhY2VzTm90QWxsb3dlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIGlmICggbnVtIDwgMSApIHsgLy8gVGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBiZSA+IDAKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggbnVtID4gS01QX0lOVF9NQVggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX0lOVF9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0b3RhbCA9PSAxICkgeworICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzID0gbnVtOworICAgICAgICAgICAgfSBlbHNlIGlmKCB0b3RhbCA9PSAyICkgeworICAgICAgICAgICAgICAgIG1heF9iYWRuZXNzID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRvdGFsID4gMCApOworICAgIGlmKCB0b3RhbCA8PSAwICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIG1heF9yZXRyaWVzICE9IDAgKSB7CisgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMgPSBtYXhfcmV0cmllczsKKyAgICB9CisgICAgaWYoIG1heF9iYWRuZXNzICE9IDAgKSB7CisgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzID0gbWF4X2JhZG5lc3M7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcyhrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVkLCVkJ1xuIiwgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfZmlsZSggbmFtZSwgdmFsdWUsICIiLCAmIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICItIiwgMCwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICkgICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJzdGRvdXQiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZQorCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyNpZiBLTVBfTUlDCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBQ0VfVEhSRUFEUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3BsYWNlX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFZhbHVlIGV4YW1wbGU6IDVDeDJUeDE1TworICAgIC8vIFdoaWNoIG1lYW5zICJ1c2UgNSBjb3JlcyB3aXRoIG9mZnNldCAxNSwgMiB0aHJlYWRzIHBlciBjb3JlIgorCisgICAgaW50ICAgICAgICAgbnVtOworICAgIGludCAgICAgICAgIHByZXZfZGVsaW0gPSAwOworICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpwcmV2OworCisgICAgU0tJUF9XUyggbmV4dCApOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOyAgIC8vIGxlYXZlIGRlZmF1bHQgdmFsdWVzCisgICAgfQorCisgICAgLy8gR2V0IG51bV9jb3JlcyBmaXJzdAorICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIHByZXYsICpuZXh0ICk7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnQycgfHwgKm5leHQgPT0gJ2MnICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgcHJldl9kZWxpbSA9IDE7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICdUJyB8fCAqbmV4dCA9PSAndCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB3ZSBpZ25vcmUgb2Zmc2V0IHZhbHVlIGluIGNhc2UgYWxsIGNvcmVzIGFyZSB1c2VkCisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICByZXR1cm47ICAgLy8gdGhlIG9ubHkgdmFsdWUgcHJvdmlkZWQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgeworICAgICAgICAvLyBGaXJzdCBjaGFyYWN0ZXIgaXMgZGVsaW1pdGVyLCBza2lwIGl0LCBsZWF2ZSBudW1fY29yZXMgZGVmYXVsdCB2YWx1ZQorICAgICAgICBwcmV2X2RlbGltID0gMjsKKyAgICAgICAgbmV4dCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyggbmV4dCApOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOyAgIC8vICIgbiAgIiAtIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAgICB9CisgICAgaWYgKCAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSAmJiAhcHJldl9kZWxpbSApIHsKKyAgICAgICAgcHJldl9kZWxpbSA9IDE7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlciBhZnRlciBudW1fY29yZSB2YWx1ZQorICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgfQorCisgICAgLy8gR2V0IHRocmVhZHNfcGVyX2NvcmUgbmV4dAorICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgcHJldl9kZWxpbSA9IDA7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBwcmV2LCAqbmV4dCApOworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgICAgIGlmICggKm5leHQgPT0gJ1QnIHx8ICpuZXh0ID09ICd0JyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ08nIHx8ICpuZXh0ID09ICdvJyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHRocmVhZHNfcGVyX2NvcmUgcmVtYWlucyBkZWZhdWx0CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgeworICAgICAgICBpZiAoIHByZXZfZGVsaW0gPT0gMiApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gbm8gc2Vuc2UgaW4gdGhlIG9ubHkgb2Zmc2V0IHZhbHVlLCB0aHVzIHNraXAgdGhlIHJlc3QKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwcmV2X2RlbGltID09IDEgKTsKKyAgICAgICAgbmV4dCsrOyAgICAgLy8gbm8gdmFsdWUgZm9yIHRocmVhZHNfcGVyX2NvcmUgcHJvdmlkZWQKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgIHJldHVybjsgICAvLyAiIG5DLG1UICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIH0KKyAgICBpZiAoICggKm5leHQgPT0gJywnIHx8ICpuZXh0ID09ICd4JyApICYmICFwcmV2X2RlbGltICkgeworICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyIGFmdGVyIHRocmVhZHNfcGVyX2NvcmUgdmFsdWUKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgIH0KKworICAgIC8vIEdldCBjb3JlIG9mZnNldCBsYXN0IGlmIGFueSwKKyAgICAvLyBkb24ndCBib3RoZXIgY2hlY2tpbmcgc3ludGF4IGFmdGVyIGFsbCBkYXRhIG9idGFpbmVkCisgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggcHJldiwgKm5leHQgKTsKKyAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3BsYWNlX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3BsYWNlX251bV9jb3JlcyArIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlICkgeworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmYnVmICk7CisgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiVkQyIsIF9fa21wX3BsYWNlX251bV9jb3JlcyApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAieCVkVCIsIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlICk7CisgICAgICAgIGlmICggX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiLCVkTyIsIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworLyoKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworKi8KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JLSk9JTl9GUkFNRVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JLSk9JTl9GUkFNRVNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgMywgJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9ESVNQTEFZX0VOVgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIlZFUkJPU0UiLCAxLCB2YWx1ZSApICkKKyAgICB7CisgICAgICAgIF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kaXNwbGF5X2VudiApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSApCisgICAgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJWRVJCT1NFIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2Rpc3BsYXlfZW52ICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2NhbmNlbGxhdGlvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX29tcF9jYW5jZWxsYXRpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfb21wX2NhbmNlbGxhdGlvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljIGttcF9zZXR0aW5nX3QgX19rbXBfc3RnX3RhYmxlW10gPSB7CisKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0JMT0NLVElNRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EVVBMSUNBVEVfTElCX09LIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rLCAgIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTElCUkFSWSIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX01BWF9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LCAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHsgIktNUF9NT05JVE9SX1NUQUNLU0laRSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSwgIF9fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSwgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU0VUVElOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLT0ZGU0VUIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfVkVSU0lPTiIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbiwgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbiwgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1dBUk5JTkdTIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhcm5pbmdzLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhcm5pbmdzLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiT01QX05FU1RFRCIsICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX25lc3RlZCwgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X25lc3RlZCwgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9OVU1fVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIHsgIktNUF9UQVNLSU5HIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNraW5nLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF90YXNraW5nLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfVEFTS19TVEVBTElOR19DT05TVFJBSU5UIiwgICAgICBfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZywgICAgICBfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZywgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX01BWF9BQ1RJVkVfTEVWRUxTIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21heF9hY3RpdmVfbGV2ZWxzLCAgX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9USFJFQURfTElNSVQiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfV0FJVF9QT0xJQ1kiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHsgIktNUF9IQU5ETEVfU0lHTkFMUyIsICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscywgICAgIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscywgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIHsgIktNUF9JTkhFUklUX0ZQX0NPTlRST0wiLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wsIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wsIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHsgIktNUF9BX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9hX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2NfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRV9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZV9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZV9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2ZfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1ZywgICAgICAgICAgICAgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9BVE9NSUMiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMsICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMsICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfQ0hBUlMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0xJTkVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RJQUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RpYWcsICAgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RpYWcsICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BBUl9SQU5HRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYsICAgICAgX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYsICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9DWUNMRSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSwgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT04iLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24sICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24sICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX09GRiIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZiwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgeyAiS01QX0FMSUdOX0FMTE9DIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jLCAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fQkFSUklFUiIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIsICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgeyAiS01QX1JFRFVDVElPTl9CQVJSSUVSIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOIiwgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisgICAgeyAiS01QX0FCT1JUX0RFTEFZIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DUFVJTkZPX0ZJTEUiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUsICAgICAgIF9fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUsICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiwgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiwgICAgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVE9SQUdFX01BUCIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCwgICAgICAgIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFBSSVZBVEUiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUsICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiwgX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLCBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsICAgICBOVUxMLCAwLCAwIH0sCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgeyAiS01QX0FGRklOSVRZIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5LCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FmZmluaXR5LCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX0NQVV9BRkZJTklUWSIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHksICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworIyBpZiBPTVBfMzBfRU5BQkxFRAorIyAgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1BMQUNFUyIsICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlcywgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlcywgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyAgZWxzZQorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisjIGVuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICB7ICJLTVBfVE9QT0xPR1lfTUVUSE9EIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kLCAgICBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kLCAgICBOVUxMLCAwLCAwIH0sCisKKyNlbGlmICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICAvLworICAgIC8vIEtNUF9BRkZJTklUWSBpcyBub3Qgc3VwcG9ydGVkIG9uIE9TIFgqLCBub3IgaXMgT01QX1BMQUNFUy4KKyAgICAvLyBPTVBfUFJPQ19CSU5EIGFuZCBwcm9jLWJpbmQtdmFyIGFyZSBzdXBwb3J0ZWQsIGhvd2V2ZXIuCisgICAgLy8KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmCisKKyNlbHNlCisgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIHsgIktNUF9JTklUX0FUX0ZPUksiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmssICAgICAgIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmssICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU0NIRURVTEUiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1NDSEVEVUxFIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSwgICAgICAgX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZSwgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9BVE9NSUNfTU9ERSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZSwgICAgICAgIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0siLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2ssICBfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2ssICBOVUxMLCAwLCAwIH0sCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgeyAiS01QX0lUVF9QUkVQQVJFX0RFTEFZIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5LCAgX19rbXBfc3RnX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5LCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICB7ICJLTVBfTUFMTE9DX1BPT0xfSU5DUiIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciwgICBfX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jciwgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0lOSVRfV0FJVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ORVhUX1dBSVQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9uZXh0X3dhaXQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfR1RJRF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZ3RpZF9tb2RlLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX0RZTkFNSUMiLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljLCAgICAgICAgX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EWU5BTUlDX01PREUiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlLCAgIF9fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlLCAgIE5VTEwsIDAsIDAgfSwKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICB7ICJLTVBfTE9BRF9CQUxBTkNFX0lOVEVSVkFMIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbCxfX2ttcF9zdGdfcHJpbnRfbGRfYmFsYW5jZV9pbnRlcnZhbCxOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworCisKKyAgICB7ICJLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLIiwgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jaywgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaywgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0xPQ0tfS0lORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2xvY2tfa2luZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfQURBUFRJVkVfTE9DS19QUk9QUyIsICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWRhcHRpdmVfbG9ja19wcm9wcyxfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcywgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfU1BFQ1VMQVRJVkVfU1RBVFNGSUxFIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLF9fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX01JQworICAgIHsgIktNUF9QTEFDRV9USFJFQURTIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wbGFjZV90aHJlYWRzLCAgICAgIF9fa21wX3N0Z19wcmludF9wbGFjZV90aHJlYWRzLCAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFIiwgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlLF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX0RJU1BMQVlfRU5WIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiwgICAgX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9DQU5DRUxMQVRJT04iLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uLCAgIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uLCAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorICAgIHsgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfQorfTsgLy8gc2V0dGluZ3MKKworc3RhdGljIGludCBjb25zdCBfX2ttcF9zdGdfY291bnQgPSBzaXplb2YoIF9fa21wX3N0Z190YWJsZSApIC8gc2l6ZW9mKCBrbXBfc2V0dGluZ190ICk7CisKK3N0YXRpYyBpbmxpbmUKK2ttcF9zZXR0aW5nX3QgKgorX19rbXBfc3RnX2ZpbmQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgaW50IGk7CisgICAgaWYgKCBuYW1lICE9IE5VTEwgKSB7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICAgICAgaWYgKCBzdHJjbXAoIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiAmIF9fa21wX3N0Z190YWJsZVsgaSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gTlVMTDsKKworfSAvLyBfX2ttcF9zdGdfZmluZAorCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jbXAoIHZvaWQgY29uc3QgKiBfYSwgdm9pZCBjb25zdCAqIF9iICkgeworICAgIGttcF9zZXR0aW5nX3QgKiBhID0gKGttcF9zZXR0aW5nX3QgKikgX2E7CisgICAga21wX3NldHRpbmdfdCAqIGIgPSAoa21wX3NldHRpbmdfdCAqKSBfYjsKKworICAgIC8vCisgICAgLy8gUHJvY2VzcyBLTVBfQUZGSU5JVFkgbGFzdC4KKyAgICAvLyBJdCBuZWVkcyB0byBjb21lIGFmdGVyIE9NUF9QTEFDRVMgYW5kIEdPTVBfQ1BVX0FGRklOSVRZLgorICAgIC8vCisgICAgaWYgKCBzdHJjbXAoIGEtPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICggc3RyY21wKCBiLT5uYW1lLCAiS01QX0FGRklOSVRZIiApID09IDAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmNtcCggYS0+bmFtZSwgYi0+bmFtZSApOworfSAvLyBfX2ttcF9zdGdfY21wCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19pbml0KCB2b2lkCispIHsKKworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKCAhIGluaXRpYWxpemVkICkgeworCisgICAgICAgIC8vIFNvcnQgdGFibGUuCisgICAgICAgIHFzb3J0KCBfX2ttcF9zdGdfdGFibGUsIF9fa21wX3N0Z19jb3VudCAtIDEsIHNpemVvZigga21wX3NldHRpbmdfdCApLCBfX2ttcF9zdGdfY21wICk7CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplICpfU1RBQ0tTSVpFIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiS01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gMXN0IHByaW9yaXR5LgorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGdvbXBfc3RhY2tzaXplID0gX19rbXBfc3RnX2ZpbmQoICJHT01QX1NUQUNLU0laRSIgKTsgICAgICAvLyAybmQgcHJpb3JpdHkuCisjZW5kaWYKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiT01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gM3JkIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgLy8gISEhIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgcml2YWxzIGlzIHVzZWQgYW5kIG9wdGltaXplcyBvdXQgYXNzaWdubWVudHMKKyAgICAgICAgICAgIC8vICEhISAgICAgcml2YWxzWyBpICsrIF0gPSAuLi47CisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IGttcF9kYXRhICA9IHsgICAgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3QgZ29tcF9kYXRhID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IG9tcF9kYXRhICA9IHsgMTAyNCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX3N0YWNrc2l6ZTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfc3RhY2tzaXplLT5kYXRhID0gJiBrbXBfZGF0YTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBnb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgZ29tcF9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgb21wX2RhdGE7CisKKyAgICAgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9MSUJSQVJZIGFuZCBPTVBfV0FJVF9QT0xJQ1kgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9saWJyYXJ5ICAgICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0xJQlJBUlkiICk7ICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3dhaXRfcG9saWN5ID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfV0FJVF9QT0xJQ1kiICk7ICAgIC8vIDJuZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyAzIF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qga21wX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBvbXBfZGF0YSAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9saWJyYXJ5OworICAgICAgICAgICAgaWYgKCBvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF93YWl0X3BvbGljeTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9saWJyYXJ5LT5kYXRhICA9ICYga21wX2RhdGE7CisgICAgICAgICAgICBpZiAoIG9tcF93YWl0X3BvbGljeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIG9tcF93YWl0X3BvbGljeS0+ZGF0YSA9ICYgb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbGlicmFyeSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0xJQlJBUlkiICk7CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qga21wX2RhdGEgPSB7IDAsIE5VTEwgfTsKKyAgICAgICAgICAgIGttcF9saWJyYXJ5LT5kYXRhID0gJiBrbXBfZGF0YTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBhbmQgT01QX1RIUkVBRF9MSU1JVCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FsbF90aHJlYWRzICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FMTF9USFJFQURTIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbWF4X3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTUFYX1RIUkVBRFMiICApOyAgLy8gMm5kIHByaW9yaXR5LgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3RocmVhZF9saW1pdCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1RIUkVBRF9MSU1JVCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyNlbmRpZgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfYWxsX3RocmVhZHM7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9tYXhfdGhyZWFkczsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfdGhyZWFkX2xpbWl0OworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfYWxsX3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICBrbXBfbWF4X3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggb21wX3RocmVhZF9saW1pdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIG9tcF90aHJlYWRfbGltaXQtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisKKyAgICAgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgYW5kIE9NUF9QUk9DX0JJTkQgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGttcF9hZmZpbml0eSAhPSBOVUxMICk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9jcHVfYWZmaW5pdHkgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfQ1BVX0FGRklOSVRZIiAgKTsgIC8vIDJuZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGdvbXBfY3B1X2FmZmluaXR5ICE9IE5VTEwgKTsKKyMgZW5kaWYKKworIyBpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9wcm9jX2JpbmQgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9QUk9DX0JJTkQiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbXBfcHJvY19iaW5kICE9IE5VTEwgKTsKKyMgZW5kaWYKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9wbGFjZXMgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9QTEFDRVMiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbXBfcGxhY2VzICE9IE5VTEwgKTsKKyMgZW5kaWYKKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA1IF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2FmZmluaXR5OworCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBnb21wX2NwdV9hZmZpbml0eTsKKyAgICAgICAgICAgIGdvbXBfY3B1X2FmZmluaXR5LT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworIyBlbmRpZgorCisjIGlmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9wcm9jX2JpbmQ7CisgICAgICAgICAgICBvbXBfcHJvY19iaW5kLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworIyBlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9wbGFjZXM7CisgICAgICAgICAgICBvbXBfcGxhY2VzLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworIyBlbmRpZgorCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisgICAgICAgIH0KKworI2Vsc2UKKyAgICAvLyBLTVBfQUZGSU5JVFkgbm90IHN1cHBvcnRlZCwgc28gT01QX1BST0NfQklORCBoYXMgbm8gcml2YWxzLgorICAgIC8vIE9NUF9QTEFDRVMgbm90IHN1cHBvcnRlZCB5ZXQuCisjZW5kaWYKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIGFuZCBLTVBfRk9SQ0VfUkVEVUNUSU9OIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZm9yY2VfcmVkICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0ZPUkNFX1JFRFVDVElPTiIgKTsgICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2RldGVybV9yZWQgPSBfX2ttcF9zdGdfZmluZCggIktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIgKTsgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDMgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBmb3JjZV9kYXRhICAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGRldGVybV9kYXRhICA9IHsgMCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2ZvcmNlX3JlZDsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9kZXRlcm1fcmVkOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2ZvcmNlX3JlZC0+ZGF0YSA9ICYgZm9yY2VfZGF0YTsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGV0ZXJtX3JlZC0+ZGF0YSAgPSAmIGRldGVybV9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKworICAgIH07IC8vIGlmCisKKyAgICAvLyBSZXNldCBmbGFncy4KKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0uc2V0ID0gMDsKKyAgICB9OyAvLyBmb3IKKworfSAvLyBfX2ttcF9zdGdfaW5pdAorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlCispIHsKKworICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGFyZSBzb21lIG5hbWVsZXNzIHZhcmlhYmxlcyBsaWtlICJDOj1DOlwiICh5ZWFoLCByZWFsbHkgbmFtZWxlc3MsIHRoZXkgYXJlCisgICAgLy8gcHJlc2VudGVkIGluIGVudmlyb25tZW50IGJsb2NrIGFzICI9Qzo9Q1xcXHgwMD1EOj1EOlxcXHgwMC4uLiIsIHNvIGxldCB1cyBza2lwIHRoZW0uCisgICAgaWYgKCBuYW1lWyAwIF0gPT0gMCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5wYXJzZSggbmFtZSwgdmFsdWUsIHNldHRpbmctPmRhdGEgKTsKKyAgICAgICAgICAgIHNldHRpbmctPmRlZmluZWQgPSAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NoZWNrX3JpdmFscyggICAgICAgICAgLy8gMCAtLSBPaywgMSAtLSBlcnJvcnMgZm91bmQuCisgICAgY2hhciBjb25zdCAqICAgICAgIG5hbWUsICAgICAvLyBOYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgY29uc3QgKiAgICAgICB2YWx1ZSwgICAgLy8gVmFsdWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHMgICAgLy8gTGlzdCBvZiByaXZhbCBzZXR0aW5ncyAodGhlIGxpc3QgbXVzdCBpbmNsdWRlIGN1cnJlbnQgb25lKS4KKykgeworCisgICAgaWYgKCByaXZhbHMgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gTG9vcCB0aHJ1IGhpZ2hlciBwcmlvcml0eSBzZXR0aW5ncyAobGlzdGVkIGJlZm9yZSBjdXJyZW50KS4KKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICggOyBzdHJjbXAoIHJpdmFsc1sgaSBdLT5uYW1lLCBuYW1lICkgIT0gMDsgaSsrICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByaXZhbHNbIGkgXSAhPSBOVUxMICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmICggcml2YWxzWyBpIF0gPT0gX19rbXBfYWZmaW5pdHlfbm90eXBlICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIEtNUF9BRkZJTklUWSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUgbmFtZSwKKyAgICAgICAgICAgIC8vIGl0IGRvZXMgbm90IHJpdmFsIE9NUF9QUk9DX0JJTkQgb3IgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmICggcml2YWxzWyBpIF0tPnNldCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJZ25vcmVkLCBuYW1lLCB2YWx1ZSwgcml2YWxzWyBpIF0tPm5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIHdoaWxlCisKKyAgICArKyBpOyAvLyBTa2lwIGN1cnJlbnQgc2V0dGluZy4KKyAgICByZXR1cm4gMDsKKworfTsgLy8gX19rbXBfc3RnX2NoZWNrX3JpdmFscworCisKKworc3RhdGljIGludAorX19rbXBfZW52X2lzRGVmaW5lZCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBuYW1lICk7CisgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgIHJjID0gc2V0dGluZy0+c2V0OworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICkgeworICAgIGludCByYyA9IDA7CisgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggbmFtZSApOworICAgIGlmICggc2V0dGluZyAhPSBOVUxMICkgeworICAgICAgICByYyA9IHNldHRpbmctPmRlZmluZWQ7CisgICAgICAgIGlmICggZmxhZyA+PSAwICkgeworICAgICAgICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IGZsYWc7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSgga21wX2Vudl9ibGtfdCogYmxvY2sgKSB7CisKKyAgICBjaGFyIGNvbnN0ICogdmFsdWU7CisKKyAgICAvKiBPTVBfTlVNX1RIUkVBRFMgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9OVU1fVEhSRUFEUyIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcyggX19rbXBfZGZsdF90ZWFtX250aCApOworICAgIH0KKworICAgIC8qIEtNUF9CTE9DS1RJTUUgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIktNUF9CTE9DS1RJTUUiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAga21wY19zZXRfYmxvY2t0aW1lKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgIH0KKworICAgIC8qIE9NUF9ORVNURUQgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9ORVNURUQiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfbmVzdGVkKCBfX2ttcF9kZmx0X25lc3RlZCApOworICAgIH0KKworICAgIC8qIE9NUF9EWU5BTUlDICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfRFlOQU1JQyIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9keW5hbWljKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgKTsKKyAgICB9CisKK30KKwordm9pZAorX19rbXBfZW52X2luaXRpYWxpemUoIGNoYXIgY29uc3QgKiBzdHJpbmcgKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGludCAgICAgICAgICAgaTsKKworICAgIF9fa21wX3N0Z19pbml0KCk7CisKKyAgICAvLyBIYWNrISEhCisgICAgaWYgKCBzdHJpbmcgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gX19rbXBfbWF4X250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIHN0cmluZyApOworCisgICAgLy8KKyAgICAvLyB1cGRhdGUgdGhlIHNldCBmbGFnIG9uIGFsbCBlbnRyaWVzIHRoYXQgaGF2ZSBhbiBlbnYgdmFyCisgICAgLy8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoKCBibG9jay52YXJzWyBpIF0ubmFtZSA9PSBOVUxMICkKKyAgICAgICAgICB8fCAoICpibG9jay52YXJzWyBpIF0ubmFtZSA9PSAnXDAnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBibG9jay52YXJzWyBpIF0udmFsdWUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIGJsb2NrLnZhcnNbIGkgXS5uYW1lICk7CisgICAgICAgIGlmICggc2V0dGluZyAhPSBOVUxMICkgeworICAgICAgICAgICAgc2V0dGluZy0+c2V0ID0gMTsKKyAgICAgICAgfQorICAgIH07IC8vIGZvciBpCisKKyAgICAvLyBTcGVjaWFsIGNhc2UuIElmIHdlIHBhcnNlIGVudmlyb25tZW50LCBub3QgYSBzdHJpbmcsIHByb2Nlc3MgS01QX1dBUk5JTkdTIGZpcnN0LgorICAgIGlmICggc3RyaW5nID09IE5VTEwgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICA9ICJLTVBfV0FSTklOR1MiOworICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgbmFtZSApOworICAgICAgICBfX2ttcF9zdGdfcGFyc2UoIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIFNwZWNpYWwgY2FzZS4gS01QX0FGRklOSVRZIGlzIG5vdCBhIHJpdmFsIHRvIG90aGVyIGFmZmluaXR5IGVudiB2YXJzCisgICAgLy8gaWYgbm8gYWZmaW5pdHkgdHlwZSBpcyBzcGVjaWZpZWQuICBXZSB3YW50IHRvIGFsbG93CisgICAgLy8gS01QX0FGRklOSVRZPVtub10sdmVyYm9zZS9bbm9dd2FybmluZ3MvZXRjLiAgdG8gYmUgZW5hYmxlZCB3aGVuCisgICAgLy8gc3BlY2lmeWluZyB0aGUgYWZmaW5pdHkgdHlwZSB2aWEgR09NUF9DUFVfQUZGSU5JVFkgb3IgdGhlIE9NUCA0LjAKKyAgICAvLyBhZmZpbml0eSBtZWNoYW5pc20uCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworICAgIGNoYXIgY29uc3QgKmFmZl9zdHIgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgIktNUF9BRkZJTklUWSIgKTsKKyAgICBpZiAoIGFmZl9zdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEtNUF9BRkZJTklUWSB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLgorICAgICAgICAvLyBXZSBqdXN0IHNlYXJjaCB0aGUgc3RyaW5nIGZvciAiY29tcGFjdCIsICJzY2F0dGVyIiwgZXRjLgorICAgICAgICAvLyB3aXRob3V0IHJlYWxseSBwYXJzaW5nIHRoZSBzdHJpbmcuICBUaGUgc3ludGF4IG9mIHRoZQorICAgICAgICAvLyBLTVBfQUZGSU5JVFkgZW52IHZhciBpcyBzdWNoIHRoYXQgbm9uZSBvZiB0aGUgYWZmaW5pdHkKKyAgICAgICAgLy8gdHlwZSBuYW1lcyBjYW4gYXBwZWFyIGFueXdoZXJlIG90aGVyIHRoYXQgdGhlIHR5cGUKKyAgICAgICAgLy8gc3BlY2lmaWVyLCBldmVuIGFzIHN1YnN0cmluZ3MuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgY2FuJ3QgZmluZCBhIGNhc2UtaW5zZW5zaXRpdmUgdmVyc2lvbiBvZiBzdHJzdHIgb24gV2luZG93cyogT1MuCisgICAgICAgIC8vIFVzZSB0aGUgY2FzZS1zZW5zaXRpdmUgdmVyc2lvbiBmb3Igbm93LgorICAgICAgICAvLworCisjIGlmIEtNUF9PU19XSU5ET1dTCisjICBkZWZpbmUgRklORCBzdHJzdHIKKyMgZWxzZQorIyAgZGVmaW5lIEZJTkQgc3RyY2FzZXN0cgorIyBlbmRpZgorCisgICAgICAgIGlmICggKCBGSU5EKCBhZmZfc3RyLCAibm9uZSIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJwaHlzaWNhbCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJsb2dpY2FsIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImNvbXBhY3QiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAic2NhdHRlciIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJleHBsaWNpdCIgKSA9PSBOVUxMICkKKyMgaWYgS01QX01JQworICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImJhbGFuY2VkIiApID09IE5VTEwgKQorIyBlbmRpZgorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImRpc2FibGVkIiApID09IE5VTEwgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsKKyAgICAgICAgfQorIyB1bmRlZiBGSU5ECisgICAgfQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8KKyAgICAvLyBTZXQgdXAgdGhlIG5lc3RlZCBwcm9jIGJpbmQgdHlwZSB2ZWN0b3IuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPSAoa21wX3Byb2NfYmluZF90ICopCisgICAgICAgICAgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8vCisgICAgLy8gTm93IHByb2Nlc3MgYWxsIG9mIHRoZSBzZXR0aW5ncy4KKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZSggYmxvY2sudmFyc1sgaSBdLm5hbWUsIGJsb2NrLnZhcnNbIGkgXS52YWx1ZSApOworICAgIH07IC8vIGZvciBpCisKKyAgICAvLworICAgIC8vIElmIHVzZXIgbG9ja3MgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIGRvbid0IHJlc2V0IHRoZSBsb2NrIHZwdHIgdGFibGUuCisgICAgLy8KKyAgICBpZiAoICEgX19rbXBfaW5pdF91c2VyX2xvY2tzICkgeworICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycyggX19rbXBfdXNlcl9sb2NrX2tpbmQgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0cmluZyAhPSBOVUxMKTsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfZGVmYXVsdCApOworICAgIH0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAvLworICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIG1hY2hpbmUvT1MgaXMgYWN0dWFsbHkgY2FwYWJsZSBvZiBzdXBwb3J0aW5nCisgICAgICAgIC8vIGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBjb25zdCBjaGFyICp2YXIgPSAiS01QX0FGRklOSVRZIjsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsgIC8vIHNob3VsZCBhbHJlYWR5IGJlIDAKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIHZhciApOworICAgICAgICAgICAgaWYgKCAhIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0ICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCApICkgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb3RTdXBwb3J0ZWQsIHZhciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQgKSAgeworICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2Rpc2FibGVkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2hlcmUgc3VwcG9ydGVkIHRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgS01QX0FGRklOSVRZCisgICAgICAgICAgICAvLyBtZWNoYW5pc20uICBPbiBPUyBYKiBldGMuIGl0IGlzIG5vbmUuCisgICAgICAgICAgICAvLworIyAgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZWxzZQorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyAgZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIE9NUF9QUk9DX0JJTkQgd2FzIHNwZWNpZmllZCAoc28gd2UgYXJlIHVzaW5nIE9wZW5NUCA0LjAgYWZmaW5pdHkpCisgICAgICAgIC8vIGJ1dCBPTVBfUExBQ0VTIHdhcyBub3QsIHRoZW4gaXQgZGVmYXVsdHMgdG8gdGhlIGVxdWl2YWxlbnQgb2YKKyAgICAgICAgLy8gS01QX0FGRklOSVRZPWNvbXBhY3Qsbm9kdXBsaWNhdGVzLGdyYW51bGFyaXR5PWZpbmUuCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCApIHsKKyAgICAgICAgICAgIGlmICggKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKQorIyAgaWYgISBLTVBfTUlDCisgICAgICAgICAgICAgIHx8ICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkKKyMgIGVuZGlmCisgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfZmFsc2UgKQorICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9kaXNhYmxlZCApICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisjIGVuZGlmIC8vICBPTVBfNDBfRU5BQkxFRAorCisgICAgICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKQorICAgICAgICAgICAgICAgICAgfHwgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlR5cGVDYW50VXNlTXVsdEdyb3VwcywgIm5vbmUiLCAiY29tcGFjdCIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMsICJjb3JlIiwgInRocmVhZCIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fdGhyZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMsICJwYWNrYWdlIiwgImdyb3VwIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ub2RlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMsICJub2RlIiwgImdyb3VwIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisjIGlmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfc2NhdHRlcjsKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworIyBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKQorICAgICAgICAgICAgICAgICAgJiYgICggX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwICkgKSB7CisjIGlmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworIyBlbHNlCisgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV90eXBlICAgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3R5cGUgICAgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9jb21wYWN0ICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9ncmFuICAgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X2dyYW4gICAgICAgICApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdCisgICAgICAgICAgIT0gcHJvY19iaW5kX2RlZmF1bHQgKTsKKyMgZW5kaWYKKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBpZiAoIF9fa21wX3ZlcnNpb24gKSB7CisgICAgICAgIF9fa21wX3ByaW50X3ZlcnNpb25fMSgpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBQb3N0LWluaXRpYWxpemF0aW9uIHN0ZXA6IHNvbWUgZW52LiB2YXJzIG5lZWQgdGhlaXIgdmFsdWUncyBmdXJ0aGVyIHByb2Nlc3NpbmcKKyAgICBpZiAoIHN0cmluZyAhPSBOVUxMKSB7IC8vIGttcF9zZXRfZGVmYXVsdHMoKSB3YXMgY2FsbGVkCisgICAgICAgIF9fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSggJmJsb2NrICk7CisgICAgfQorCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisKKyAgICBLTVBfTUIoKTsKKworfSAvLyBfX2ttcF9lbnZfaW5pdGlhbGl6ZQorCisKK3ZvaWQKK19fa21wX2Vudl9wcmludCgpIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsKKyAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsKKworICAgIC8vIFByaW50IHJlYWwgZW52aXJvbm1lbnQgdmFsdWVzLgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4lc1xuXG4iLCBLTVBfSTE4Tl9TVFIoIFVzZXJTZXR0aW5ncyApICApOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICA9IGJsb2NrLnZhcnNbIGkgXS5uYW1lOworICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBibG9jay52YXJzWyBpIF0udmFsdWU7CisgICAgICAgIGlmICgKKyAgICAgICAgICAgIHN0cmxlbiggbmFtZSApID4gNAorICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICggc3RybmNtcCggbmFtZSwgIktNUF8iLCA0ICkgPT0gMCApIHx8IHN0cm5jbXAoIG5hbWUsICJPTVBfIiwgNCApID09IDAKKyAgICAgICAgICAgICNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgICAgICB8fCBzdHJuY21wKCBuYW1lLCAiR09NUF8iLCA1ICkgPT0gMAorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9HT01QX0NPTVBBVAorICAgICAgICApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiIgKTsKKworICAgIC8vIFByaW50IGludGVybmFsIChlZmZlY3RpdmUpIHNldHRpbmdzLgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcblxuIiwgS01QX0kxOE5fU1RSKCBFZmZlY3RpdmVTZXR0aW5ncyApICk7CisgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBpZiAoICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQoICYgYnVmZmVyLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5kYXRhICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfZnJlZSggJiBibG9jayApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworfSAvLyBfX2ttcF9lbnZfcHJpbnQKKworCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX2Vudl9wcmludF8yKCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9lbnZfZm9ybWF0ID0gMTsKKworICAgIF9fa21wX3N0Z19pbml0KCk7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7CisgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuJXNcbiIsIEtNUF9JMThOX1NUUiggRGlzcGxheUVudkJlZ2luICkgICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICBfT1BFTk1QPSclZCdcbiIsIF9fa21wX29wZW5tcF92ZXJzaW9uICk7CisKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgKCAoIF9fa21wX2Rpc3BsYXlfZW52ICYmIHN0cm5jbXAoIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsICJPTVBfIiwgNCApID09IDAgKSB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICkgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCggJiBidWZmZXIsIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIF9fa21wX3N0Z190YWJsZVsgaSBdLmRhdGEgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsIEtNUF9JMThOX1NUUiggRGlzcGxheUVudkVuZCApICApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4iICk7CisKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfZnJlZSggJiBibG9jayApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworfSAvLyBfX2ttcF9lbnZfcHJpbnRfMgorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKworCisvLyBlbmQgb2YgZmlsZQorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmggYi9yYzEvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkZGMxZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaApAQCAtMCwwICsxLDUyIEBACisvKgorICoga21wX3NldHRpbmdzLmggLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqICRSZXZpc2lvbjogNDI1OTggJAorICogJERhdGU6IDIwMTMtMDgtMTkgMTU6NDA6NTYgLTA1MDAgKE1vbiwgMTkgQXVnIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU0VUVElOR1NfSAorI2RlZmluZSBLTVBfU0VUVElOR1NfSAorCit2b2lkIF9fa21wX3Jlc2V0X2dsb2JhbF92YXJzKCB2b2lkICk7Cit2b2lkIF9fa21wX2Vudl9pbml0aWFsaXplKCBjaGFyIGNvbnN0ICogKTsKK3ZvaWQgX19rbXBfZW52X3ByaW50KCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQgX19rbXBfZW52X3ByaW50XzIoKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCitpbnQgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICk7Cit2b2lkIF9fa21wX2luaXRfZGZsdF90ZWFtX250aCgpOworaW50IF9fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCBjaGFyIGNvbnN0ICogKTsKK2ludCBfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQsIGludCwgaW50KTsKKworI2lmIEtNUF9NSUMKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRSAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCB4ICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfQk9PTCAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfSU5UICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZWxzZQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihIb3N0KSwgeCApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlID8gIlRSVUUiIDogIkZBTFNFIiApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVkJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1NUUiAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICkKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1NFVFRJTkdTX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF9zdHIuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNDY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc3RyLmMKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiBrbXBfc3RyLmMgLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvLyB2YV8qCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8vIHZzbnByaW50ZigpCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIG1hbGxvYygpLCByZWFsbG9jKCkKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RyaW5nIGJ1ZmZlci4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFVzYWdlOgorCisgICAgICAgIC8vIERlY2xhcmUgYnVmZmVyIGFuZCBpbml0aWFsaXplIGl0LgorICAgICAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisJX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIFByaW50IHRvIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFcnJvciBpbiBmaWxlIFwiJXNcIiBsaW5lICVkXG4iLCAiZm9vLmMiLCAxMiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICA8JXM+XG4iLCBsaW5lICk7CisKKyAgICAgICAgLy8gVXNlIGJ1ZmZlciBjb250ZW50cy4gYnVmZmVyLnN0ciBpcyBhIHBvaW50ZXIgdG8gZGF0YSwgYnVmZmVyLnVzZWQgaXMgYSBudW1iZXIgb2YgcHJpbnRlZAorICAgICAgICAvLyBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8pLgorICAgICAgICB3cml0ZSggZmQsIGJ1ZmZlci5zdHIsIGJ1ZmZlci51c2VkICk7CisKKyAgICAgICAgLy8gRnJlZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRldGFjaCBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gYnVmZmVyOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5zdHI7ICAgIC8vIFRoYXQgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBldmVudHVhbGx5LgorCisKKyAgICBOb3RlczoKKworICAgICAgICAqIEJ1ZmZlciB1c2VycyBtYXkgdXNlIGJ1ZmZlci5zdHIgYW5kIGJ1ZmZlci51c2VkLiBVc2VycyBzaG91bGQgbm90IGNoYW5nZSBhbnkgZmllbGRzIG9mCisgICAgICAgICAgYnVmZmVyIGRpcmVjdGx5LgorCisgICAgICAgICogYnVmZmVyLnN0ciBpcyBuZXZlciBOVUxMLiBJZiBidWZmZXIgaXMgZW1wdHksIGJ1ZmZlci5zdHIgcG9pbnRzIHRvIGVtcHR5IHN0cmluZyAoIiIpLgorCisgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJ1ZmZlciB1c2VzIHN0YWNrIG1lbW9yeSAoYnVmZmVyLmJ1bGspIGZpcnN0LiBJZiBzdGFjayBtZW1vcnkgaXMKKyAgICAgICAgICBleGhhdXN0ZWQsIGJ1ZmZlciBhbGxvY2F0ZXMgbWVtb3J5IG9uIGhlYXAgYnkgbWFsbG9jKCksIGFuZCByZWFsbG9jYXRlcyBpdCBieSByZWFsbG9jKCkKKyAgICAgICAgICBhcyBhbW91bnQgb2YgdXNlZCBtZW1vcnkgZ3Jvd3MuCisKKyAgICAgICAgKiBCdWZmZXIgZG91YmxlcyBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBlYWNoIHRpbWUgaXQgaXMgZXhoYXVzdGVkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyBUT0RPOiBfX2ttcF9zdHJfYnVmX3ByaW50KCkgY2FuIHVzZSB0aHJlYWQgbG9jYWwgbWVtb3J5IGFsbG9jYXRvci4KKworI2RlZmluZSBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zdHIgIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPj0gc2l6ZW9mKCAoYiktPmJ1bGsgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSAlIHNpemVvZiggKGIpLT5idWxrICkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHVuc2lnbmVkKShiKS0+dXNlZCA8IChiKS0+c2l6ZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPT0gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyID09ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+IHNpemVvZiggKGIpLT5idWxrICkgPyAoYiktPnN0ciAhPSAmIChiKS0+YnVsa1sgMCBdIDogMSApOyAgIFwKKyAgICB9CisKK3ZvaWQKKyBfX2ttcF9zdHJfYnVmX2NsZWFyKAorICAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT51c2VkID4gMCApIHsKKyAgICAgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICAgICAgYnVmZmVyLT5zdHJbIDAgXSA9IDA7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NsZWFyCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9yZXNlcnZlKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgaW50ICAgICAgICAgICAgIHNpemUKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKworICAgIGlmICggYnVmZmVyLT5zaXplIDwgKHVuc2lnbmVkIGludClzaXplICkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmZmVyLT5zaXplICo9IDI7CisgICAgICAgIH0gd2hpbGUgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKTsKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSAmIGJ1ZmZlci0+YnVsa1sgMCBdICkgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIG1lbWNweSggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+YnVsaywgYnVmZmVyLT51c2VkICsgMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfUkVBTExPQyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBidWZmZXItPnNpemUgPj0gKHVuc2lnbmVkKXNpemUgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfcmVzZXJ2ZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZGV0YWNoKAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyCispIHsKKworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKKyAgICAvLyBJZiBpbnRlcm5hbCBidWxrIGlzIHVzZWQsIGFsbG9jYXRlIG1lbW9yeSBhbmQgY29weSBpdC4KKyAgICBpZiAoIGJ1ZmZlci0+c2l6ZSA8PSBzaXplb2YoIGJ1ZmZlci0+YnVsayApICkgeworICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgbWVtY3B5KCBidWZmZXItPnN0ciwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdHJfYnVmX2RldGFjaAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZnJlZSgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT5zaXplID4gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlci0+c3RyICk7CisgICAgfTsgLy8gaWYKKyAgICBidWZmZXItPnN0ciAgPSBidWZmZXItPmJ1bGs7CisgICAgYnVmZmVyLT5zaXplID0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKTsKKyAgICBidWZmZXItPnVzZWQgPSAwOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfZnJlZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfY2F0KAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgIHN0ciwKKyAgICBpbnQgICAgICAgICAgICAgbGVuCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGVuID49IDAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoIGJ1ZmZlciwgYnVmZmVyLT51c2VkICsgbGVuICsgMSApOworICAgIG1lbWNweSggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIHN0ciwgbGVuICk7CisgICAgYnVmZmVyLT5zdHJbIGJ1ZmZlci0+dXNlZCArIGxlbiBdID0gMDsKKyAgICBidWZmZXItPnVzZWQgKz0gbGVuOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfY2F0CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl92cHJpbnQoCisgICAga21wX3N0cl9idWZfdCAqICBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgICBmb3JtYXQsCisgICAgdmFfbGlzdCAgICAgICAgICBhcmdzCispIHsKKworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKKyAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgaW50IGNvbnN0IGZyZWUgPSBidWZmZXItPnNpemUgLSBidWZmZXItPnVzZWQ7CisgICAgICAgIGludCAgICAgICByYzsKKyAgICAgICAgaW50ICAgICAgIHNpemU7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZvcm1hdCBzdHJpbmcuCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgT24gTGludXgqIE9TIEludGVsKFIpIDY0LCB2c25wcmludGYoKSBtb2RpZmllcyBhcmdzIGFyZ3VtZW50LCBzbyB2c25wcmludGYoKSBjcmFzaGVzIGlmIGl0CisgICAgICAgICAgICAgICAgaXMgY2FsbGVkIGZvciB0aGUgc2Vjb25kIHRpbWUgd2l0aCB0aGUgc2FtZSBhcmdzLiBUbyBwcmV2ZW50IHRoZSBjcmFzaCwgd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgIHBhc3MgYSBmcmVzaCBpbnRhY3QgY29weSBvZiBhcmdzIHRvIHZzbnByaW50ZigpIG9uIGVhY2ggaXRlcmF0aW9uLgorCisgICAgICAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgc3RhbmRhcmQgdmFfY29weSgpIG1hY3JvIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIEhvd2V2ZXIsIGl0CisgICAgICAgICAgICAgICAgc2VlbXMgdnNucHJpbnRmKCkgZG9lcyBub3QgbW9kaWZ5IGFyZ3MgYXJndW1lbnQgb24gV2luZG93cyogT1MuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAjaWYgISBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgIHZhX2xpc3QgX2FyZ3M7CisgICAgICAgICAgICAgICAgX192YV9jb3B5KCBfYXJncywgYXJncyApOyAgLy8gTWFrZSBjb3B5IG9mIGFyZ3MuCisgICAgICAgICAgICAgICAgI2RlZmluZSBhcmdzIF9hcmdzICAgICAgICAgLy8gU3Vic3RpdHV0ZSBhcmdzIHdpdGggaXRzIGNvcHksIF9hcmdzLgorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICByYyA9IHZzbnByaW50ZiggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIGZyZWUsIGZvcm1hdCwgYXJncyApOworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAjdW5kZWYgYXJncyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgICAgIHZhX2VuZCggX2FyZ3MgKTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICAgICBpZiAoIHJjID49IDAgJiYgcmMgPCBmcmVlICkgeworICAgICAgICAgICAgYnVmZmVyLT51c2VkICs9IHJjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgIGlmICggcmMgPj0gMCApIHsKKyAgICAgICAgICAgIC8vIEM5OS1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIG9mIHZzbnByaW50ZiByZXR1cm5zIHJlcXVpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+dXNlZCArIHJjICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9sZGVyIGltcGxlbWVudGF0aW9ucyBqdXN0IHJldHVybiAtMS4gRG91YmxlIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggYnVmZmVyLCBzaXplICk7CisKKyAgICAgICAgLy8gQW5kIHRyeSBhZ2Fpbi4KKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfdnByaW50CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggYnVmZmVyLCBmb3JtYXQsIGFyZ3MgKTsKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisKKworLyoKKyAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIHNwZWNpZmllZCBzaXplIHRvIGJ1ZmZlci4gU2l6ZSBpcyBleHByZXNzZWQgdXNpbmcgYmlnZ2VzdCBwb3NzaWJsZSB1bml0LCBmb3IKKyAgICBleGFtcGxlIDEwMjQgaXMgcHJpbnRlZCBhcyAiMWsiLgorKi8KKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWYsCisgICAgc2l6ZV90ICAgICAgICAgIHNpemUKKykgeworCisgICAgY2hhciBjb25zdCAqIG5hbWVzW10gPSB7ICIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIiB9OworICAgIGludCBjb25zdCAgICB1bml0cyAgID0gc2l6ZW9mKCBuYW1lcyApIC8gc2l6ZW9mKCBjaGFyIGNvbnN0ICogKTsKKyAgICBpbnQgICAgICAgICAgdSAgICAgICA9IDA7CisgICAgaW50ICAgICAgICAgIHJjOworICAgIGlmICggc2l6ZSA+IDAgKSB7CisgICAgICAgIHdoaWxlICggKCBzaXplICUgMTAyNCA9PSAwICkgJiYgKCB1ICsgMSA8IHVuaXRzICkgKSB7CisgICAgICAgICAgICBzaXplID0gc2l6ZSAvIDEwMjQ7CisgICAgICAgICAgICArKyB1OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWYsICIlIiBLTVBfU0laRV9UX1NQRUMgIiVzIiwgc2l6ZSwgbmFtZXNbIHUgXSApOworCit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZQorCisKK3ZvaWQKK19fa21wX3N0cl9mbmFtZV9pbml0KAorICAgIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHBhdGgKKykgeworCisgICAgZm5hbWUtPnBhdGggPSBOVUxMOworICAgIGZuYW1lLT5kaXIgID0gTlVMTDsKKyAgICBmbmFtZS0+YmFzZSA9IE5VTEw7CisKKyAgICBpZiAoIHBhdGggIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHNsYXNoID0gTlVMTDsgICAgLy8gUG9pbnRlciB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgZGlyLgorICAgICAgICBjaGFyICogYmFzZSAgPSBOVUxMOyAgICAvLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYmFzZW5hbWUuCisgICAgICAgIGZuYW1lLT5wYXRoID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgcGF0aCApOworICAgICAgICAgICAgLy8gT3JpZ2luYWwgY29kZSB1c2VkIHN0cmR1cCgpIGZ1bmN0aW9uIHRvIGNvcHkgYSBzdHJpbmcsIGJ1dCBvbiBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NCBpdAorICAgICAgICAgICAgLy8gY2F1c2VzIGFzc2VydGlvb24gaWQgZGVidWcgaGVhcCwgc28gSSBoYWQgdG8gcmVwbGFjZSBzdHJkdXAgd2l0aCBfX2ttcF9zdHJfZm9ybWF0KCkuCisgICAgICAgIGlmICggS01QX09TX1dJTkRPV1MgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfcmVwbGFjZSggZm5hbWUtPnBhdGgsICdcXCcsICcvJyApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBmbmFtZS0+ZGlyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZm5hbWUtPnBhdGggKTsKKyAgICAgICAgc2xhc2ggPSBzdHJyY2hyKCBmbmFtZS0+ZGlyLCAnLycgKTsKKyAgICAgICAgaWYgKCBLTVBfT1NfV0lORE9XUyAmJiBzbGFzaCA9PSBOVUxMICkgeyAgICAgICAgICAgLy8gT24gV2luZG93cyogT1MsIGlmIHNsYXNoIG5vdCBmb3VuZCwKKyAgICAgICAgICAgIGNoYXIgZmlyc3QgPSBUT0xPV0VSKCBmbmFtZS0+ZGlyWyAwIF0gKTsgICAgIC8vIGxvb2sgZm9yIGRyaXZlLgorICAgICAgICAgICAgaWYgKCAnYScgPD0gZmlyc3QgJiYgZmlyc3QgPD0gJ3onICYmIGZuYW1lLT5kaXJbIDEgXSA9PSAnOicgKSB7CisgICAgICAgICAgICAgICAgc2xhc2ggPSAmIGZuYW1lLT5kaXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGJhc2UgPSAoIHNsYXNoID09IE5VTEwgPyBmbmFtZS0+ZGlyIDogc2xhc2ggKyAxICk7CisgICAgICAgIGZuYW1lLT5iYXNlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgYmFzZSApOyAgICAvLyBDb3B5IGJhc2VuYW1lCisgICAgICAgICogYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdHJ1bmNhdGUgZGlyLgorICAgIH07IC8vIGlmCisKK30gLy8ga21wX3N0cl9mbmFtZV9pbml0CisKKwordm9pZAorX19rbXBfc3RyX2ZuYW1lX2ZyZWUoCisgICAga21wX3N0cl9mbmFtZV90ICogZm5hbWUKKykgeworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPnBhdGggKSApOworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPmRpciAgKSApOworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPmJhc2UgKSApOworfSAvLyBrbXBfc3RyX2ZuYW1lX2ZyZWUKKworCitpbnQKK19fa21wX3N0cl9mbmFtZV9tYXRjaCgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgY29uc3QgKiBmbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgICBwYXR0ZXJuCispIHsKKworICAgIGludCBkaXJfbWF0Y2ggID0gMTsKKyAgICBpbnQgYmFzZV9tYXRjaCA9IDE7CisKKyAgICBpZiAoIHBhdHRlcm4gIT0gTlVMTCApIHsKKyAgICAgICAga21wX3N0cl9mbmFtZV90IHB0cm47CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIHB0cm4sIHBhdHRlcm4gKTsKKyAgICAgICAgZGlyX21hdGNoID0KKyAgICAgICAgICAgIHN0cmNtcCggcHRybi5kaXIsICIqLyIgKSA9PSAwCisgICAgICAgICAgICB8fAorICAgICAgICAgICAgKCBmbmFtZS0+ZGlyICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZiggZm5hbWUtPmRpciwgcHRybi5kaXIgKSApOworICAgICAgICBiYXNlX21hdGNoID0KKyAgICAgICAgICAgIHN0cmNtcCggcHRybi5iYXNlLCAiKiIgKSA9PSAwCisgICAgICAgICAgICB8fAorICAgICAgICAgICAgKCBmbmFtZS0+YmFzZSAhPSBOVUxMICYmIF9fa21wX3N0cl9lcWYoIGZuYW1lLT5iYXNlLCBwdHJuLmJhc2UgKSApOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBwdHJuICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiBkaXJfbWF0Y2ggJiYgYmFzZV9tYXRjaDsKKworfSAvLyBfX2ttcF9zdHJfZm5hbWVfbWF0Y2gKKworCitrbXBfc3RyX2xvY190CitfX2ttcF9zdHJfbG9jX2luaXQoCisgICAgY2hhciBjb25zdCAqIHBzb3VyY2UsCisgICAgaW50ICAgICAgICAgIGluaXRfZm5hbWUKKykgeworCisgICAga21wX3N0cl9sb2NfdCBsb2M7CisKKyAgICBsb2MuX2J1bGsgPSBOVUxMOworICAgIGxvYy5maWxlICA9IE5VTEw7CisgICAgbG9jLmZ1bmMgID0gTlVMTDsKKyAgICBsb2MubGluZSAgPSAwOworICAgIGxvYy5jb2wgICA9IDA7CisKKyAgICBpZiAoIHBzb3VyY2UgIT0gTlVMTCApIHsKKworICAgICAgICBjaGFyICogc3RyICAgPSBOVUxMOworICAgICAgICBjaGFyICogZHVtbXkgPSBOVUxMOworICAgICAgICBjaGFyICogbGluZSAgPSBOVUxMOworICAgICAgICBjaGFyICogY29sICAgPSBOVUxMOworCisgICAgICAgIC8vIENvcHkgcHNvdXJjZSB0byBrZWVwIGl0IGludGFjdC4KKyAgICAgICAgbG9jLl9idWxrID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgcHNvdXJjZSApOworCisgICAgICAgIC8vIFBhcnNlIHBzb3VyY2Ugc3RyaW5nOiAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7IgorICAgICAgICBzdHIgPSBsb2MuX2J1bGs7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgZHVtbXksICAgICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbG9jLmZpbGUsICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbG9jLmZ1bmMsICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbGluZSwgICAgICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgY29sLCAgICAgICYgc3RyICk7CisKKyAgICAgICAgLy8gQ29udmVydCBsaW5lIGFuZCBjb2wgaW50byBudW1iZXJpYyB2YWx1ZXMuCisgICAgICAgIGlmICggbGluZSAhPSBOVUxMICkgeworICAgICAgICAgICAgbG9jLmxpbmUgPSBhdG9pKCBsaW5lICk7CisgICAgICAgICAgICBpZiAoIGxvYy5saW5lIDwgMCApIHsKKyAgICAgICAgICAgICAgICBsb2MubGluZSA9IDA7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIGNvbCAhPSBOVUxMICkgeworICAgICAgICAgICAgbG9jLmNvbCA9IGF0b2koIGNvbCApOworICAgICAgICAgICAgaWYgKCBsb2MuY29sIDwgMCApIHsKKyAgICAgICAgICAgICAgICBsb2MuY29sID0gMDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgbG9jLmZuYW1lLCBpbml0X2ZuYW1lID8gbG9jLmZpbGUgOiBOVUxMICk7CisKKyAgICByZXR1cm4gbG9jOworCit9IC8vIGttcF9zdHJfbG9jX2luaXQKKworCit2b2lkCitfX2ttcF9zdHJfbG9jX2ZyZWUoCisgICAga21wX3N0cl9sb2NfdCAqIGxvYworKSB7CisgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgbG9jLT5mbmFtZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsb2MtPl9idWxrICk7CisgICAgbG9jLT5fYnVsayA9IE5VTEw7CisgICAgbG9jLT5maWxlICA9IE5VTEw7CisgICAgbG9jLT5mdW5jICA9IE5VTEw7Cit9IC8vIGttcF9zdHJfbG9jX2ZyZWUKKworCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wYXJlIGZpbGUgbmFtZXMuIE9uIFdpbmRvd3MqIE9TIGZpbGUgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsCisgICAgc28gZnVuY3Rpb25zIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gT24gTGludXgqIE9TIGl0IHBlcmZvcm1zIGNhc2Utc2Vuc2l0aXZlCisgICAgY29tcGFyaXNvbi4KKyAgICBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJucyAqdHJ1ZSogaWYgc3RyaW5ncyBhcmUgKmVxdWFsKi4KKyovCisKK2ludAorX19rbXBfc3RyX2VxZiggICAgICAgICAvLyBUcnVlLCBpZiBzdHJpbmdzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGNoYXIgY29uc3QgKiBsaHMsICAvLyBGaXJzdCBzdHJpbmcuCisgICAgY2hhciBjb25zdCAqIHJocyAgIC8vIFNlY29uZCBzdHJpbmcuCispIHsKKyAgICBpbnQgcmVzdWx0OworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICByZXN1bHQgPSAoIF9zdHJpY21wKCBsaHMsIHJocyApID09IDAgKTsKKyAgICAjZWxzZQorICAgICAgICByZXN1bHQgPSAoIHN0cmNtcCggbGhzLCByaHMgKSA9PSAwICk7CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX2VxZgorCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIHNwcmludGYsIGJ1dCBpdCAqYWxsb2NhdGVzKiBuZXcgYnVmZmVyLCB3aGljaCBtdXN0IGJlIGZyZWVkIGV2ZW50dWFsbHkgYnkKKyAgICBfX2ttcF9zdHJfZnJlZSgpLiBUaGUgZnVuY3Rpb24gaXMgdmVyeSBjb252ZW5pZW50IGZvciBjb25zdHJ1Y3Rpbmcgc3RyaW5ncywgaXQgc3VjY2Vzc2Z1bGx5CisgICAgcmVwbGFjZXMgc3RyZHVwKCksIHN0cmNhdCgpLCBpdCBmcmVlcyBwcm9ncmFtbWVyIGZyb20gYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBoZWxwcyB0byBhdm9pZAorICAgIGJ1ZmZlciBvdmVyZmxvd3MuIEV4YW1wbGVzOgorCisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG9yaWcgKTsgICAgICAgICAgICAgIC8vIHN0cmR1cCgpLCBkbyBub3QgY2FyZSBhYm91dCBidWZmZXIgc2l6ZS4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyVzIiwgb3JpZzEsIG9yaWcyICk7ICAgIC8vIHN0cmNhdCgpLCBkbyBub3QgY2FyZSBhYm91dCBidWZmZXIgc2l6ZS4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcy8lcy50eHQiLCBwYXRoLCBmaWxlICk7IC8vIGNvbnN0cnVjdGluZyBzdHJpbmcuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworCisgICAgUGVyZm9ybWFuY2Ugbm90ZToKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHdpdGggbWFsbG9jKCkgY2FsbHMsIHNvIGRvIG5vdCBjYWxsIGl0IGZyb20KKyAgICAgICAgcGVyZm9ybWFuY2UtY3JpdGljYWwgY29kZS4gSW4gcGVyZm9ybWFuY2UtY3JpdGljYWwgY29kZSBjb25zaWRlciB1c2luZyBrbXBfc3RyX2J1Zl90CisgICAgICAgIGluc3RlYWQsIHNpbmNlIGl0IHVzZXMgc3RhY2stYWxsb2NhdGVkIGJ1ZmZlciBmb3Igc2hvcnQgc3RyaW5ncy4KKworICAgIFdoeSBkb2VzIHRoaXMgZnVuY3Rpb24gdXNlIG1hbGxvYygpPworICAgICAgICAxLiBfX2ttcF9hbGxvY2F0ZSgpIHJldHVybnMgY2FjaGUtYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuIFRoZXJlIGFyZSBubworICAgICAgICAgICByZWFzb25zIGluIHVzaW5nIF9fa21wX2FsbG9jYXRlKCkgZm9yIHN0cmluZ3MgZHVlIHRvIGV4dHJhIG92ZXJoZWFkIHdoaWxlIGNhY2hlLWFsaWduZWQKKyAgICAgICAgICAgbWVtb3J5IGlzIG5vdCBuZWNlc3NhcnkuCisgICAgICAgIDIuIF9fa21wX3RocmVhZF9tYWxsb2MoKSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlIGl0IHJlcXVpcmVzIHBvaW50ZXIgdG8gdGhyZWFkIHN0cnVjdHVyZS4KKyAgICAgICAgICAgV2UgbmVlZCB0byBwZXJmb3JtIHN0cmluZyBvcGVyYXRpb25zIGR1cmluZyBsaWJyYXJ5IHN0YXJ0dXAgKGZvciBleGFtcGxlLCBpbgorICAgICAgICAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoKSkgd2hlbiBubyB0aHJlYWQgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHlldC4KKyAgICBTbyBzdGFuZGFyZCBtYWxsb2MoKSBpcyB0aGUgb25seSBhdmFpbGFibGUgb3B0aW9uLgorKi8KKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9zdHJfZnJlZSgpLgorCitjaGFyICoKK19fa21wX3N0cl9mb3JtYXQoICAgICAgICAgICAvLyBBbGxvY2F0ZWQgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKiBmb3JtYXQsICAgIC8vIEZvcm1hdCBzdHJpbmcuCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgcGFyYW1ldGVycy4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCAgICAgc2l6ZSAgID0gNTEyOworICAgIGNoYXIgKiAgYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgICAgIHJjOworCisgICAgLy8gQWxsb2NhdGUgYnVmZmVyLgorICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICB9OyAvLyBpZgorCisgICAgZm9yICggOyA7ICkgeworCisgICAgICAgIC8vIFRyeSB0byBmb3JtYXQgc3RyaW5nLgorICAgICAgICB2YV9zdGFydCggYXJncywgZm9ybWF0ICk7CisgICAgICAgIHJjID0gdnNucHJpbnRmKCBidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyApOworICAgICAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IHNpemUgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLgorICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKyAgICAJICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIHJldHVybiBidWZmZXI7CisKK30gLy8gZnVuYyBfX2ttcF9zdHJfZm9ybWF0CisKKwordm9pZAorX19rbXBfc3RyX2ZyZWUoCisgICAgY2hhciBjb25zdCAqICogc3RyCispIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIHN0ciApOworICAgICogc3RyID0gTlVMTDsKK30gLy8gZnVuYyBfX2ttcF9zdHJfZnJlZQorCisKKy8qIElmIGxlbiBpcyB6ZXJvLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBhbmQgZGF0YSBoYXZlIGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2guCisgICBJZiBsZW4gaXMgbmVnYXRpdmUsIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb2YgZGF0YS4KKyAgIElmIGxlbiBpcyBwb3NpdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhIG9yCisgICAgIHZpY2UgdmVyc2EsIGFuZCBuZWl0aGVyIGlzIHNob3J0ZXIgdGhhbiBsZW4uCisqLworaW50CitfX2ttcF9zdHJfbWF0Y2goCisgICAgY2hhciBjb25zdCAqIHRhcmdldCwKKyAgICBpbnQgICAgICAgICAgbGVuLAorICAgIGNoYXIgY29uc3QgKiBkYXRhCispIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoIHRhcmdldCA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH07IC8vIGlmCisgICAgZm9yICggaSA9IDA7IHRhcmdldFtpXSAmJiBkYXRhW2ldOyArKyBpICkgeworICAgICAgICBpZiAoIFRPTE9XRVIoIHRhcmdldFtpXSApICE9IFRPTE9XRVIoIGRhdGFbaV0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHJldHVybiAoICggbGVuID4gMCApID8gaSA+PSBsZW4gOiAoICEgdGFyZ2V0W2ldICYmICggbGVuIHx8ICEgZGF0YVtpXSApICkgKTsKK30gLy8gX19rbXBfc3RyX21hdGNoCisKKworaW50CitfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJmYWxzZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9mZiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiMCIsICAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIuZmFsc2UuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mLiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAibm8iLCAgICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF90cnVlKCBjaGFyIGNvbnN0ICogZGF0YSApIHsKKyAgICBpbnQgcmVzdWx0ID0KKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAidHJ1ZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9uIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIxIiwgICAgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnRydWUuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi50LiIsICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ5ZXMiLCAgICAxLCBkYXRhICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX21hdGNoX3RydWUKKwordm9pZAorX19rbXBfc3RyX3JlcGxhY2UoCisgICAgY2hhciAqIHN0ciwKKyAgICBjaGFyICAgc2VhcmNoX2ZvciwKKyAgICBjaGFyICAgcmVwbGFjZV93aXRoCispIHsKKworICAgIGNoYXIgKiBmb3VuZCA9IE5VTEw7CisKKyAgICBmb3VuZCA9IHN0cmNociggc3RyLCBzZWFyY2hfZm9yICk7CisgICAgd2hpbGUgKCBmb3VuZCApIHsKKyAgICAgICAgKiBmb3VuZCA9IHJlcGxhY2Vfd2l0aDsKKyAgICAgICAgZm91bmQgPSBzdHJjaHIoIGZvdW5kICsgMSwgc2VhcmNoX2ZvciApOworICAgIH07IC8vIHdoaWxlCisKK30gLy8gX19rbXBfc3RyX3JlcGxhY2UKKworCit2b2lkCitfX2ttcF9zdHJfc3BsaXQoCisgICAgY2hhciAqICBzdHIsICAgIC8vIEk6IFN0cmluZyB0byBzcGxpdC4KKyAgICBjaGFyICAgIGRlbGltLCAgLy8gSTogQ2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIGNoYXIgKiogaGVhZCwgICAvLyBPOiBQb2ludGVyIHRvIGhlYWQgKG1heSBiZSBOVUxMKS4KKyAgICBjaGFyICoqIHRhaWwgICAgLy8gTzogUG9pbnRlciB0byB0YWlsIChtYXkgYmUgTlVMTCkuCispIHsKKyAgICBjaGFyICogaCA9IHN0cjsKKyAgICBjaGFyICogdCA9IE5VTEw7CisgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHB0ciA9IHN0cmNociggc3RyLCBkZWxpbSApOworICAgICAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBwdHIgID0gMDsKKyAgICAgICAgICAgIHQgPSBwdHIgKyAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBoZWFkICE9IE5VTEwgKSB7CisgICAgICAgICogaGVhZCA9IGg7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgKiB0YWlsID0gdDsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfc3BsaXQKKworLyoKKyAgICBzdHJ0b2tfcigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIFRoaXMgZnVuY3Rpb24gcmVpbXBsZW1lbnRzIHN0cnRva19yKCkuCisqLworY2hhciAqCitfX2ttcF9zdHJfdG9rZW4oCisgICAgY2hhciAqICAgICAgIHN0ciwgICAvLyBTdHJpbmcgdG8gc3BsaXQgaW50byB0b2tlbnMuIE5vdGU6IFN0cmluZyAqaXMqIG1vZGlmaWVkIQorICAgIGNoYXIgY29uc3QgKiBkZWxpbSwgLy8gRGVsaW1pdGVycy4KKyAgICBjaGFyICoqICAgICAgYnVmICAgIC8vIEludGVybmFsIGJ1ZmZlci4KKykgeworICAgIGNoYXIgKiB0b2tlbiA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vIHN0cnRva19yKCkgZnVuY3Rpb24uIExldCB1cyBpbXBsZW1lbnQgaXQuCisgICAgICAgIGlmICggc3RyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIGJ1ZiA9IHN0cjsgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNhbGwsIGluaXRpYWxpemUgYnVmLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqIGJ1ZiArPSBzdHJzcG4oICogYnVmLCBkZWxpbSApOyAgICAgICAvLyBTa2lwIGxlYWRpbmcgZGVsaW1pdGVycy4KKyAgICAgICAgaWYgKCAqKiBidWYgIT0gMCApIHsgICAgICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICB0b2tlbiA9ICogYnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBpdCBhcyByZXN1bHQuCisgICAgICAgICAgICAqIGJ1ZiArPSBzdHJjc3BuKCAqIGJ1ZiwgZGVsaW0gKTsgIC8vIFNraXAgbm9uLWRlbGltaXRlcnMuCisgICAgICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgdGhlIHN0cmluZyBpcyBub3QgeWV0IGVtcHR5LgorICAgICAgICAgICAgICAgICoqIGJ1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdG9rZW4gaGVyZS4KKyAgICAgICAgICAgICAgICAqIGJ1ZiArPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBidWYgdG8gc3RhcnQgd2l0aCB0aGUgbmV4dCB0b2tlbiBuZXh0IHRpbWUuCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHN0cnRva19yKCkgaXMgYXZhaWxhYmxlLiBMZXQgdXMgdXNlIGl0LgorICAgICAgICB0b2tlbiA9IHN0cnRva19yKCBzdHIsIGRlbGltLCBidWYgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gdG9rZW47Cit9OyAvLyBfX2ttcF9zdHJfdG9rZW4KKworCitpbnQKK19fa21wX3N0cl90b19pbnQoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBjaGFyICAgICAgICAgc2VudGluZWwKKykgeworICAgIGludCByZXN1bHQsIGZhY3RvcjsKKyAgICBjaGFyIGNvbnN0ICogdDsKKworICAgIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKHQgPSBzdHI7ICp0ICE9ICdcMCc7ICsrdCkgeworICAgICAgICBpZiAoKnQgPCAnMCcgfHwgKnQgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDEwKSArICgqdCAtICcwJyk7CisgICAgfQorCisgICAgc3dpdGNoICgqdCkgeworICAgIGNhc2UgJ1wwJzogICAgICAgICAgLyogdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3Igbm8gc3VmZml4IGlzIGJ5dGVzICovCisJZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6IGNhc2UgJ0InOiAvKiBieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdrJzogY2FzZSAnSyc6IC8qIGtpbG8tYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOiAvKiBtZWdhLWJ5dGVzICovCisJKyt0OworCWZhY3RvciA9ICgxMDI0ICogMTAyNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJaWYoKnQgIT0gc2VudGluZWwpCisJICAgIHJldHVybiAoLTEpOworCXQgPSAiIjsKKwlmYWN0b3IgPSAxOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPiAoSU5UX01BWCAvIGZhY3RvcikpCisJcmVzdWx0ID0gSU5UX01BWDsKKyAgICBlbHNlCisJcmVzdWx0ICo9IGZhY3RvcjsKKworICAgIHJldHVybiAoKnQgIT0gMCA/IDAgOiByZXN1bHQpOworCit9IC8vIF9fa21wX3N0cl90b19pbnQKKworCisvKgorICAgIFRoZSByb3V0aW5lIHBhcnNlcyBpbnB1dCBzdHJpbmcuIEl0IGlzIGV4cGVjdGVkIGl0IGlzIGEgdW5zaWduZWQgaW50ZWdlciB3aXRoIG9wdGlvbmFsIHVuaXQuCisgICAgVW5pdHMgYXJlOiAiYiIgZm9yIGJ5dGVzLCAia2IiIG9yIGp1c3QgImsiIGZvciBraWxvYnl0ZXMsICJtYiIgb3IgIm0iIGZvciBtZWdhYnl0ZXMsIC4uLiwgInliIgorICAgIG9yICJ5IiBmb3IgeW90dGFieXRlcy4gOi0pIFVuaXQgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLiBUaGUgcm91dGluZSByZXR1cm5zIDAgaWYgZXZlcnl0aGluZyBpcworICAgIG9rLCBvciBlcnJvciBjb2RlOiAtMSBpbiBjYXNlIG9mIG92ZXJmbG93LCAtMiBpbiBjYXNlIG9mIHVua25vd24gdW5pdC4gKnNpemUgaXMgc2V0IHRvIHBhcnNlZAorICAgIHZhbHVlLiBJbiBjYXNlIG9mIG92ZXJmbG93ICpzaXplIGlzIHNldCB0byBLTVBfU0laRV9UX01BWCwgaW4gY2FzZSBvZiB1bmtub3duIHVuaXQgKnNpemUgaXMgc2V0CisgICAgdG8gemVyby4KKyovCit2b2lkCitfX2ttcF9zdHJfdG9fc2l6ZSggICAgICAgICAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKiAgIHN0ciwgICAgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlciBhbmQgdW5pdCAoImIiLCAia2IiLCBldGMpLgorICAgIHNpemVfdCAqICAgICAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBzaXplX3QgICAgICAgICBkZmFjdG9yLCAvLyBJOiBUaGUgZmFjdG9yIGlmIG5vbmUgb2YgdGhlIGxldHRlcnMgc3BlY2lmaWVkLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBzaXplX3QgZmFjdG9yICAgPSAwOworICAgIGludCAgICBvdmVyZmxvdyA9IDA7CisgICAgaW50ICAgIGJhZF91bml0ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcpIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgdW5pdC4KKyAgICAjZGVmaW5lIF9jYXNlKCBjaCwgZXhwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgY2ggLSAoICdhJyAtICdBJyApIDogeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBzaGlmdCA9IChleHApICogMTA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHNoaWZ0IDwgc2l6ZW9mKCBzaXplX3QgKSAqIDggKSB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSAoc2l6ZV90KSggMSApIDw8IHNoaWZ0OyAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGJyZWFrOworICAgIHN3aXRjaCAoIHN0clsgaSBdICkgeworICAgICAgICBfY2FzZSggJ2snLCAxICk7IC8vIEtpbG8KKyAgICAgICAgX2Nhc2UoICdtJywgMiApOyAvLyBNZWdhCisgICAgICAgIF9jYXNlKCAnZycsIDMgKTsgLy8gR2lnYQorICAgICAgICBfY2FzZSggJ3QnLCA0ICk7IC8vIFRlcmEKKyAgICAgICAgX2Nhc2UoICdwJywgNSApOyAvLyBQZXRhCisgICAgICAgIF9jYXNlKCAnZScsIDYgKTsgLy8gRXhhCisgICAgICAgIF9jYXNlKCAneicsIDcgKTsgLy8gWmV0dGEKKyAgICAgICAgX2Nhc2UoICd5JywgOCApOyAvLyBZb3R0YQorICAgICAgICAvLyBPb3BzLiBObyBtb3JlIHVuaXRzLi4uCisgICAgfTsgLy8gc3dpdGNoCisgICAgI3VuZGVmIF9jYXNlCisgICAgaWYgKCBzdHJbIGkgXSA9PSAnYicgfHwgc3RyWyBpIF0gPT0gJ0InICkgeyAgICAvLyBTa2lwIG9wdGlvbmFsICJiIi4KKwlpZiAoIGZhY3RvciA9PSAwICkgeworCSAgICBmYWN0b3IgPSAxOworCX0KKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggISAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnIHx8IHN0clsgaSBdID09IDAgKSApIHsgLy8gQmFkIHVuaXQKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggQmFkVW5pdCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggZmFjdG9yID09IDAgKSB7CisJZmFjdG9yID0gZGZhY3RvcjsKKyAgICB9CisKKyAgICAvLyBBcHBseSBmYWN0b3IuCisgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAvIGZhY3RvciApICk7CisgICAgdmFsdWUgKj0gZmFjdG9yOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSBLTVBfU0laRV9UX01BWDsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAqIGVycm9yID0gTlVMTDsKKyAgICAqIG91dCA9IHZhbHVlOworCit9IC8vIF9fa21wX3N0cl90b19zaXplCisKKwordm9pZAorX19rbXBfc3RyX3RvX3VpbnQoICAgICAgICAgLy8gUjogRXJyb3IgY29kZS4KKyAgICBjaGFyIGNvbnN0ICogICBzdHIsICAgIC8vIEk6IFN0cmluZyBvZiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBudW1iZXIuCisgICAga21wX3VpbnQ2NCAqICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBpbnQgICAgb3ZlcmZsb3cgPSAwOworICAgIGludCAgICBpICAgICAgICA9IDA7CisgICAgaW50ICAgIGRpZ2l0OworCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSAoa21wX3VpbnQ2NCkgLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fdW5pdAorCisKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfc3RyLmggYi9yYzEvcnVudGltZS9zcmMva21wX3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGQxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3N0ci5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICoga21wX3N0ci5oIC0tIFN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQyNjEzICQKKyAqICREYXRlOiAyMDEzLTA4LTIzIDEzOjI5OjUwIC0wNTAwIChGcmksIDIzIEF1ZyAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUUl9ICisjZGVmaW5lIEtNUF9TVFJfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2RlZmluZSBzdHJkdXAgICAgX3N0cmR1cAorICAgICNkZWZpbmUgc25wcmludGYgIF9zbnByaW50ZgorICAgICNkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyNlbmRpZgorCisvKiAgc29tZSBtYWNyb3MgdG8gcmVwbGFjZSBjdHlwZS5oIGZ1bmN0aW9ucyAgKi8KKyNkZWZpbmUgVE9MT1dFUihjKQkoKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykpID8gKChjKSArICdhJyAtICdBJykgOiAoYykpCisKK3N0cnVjdCBrbXBfc3RyX2J1ZiB7CisgICAgY2hhciAgICAgICAqIHN0cjsgICAgICAgICAvLyBQb2ludGVyIHRvIGJ1ZmZlciBjb250ZW50LCByZWFkIG9ubHkuCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgZmllbGQhCisgICAgaW50ICAgICAgICAgIHVzZWQ7ICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkIHRvIGJ1ZmZlciwgcmVhZCBvbmx5LgorICAgIGNoYXIgICAgICAgICBidWxrWyA1MTIgXTsgLy8gRG8gbm90IHVzZSB0aGlzIGZpZWxkIQorfTsgLy8gc3RydWN0IGttcF9zdHJfYnVmCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2J1ZiAga21wX3N0cl9idWZfdDsKKworI2RlZmluZSBfX2ttcF9zdHJfYnVmX2luaXQoIGIgKSAgIHsgKGIpLT5zdHIgPSAoYiktPmJ1bGs7IChiKS0+c2l6ZSA9IHNpemVvZiggKGIpLT5idWxrICk7IChiKS0+dXNlZCA9IDA7IChiKS0+YnVsa1sgMCBdID0gMDsgfQorCit2b2lkICAgX19rbXBfc3RyX2J1Zl9jbGVhcigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgaW50IHNpemUgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2RldGFjaCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZnJlZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfY2F0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogc3RyLCBpbnQgbGVuICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXJncyApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgc2l6ZV90IHNpemUgKTsKKworLyoKKyAgICBGaWxlIG5hbWUgcGFyc2VyLiBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWUgPSBfX2ttcF9zdHJfZm5hbWVfaW5pdCggcGF0aCApOworICAgICAgICAvLyBVc2UgZm5hbWUucGF0aCAoY29weSBvZiBvcmlnaW5hbCBwYXRoICksIGZuYW1lLmRpciwgZm5hbWUuYmFzZS4KKyAgICAgICAgLy8gTm90ZSBmbmFtZS5kaXIgY29uY2F0ZW5hdGVkIHdpdGggZm5hbWUuYmFzZSBnaXZlcyBleGFjdCBjb3B5IG9mIHBhdGguCisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGZuYW1lICk7CisKKyovCitzdHJ1Y3Qga21wX3N0cl9mbmFtZSB7CisgICAgY2hhciAqIHBhdGg7CisgICAgY2hhciAqIGRpcjsKKyAgICBjaGFyICogYmFzZTsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2ZuYW1lCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2ZuYW1lIGttcF9zdHJfZm5hbWVfdDsKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2luaXQoIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0aCApOwordm9pZCBfX2ttcF9zdHJfZm5hbWVfZnJlZSgga21wX3N0cl9mbmFtZV90ICogZm5hbWUgKTsKKy8vIENvbXBhcmVzIGZpbGUgbmFtZSB3aXRoIHNwZWNpZmllZCBwYXRlcm4uIElmIHBhdHRlcm4gaXMgTlVMTCwgYW55IGZuYW1lIG1hdGNoZWQuCitpbnQgX19rbXBfc3RyX2ZuYW1lX21hdGNoKCBrbXBfc3RyX2ZuYW1lX3QgY29uc3QgKiBmbmFtZSwgY2hhciBjb25zdCAqIHBhdHRlcm4gKTsKKworLyoKKyAgICBUaGUgY29tcGlsZXIgcHJvdmlkZXMgc291cmNlIGxvY2F0aW9ucyBpbiBzdHJpbmcgZm9ybSAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7Ii4gSXQgbm90IG5vdAorICAgIGNvbnZlbmllbnQgZm9yIG1hbnVwdWxhdGlvbi4gVGhlc2Ugc3RydWN0dXJlIGtlZXBzIHNvdXJjZSBsb2NhdGlvbiBpbiBtb3JlIGNvbnZlbmllbnQgZm9ybS4KKyAgICBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2xvY190IGxvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggaWRlbnQtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgLy8gdXNlIGxvYy5maWxlLCBsb2MuZnVuYywgbG9jLmxpbmUsIGxvYy5jb2wuCisgICAgICAgIC8vIGxvYy5mbmFtZSBpcyBhdmFpbGFibGUgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBfX2ttcF9zdHJfbG9jX2luaXQgaXMgdHJ1ZS4KKyAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmIGxvYyApOworCisgICAgSWYgcHNvdXJjZSBpcyBOVUxMIG9yIGRvZXMgbm90IGZvbGxvdyBmb3JtYXQgYWJvdmUsIGZpbGUgYW5kL29yIGZ1bmMgbWF5IGJlIE5VTEwgcG9pbnRlcnMuCisqLworc3RydWN0IGttcF9zdHJfbG9jIHsKKyAgICBjaGFyICogICAgICAgICAgX2J1bGs7ICAvLyBEbyBub3QgdXNlIHRoaWQgZmllbGQuCisgICAga21wX3N0cl9mbmFtZV90IGZuYW1lOyAgLy8gV2lsbCBiZSBpbml0aWFsaXplZCBpZiBpbml0X2ZuYW1lIGlzIHRydWUuCisgICAgY2hhciAqICAgICAgICAgIGZpbGU7CisgICAgY2hhciAqICAgICAgICAgIGZ1bmM7CisgICAgaW50ICAgICAgICAgICAgIGxpbmU7CisgICAgaW50ICAgICAgICAgICAgIGNvbDsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2xvYwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9sb2Mga21wX3N0cl9sb2NfdDsKK2ttcF9zdHJfbG9jX3QgX19rbXBfc3RyX2xvY19pbml0KCBjaGFyIGNvbnN0ICogcHNvdXJjZSwgaW50IGluaXRfZm5hbWUgKTsKK3ZvaWQgX19rbXBfc3RyX2xvY19mcmVlKCBrbXBfc3RyX2xvY190ICogbG9jICk7CisKK2ludCAgICBfX2ttcF9zdHJfZXFmKCBjaGFyIGNvbnN0ICogbGhzLCBjaGFyIGNvbnN0ICogcmhzICk7CitjaGFyICogX19rbXBfc3RyX2Zvcm1hdCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2ZyZWUoIGNoYXIgY29uc3QgKiAqIHN0ciApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaCggY2hhciBjb25zdCAqIHRhcmdldCwgaW50IGxlbiwgY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICk7Cit2b2lkICAgX19rbXBfc3RyX3JlcGxhY2UoIGNoYXIgKiBzdHIsIGNoYXIgc2VhcmNoX2ZvciwgY2hhciByZXBsYWNlX3dpdGggKTsKK3ZvaWQgICBfX2ttcF9zdHJfc3BsaXQoIGNoYXIgKiBzdHIsIGNoYXIgZGVsaW0sIGNoYXIgKiogaGVhZCwgY2hhciAqKiB0YWlsICk7CitjaGFyICogX19rbXBfc3RyX3Rva2VuKCBjaGFyICogc3RyLCBjaGFyIGNvbnN0ICogZGVsaW0sIGNoYXIgKiogYnVmICk7CitpbnQgICAgX19rbXBfc3RyX3RvX2ludCggY2hhciBjb25zdCAqIHN0ciwgY2hhciBzZW50aW5lbCApOworCit2b2lkIF9fa21wX3N0cl90b19zaXplKCBjaGFyIGNvbnN0ICogc3RyLCBzaXplX3QgKiBvdXQsIHNpemVfdCBkZmFjdG9yLCBjaGFyIGNvbnN0ICogKiBlcnJvciApOwordm9pZCBfX2ttcF9zdHJfdG9fdWludCggY2hhciBjb25zdCAqIHN0ciwga21wX3VpbnQ2NCAqIG91dCwgY2hhciBjb25zdCAqICogZXJyb3IgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFJfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3N0dWIuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTE0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3N0dWIuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIGttcF9zdHViLmMgLS0gc3R1YiB2ZXJzaW9ucyBvZiB1c2VyLWNhbGxhYmxlIE9wZW5NUCBSVCBmdW5jdGlvbnMuCisgKiAkUmV2aXNpb246IDQyODI2ICQKKyAqICREYXRlOiAyMDEzLTExLTIwIDAzOjM5OjQ1IC0wNjAwIChXZWQsIDIwIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfc3R1Yi5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAgICAgICAgICAvLyBLTVBfT1NfKgorCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib21wLmgiICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHJlbmFtaW5ncy4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgICAgICAgICAgLy8gS01QX0RFRkFVTFRfU1RLU0laRQorI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisKKy8vIE1vdmVkIGZyb20gb21wLmgKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisjZGVmaW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyNkZWZpbmUgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAgICBvbXBjX3NldF9zY2hlZHVsZQorI2RlZmluZSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyNkZWZpbmUgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICBvbXBjX2dldF90ZWFtX3NpemUKKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyNkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworI2RlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworI2RlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyNkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworI2RlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyNkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyNkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworc3RhdGljIGRvdWJsZSBmcmVxdWVuY3kgPSAwLjA7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMuCitzdGF0aWMgc2l6ZV90IF9fa21wc19pbml0KCkgeworICAgIHN0YXRpYyBpbnQgICAgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBzaXplX3QgZHVtbXkgPSAwOworICAgIGlmICggISBpbml0aWFsaXplZCApIHsKKworICAgICAgICAvLyBUT0RPOiBBbmFseXplIEtNUF9WRVJTSU9OIGVudmlyb25tZW50IHZhcmlhYmxlLCBwcmludCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lLgorICAgICAgICAvLyBXQVJOSU5HOiBEbyBub3QgdXNlICJmcHJpbnRmKCBzdGRlcnIsIC4uLiApIiBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdW5yZXNvbHZlZCAiX19pb2IiCisgICAgICAgIC8vIHN5bWJvbCAoc2VlIEM3MDA4MCkuIFdlIG5lZWQgdG8gZXh0cmFjdCBfX2ttcF9wcmludGYoKSBzdHVmZiBmcm9tIGttcF9ydW50aW1lLmMgYW5kIHVzZQorICAgICAgICAvLyBpdC4KKworICAgICAgICAvLyBUcmljayB3aXRoIGR1bW15IHZhcmlhYmxlIGZvcmNlcyBsaW5rZXIgdG8ga2VlcCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lIHN0cmluZ3MgaW4gZXhlY3V0YWJsZSBmaWxlIChpbiBjYXNlIG9mIHN0YXRpYyBsaW5rYWdlKS4KKyAgICAgICAgLy8gV2hlbiBLTVBfVkVSU0lPTiBhbmFseXplIGlzIGltcGxlbWVudGVkLCBkdW1teSB2YXJpYWJsZSBzaG91bGQgYmUgZGVsZXRlZCwgZnVuY3Rpb24KKyAgICAgICAgLy8gc2hvdWxkIHJldHVybiB2b2lkLgorICAgICAgICBkdW1teSA9IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IC0gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lOworCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBmcmVxOworICAgICAgICAgICAgQk9PTCBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICkgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IGRvdWJsZSggZnJlcS5RdWFkUGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIGR1bW15OworfTsgLy8gX19rbXBzX2luaXQKKworI2RlZmluZSBpIF9fa21wc19pbml0KCk7CisKKy8qIHNldCBBUEkgZnVuY3Rpb25zICovCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHMoIG9tcF9pbnRfdCBudW1fdGhyZWFkcyApIHsgaTsgfQordm9pZCBvbXBfc2V0X2R5bmFtaWMoIG9tcF9pbnRfdCBkeW5hbWljICkgICAgICAgICB7IGk7IF9fa21wc19zZXRfZHluYW1pYyggZHluYW1pYyApOyB9Cit2b2lkIG9tcF9zZXRfbmVzdGVkKCBvbXBfaW50X3QgbmVzdGVkICkgICAgICAgICAgIHsgaTsgX19rbXBzX3NldF9uZXN0ZWQoIG5lc3RlZCApOyAgIH0KKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIHZvaWQgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggb21wX2ludF90IG1heF9hY3RpdmVfbGV2ZWxzICkgeyBpOyB9CisgICAgdm9pZCBvbXBfc2V0X3NjaGVkdWxlKCBvbXBfc2NoZWRfdCBraW5kLCBvbXBfaW50X3QgbW9kaWZpZXIgKSB7IGk7IF9fa21wc19zZXRfc2NoZWR1bGUoIChrbXBfc2NoZWRfdClraW5kLCBtb2RpZmllciApOyB9CisgICAgaW50IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggb21wX2ludF90IGxldmVsICkgeyBpOyByZXR1cm4gKCBsZXZlbCApID8gKCAtMSApIDogKCAwICk7IH0KKyAgICBpbnQgb21wX2dldF90ZWFtX3NpemUoIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMSApOyB9CisgICAgaW50IGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KKyAgICBpbnQga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CisgICAgaW50IGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApICAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfYmxvY2t0aW1lKCBvbXBfaW50X3QgYXJnICkgICB7IGk7IF9fa21wc19zZXRfYmxvY2t0aW1lKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2xpYnJhcnkoIG9tcF9pbnRfdCBhcmcgKSAgICAgeyBpOyBfX2ttcHNfc2V0X2xpYnJhcnkoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKSB7IGk7IH0KKworLyogS01QIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gKi8KK3ZvaWQgKiBrbXBfbWFsbG9jKCBzaXplX3Qgc2l6ZSApICAgICAgICAgICAgICAgICB7IGk7IHJldHVybiBtYWxsb2MoIHNpemUgKTsgfQordm9pZCAqIGttcF9jYWxsb2MoIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSApIHsgaTsgcmV0dXJuIGNhbGxvYyggbmVsZW0sIGVsc2l6ZSApOyB9Cit2b2lkICoga21wX3JlYWxsb2MoIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgKSAgICAgeyBpOyByZXR1cm4gcmVhbGxvYyggcHRyLCBzaXplICk7IH0KK3ZvaWQgICBrbXBfZnJlZSggdm9pZCAqIHB0ciApICAgICAgICAgICAgICAgICAgICB7IGk7IGZyZWUoIHB0ciApOyB9CisKK3N0YXRpYyBpbnQgX19rbXBzX2Jsb2NrdGltZSA9IElOVF9NQVg7CisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfYmxvY2t0aW1lID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2Jsb2NrdGltZQorCitpbnQgX19rbXBzX2dldF9ibG9ja3RpbWUoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX2Jsb2NrdGltZTsKK30gLy8gX19rbXBzX2dldF9ibG9ja3RpbWUKKworc3RhdGljIGludCBfX2ttcHNfZHluYW1pYyA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2R5bmFtaWMgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfZHluYW1pYworCitpbnQgX19rbXBzX2dldF9keW5hbWljKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19keW5hbWljOworfSAvLyBfX2ttcHNfZ2V0X2R5bmFtaWMKKworc3RhdGljIGludCBfX2ttcHNfbGlicmFyeSA9IDEwMDA7CisKK3ZvaWQgX19rbXBzX3NldF9saWJyYXJ5KCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2xpYnJhcnkgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfbGlicmFyeQorCitpbnQgX19rbXBzX2dldF9saWJyYXJ5KCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19saWJyYXJ5OworfSAvLyBfX2ttcHNfZ2V0X2xpYnJhcnkKKworc3RhdGljIGludCBfX2ttcHNfbmVzdGVkID0gMDsKKwordm9pZCBfX2ttcHNfc2V0X25lc3RlZCggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19uZXN0ZWQgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfbmVzdGVkCisKK2ludCBfX2ttcHNfZ2V0X25lc3RlZCggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbmVzdGVkOworfSAvLyBfX2ttcHNfZ2V0X25lc3RlZAorCitzdGF0aWMgc2l6ZV90IF9fa21wc19zdGFja3NpemUgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworCit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX3N0YWNrc2l6ZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9zdGFja3NpemUKKworaW50IF9fa21wc19nZXRfc3RhY2tzaXplKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19zdGFja3NpemU7Cit9IC8vIF9fa21wc19nZXRfc3RhY2tzaXplCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCitzdGF0aWMga21wX3NjaGVkX3QgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga21wX3NjaGVkX2RlZmF1bHQ7CitzdGF0aWMgaW50ICAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gMDsKKworICAgIHZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICBfX2ttcHNfc2NoZWRfa2luZCAgICAgPSBraW5kOworICAgICAgICBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSBtb2RpZmllcjsKKyAgICB9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKworICAgIHZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKSB7CisgICAgICAgIGk7CisgICAgICAgICpraW5kICAgICA9IF9fa21wc19zY2hlZF9raW5kOworICAgICAgICAqbW9kaWZpZXIgPSBfX2ttcHNfc2NoZWRfbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfZ2V0X3NjaGVkdWxlCisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgT01QXzQwX0VOQUJMRUQKKworc3RhdGljIGttcF9wcm9jX2JpbmRfdCBfX2ttcHNfcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworCit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX3Byb2NfYmluZCA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9wcm9jX2JpbmQKKwora21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19wcm9jX2JpbmQ7Cit9IC8vIF9fa21wc19nZXRfcHJvY19iaW5kCisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSggdm9pZCApIHsKKyAgICAvLyBFbGFwc2VkIHdhbGwgY2xvY2sgdGltZSAoaW4gc2Vjb25kKSBmcm9tICJzb21ldGltZSBpbiB0aGUgcGFzdCIuCisgICAgZG91YmxlIHd0aW1lID0gMC4wOworICAgIGk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmICggZnJlcXVlbmN5ID4gMC4wICkgeworICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBub3c7CisgICAgICAgICAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgd3RpbWUgPSBkb3VibGUoIG5vdy5RdWFkUGFydCApIC8gZnJlcXVlbmN5OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAvLyBnZXR0aW1lb2ZkYXkoKSByZXR1cm5zIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcyBzaW5zZSB0aGUgRXBvY2guCisgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0dmFsOworICAgICAgICBpbnQgICAgICAgICAgICAgcmM7CisgICAgICAgIHJjID0gZ2V0dGltZW9mZGF5KCAmIHR2YWwsIE5VTEwgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgd3RpbWUgPSAoZG91YmxlKSggdHZhbC50dl9zZWMgKSArIDEuMEUtMDYgKiAoZG91YmxlKSggdHZhbC50dl91c2VjICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpbWU7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aW1lCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aWNrKCB2b2lkICkgeworICAgIC8vIE51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSBjbG9jayB0aWNrcy4KKyAgICBkb3VibGUgd3RpY2sgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgaW5jcmVtZW50OworICAgICAgICAgICAgRFdPUkQgYWRqdXN0bWVudDsKKyAgICAgICAgICAgIEJPT0wgIGRpc2FibGVkOworICAgICAgICAgICAgQk9PTCAgcmM7CisgICAgICAgICAgICByYyA9IEdldFN5c3RlbVRpbWVBZGp1c3RtZW50KCAmIGFkanVzdG1lbnQsICYgaW5jcmVtZW50LCAmIGRpc2FibGVkICk7CisgICAgICAgICAgICBpZiAoIHJjICkgeworICAgICAgICAgICAgICAgIHd0aWNrID0gMS4wRS0wNyAqIChkb3VibGUpKCBkaXNhYmxlZCA/IGluY3JlbWVudCA6IGFkanVzdG1lbnQgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogQXNzZXJ0IG9yIGFib3J0IGhlcmUuCisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTAzOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorICAgICNlbHNlCisgICAgICAgIC8vIFRPRE86IGdldHRpbWVvZmRheSgpIHJldHVybnMgaW4gbWljcm9zZWNvbmRzLCBidXQgd2hhdCB0aGUgcHJlY2lzaW9uPworICAgICAgICB3dGljayA9IDEuMEUtMDY7CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHd0aWNrOworfTsgLy8gX19rbXBzX2dldF93dGljaworCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3N0dWIuaCBiL3JjMS9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiM2UzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3N0dWIuaApAQCAtMCwwICsxLDY1IEBACisvKgorICoga21wX3N0dWIuaAorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TVFVCX0gKKyNkZWZpbmUgS01QX1NUVUJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X2R5bmFtaWMoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9saWJyYXJ5KCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X25lc3RlZCggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X25lc3RlZCggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAgIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgordm9pZCBfX2ttcHNfc2V0X3NjaGVkdWxlKCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIgKTsKK3ZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQgX19rbXBzX3NldF9wcm9jX2JpbmQoIGVudW0ga21wX3Byb2NfYmluZF90IGFyZyApOworZW51bSBrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSgpOworZG91YmxlIF9fa21wc19nZXRfd3RpY2soKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFVCX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF90YXNrZGVwcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MWRlMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICoga21wX3Rhc2tkZXBzLmNwcAorICogJFJldmlzaW9uOiA0MjUzOSAkCisgKiAkRGF0ZTogMjAxMy0wNy0xNyAxMToyMDowMSAtMDUwMCAoV2VkLCAxNyBKdWwgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyNkZWZpbmUgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUIDEKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy9UT0RPOiBJbXByb3ZlIG1lbW9yeSBhbGxvY2F0aW9uPyBrZWVwIGEgbGlzdCBvZiBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZXM/IGFsbG9jYXRlIGluIGJsb2Nrcz8gcmUtdXNlIGxpc3QgZmluaXNoZWQgbGlzdCBlbnRyaWVzPworLy9UT0RPOiBkb24ndCB1c2UgYXRvbWljIHJlZiBjb3VudGVycyBmb3Igc3RhY2stYWxsb2NhdGVkIG5vZGVzLgorLy9UT0RPOiBmaW5kIGFuIGFsdGVybmF0ZSB0byBhdG9taWMgcmVmcyBmb3IgaGVhcC1hbGxvY2F0ZWQgbm9kZXM/CisvL1RPRE86IEZpbmlzaCBncmFwaCBvdXRwdXQgc3VwcG9ydAorLy9UT0RPOiBrbXBfbG9ja190IHNlZW1zIGEgdGFkIHRvIGJpZyAoYW5kIGhlYXZ5IHdlaWdodCkgZm9yIHRoaXMuIENoZWNrIG90aGVyIHJ1bnRpbWUgbG9ja3MKKy8vVE9ETzogQW55IElUVCBzdXBwb3J0IG5lZWRlZD8KKworI2lmZGVmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorc3RhdGljIGttcF9pbnQzMiBrbXBfbm9kZV9pZF9zZWVkID0gMDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9ub2RlICgga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIHNldCB0byBudWxsIGluaXRpYWxseSwgaXQgd2lsbCBwb2ludCB0byB0aGUgcmlnaHQgdGFzayBvbmNlIGRlcGVuZGVuY2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQKKyAgICBub2RlLT5kbi5zdWNjZXNzb3JzID0gTlVMTDsKKyAgICBfX2ttcF9pbml0X2xvY2soJm5vZGUtPmRuLmxvY2spOworICAgIG5vZGUtPmRuLm5yZWZzID0gMTsgLy8gaW5pdCBjcmVhdGVzIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gdGhlIG5vZGUKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAgICBub2RlLT5kbi5pZCA9IEtNUF9URVNUX1RIRU5fSU5DMzIoJmttcF9ub2RlX2lkX3NlZWQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUga21wX2RlcG5vZGVfdCAqCitfX2ttcF9ub2RlX3JlZiAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoJm5vZGUtPmRuLm5yZWZzKTsKKyAgICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9ub2RlX2RlcmVmICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBpZiAoIW5vZGUpIHJldHVybjsKKworICAgIGttcF9pbnQzMiBuID0gS01QX1RFU1RfVEhFTl9ERUMzMigmbm9kZS0+ZG4ubnJlZnMpIC0gMTsKKyAgICBpZiAoIG4gPT0gMCApIHsKKyAgICAgICAgS01QX0FTU0VSVChub2RlLT5kbi5ucmVmcyA9PSAwKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxub2RlKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxub2RlKTsKKyNlbmRpZgorICAgIH0KK30KKworI2RlZmluZSBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbikgX19rbXBfYWNxdWlyZV9sb2NrKCYobiktPmRuLmxvY2ssKGd0aWQpKQorI2RlZmluZSBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbikgX19rbXBfcmVsZWFzZV9sb2NrKCYobiktPmRuLmxvY2ssKGd0aWQpKQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3QgKmxpc3QgKTsKKworc3RhdGljIGNvbnN0IGttcF9pbnQzMiBrbXBfZGVwaGFzaF9sb2cyID0gNjsKK3N0YXRpYyBjb25zdCBrbXBfaW50MzIga21wX2RlcGhhc2hfc2l6ZSA9ICgxIDw8IGttcF9kZXBoYXNoX2xvZzIpOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZGVwaGFzaF9oYXNoICgga21wX2ludHB0cl90IGFkZHIgKQoreworICAgIC8vVE9ETyBhbHRlcm5hdGUgdG8gdHJ5OiBzZXQgPSAoKChBZGRyNjQpKGFkZHJVc2VmdWxCaXRzICogOS42MTgpKSAlIG1fbnVtX3NldHMgKTsKKyAgICByZXR1cm4gKChhZGRyID4+IGttcF9kZXBoYXNoX2xvZzIpIF4gYWRkcikgJSBrbXBfZGVwaGFzaF9zaXplOworfQorCitzdGF0aWMga21wX2RlcGhhc2hfdCAqCitfX2ttcF9kZXBoYXNoX2NyZWF0ZSAoIGttcF9pbmZvX3QgKnRocmVhZCApCit7CisgICAga21wX2RlcGhhc2hfdCAqaDsKKwkKKyAgICBrbXBfaW50MzIgc2l6ZSA9IGttcF9kZXBoYXNoX3NpemUgKiBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKyBzaXplb2Yoa21wX2RlcGhhc2hfdCk7CisJIAkKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplICk7CisjZWxzZQorICAgIGggPSAoa21wX2RlcGhhc2hfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemUgKTsKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCQorICAgIGgtPm5lbGVtZW50cyA9IDA7CisjZW5kaWYKKyAgICBoLT5idWNrZXRzID0gKGttcF9kZXBoYXNoX2VudHJ5ICoqKShoKzEpOworCQorICAgIGZvciAoIGttcF9pbnQzMiBpID0gMDsgaSA8IGttcF9kZXBoYXNoX3NpemU7IGkrKyApCisgICAgICAgIGgtPmJ1Y2tldHNbaV0gPSAwOworCisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBoYXNoX2ZyZWUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmggKQoreworICAgIGZvciAoIGttcF9pbnQzMiBpPTA7IGkgPCBrbXBfZGVwaGFzaF9zaXplOyBpKysgKSB7CisgICAgICAgIGlmICggaC0+YnVja2V0c1tpXSApIHsKKyAgICAgICAgICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKm5leHQ7CisgICAgICAgICAgICBmb3IgKCBrbXBfZGVwaGFzaF9lbnRyeV90ICplbnRyeSA9IGgtPmJ1Y2tldHNbaV07IGVudHJ5OyBlbnRyeSA9IG5leHQgKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0X2luX2J1Y2tldDsKKyAgICAgICAgICAgICAgICBfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSh0aHJlYWQsZW50cnktPmxhc3RfaW5zKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxlbnRyeS0+bGFzdF9vdXQpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICAgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsZW50cnkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsZW50cnkpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxoKTsKKyNlbHNlCisgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGgpOworI2VuZGlmCit9CisKK3N0YXRpYyBrbXBfZGVwaGFzaF9lbnRyeSAqCitfX2ttcF9kZXBoYXNoX2ZpbmQgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmgsIGttcF9pbnRwdHJfdCBhZGRyICkKK3sKKyAgICBrbXBfaW50MzIgYnVja2V0ID0gX19rbXBfZGVwaGFzaF9oYXNoKGFkZHIpOworCQorICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5OworICAgIGZvciAoIGVudHJ5ID0gaC0+YnVja2V0c1tidWNrZXRdOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKQorICAgICAgICBpZiAoIGVudHJ5LT5hZGRyID09IGFkZHIgKSBicmVhazsKKwkKKyAgICBpZiAoIGVudHJ5ID09IE5VTEwgKSB7CisgICAgICAgIC8vIGNyZWF0ZSBlbnRyeS4gVGhpcyBpcyBvbmx5IGRvbmUgYnkgb25lIHRocmVhZCBzbyBubyBsb2NraW5nIHJlcXVpcmVkCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKTsKKyNlbHNlCisgICAgICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKTsKKyNlbmRpZgorICAgICAgICBlbnRyeS0+YWRkciA9IGFkZHI7CisgICAgICAgIGVudHJ5LT5sYXN0X291dCA9IE5VTEw7CisgICAgICAgIGVudHJ5LT5sYXN0X2lucyA9IE5VTEw7CisgICAgICAgIGVudHJ5LT5uZXh0X2luX2J1Y2tldCA9IGgtPmJ1Y2tldHNbYnVja2V0XTsKKyAgICAgICAgaC0+YnVja2V0c1tidWNrZXRdID0gZW50cnk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGgtPm5lbGVtZW50cysrOworICAgICAgICBpZiAoIGVudHJ5LT5uZXh0X2luX2J1Y2tldCApIGgtPm5jb25mbGljdHMrKzsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBrbXBfZGVwbm9kZV9saXN0X3QgKgorX19rbXBfYWRkX25vZGUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3RfdCAqbGlzdCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICpuZXdfaGVhZDsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIG5ld19oZWFkID0gKGttcF9kZXBub2RlX2xpc3RfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfbGlzdF90KSk7CisjZWxzZQorICAgIG5ld19oZWFkID0gKGttcF9kZXBub2RlX2xpc3RfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfbGlzdF90KSk7CisjZW5kaWYKKworICAgIG5ld19oZWFkLT5ub2RlID0gX19rbXBfbm9kZV9yZWYobm9kZSk7CisgICAgbmV3X2hlYWQtPm5leHQgPSBsaXN0OworCisgICAgcmV0dXJuIG5ld19oZWFkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3QgKmxpc3QgKQoreworICAgIGttcF9kZXBub2RlX2xpc3QgKm5leHQ7CisKKyAgICBmb3IgKCA7IGxpc3QgOyBsaXN0ID0gbmV4dCApIHsKKyAgICAgICAgbmV4dCA9IGxpc3QtPm5leHQ7CisKKyAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGlzdC0+bm9kZSk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbGlzdCk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbGlzdCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfdHJhY2tfZGVwZW5kZW5jZSAoIGttcF9kZXBub2RlX3QgKnNvdXJjZSwga21wX2RlcG5vZGVfdCAqc2luayApCit7CisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NvdXJjZSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNvdXJjZS0+ZG4udGFzayk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NpbmsgPSBLTVBfVEFTS19UT19UQVNLREFUQShzaW5rLT5kbi50YXNrKTsgICAgLy8gdGhpcyBjYW4gYmUgTlVMTCB3aGVuIGlmKDApIC4uLgorCisgICAgX19rbXBfcHJpbnRmKCIlZCglcykgLT4gJWQoJXMpXG4iLCBzb3VyY2UtPmRuLmlkLCB0YXNrX3NvdXJjZS0+dGRfaWRlbnQtPnBzb3VyY2UsIHNpbmstPmRuLmlkLCB0YXNrX3NpbmstPnRkX2lkZW50LT5wc291cmNlKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTwgYm9vbCBmaWx0ZXIgPgorc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX3Byb2Nlc3NfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfZGVwaGFzaF90ICpoYXNoLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXBfYmFycmllcixrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2ludDMyIG5wcmVkZWNlc3NvcnM9MDsKKyAgICBmb3IgKCBrbXBfaW50MzIgaSA9IDA7IGkgPCBuZGVwcyA7IGkrKyApIHsKKyAgICAgICAgY29uc3Qga21wX2RlcGVuZF9pbmZvX3QgKiBkZXAgPSAmZGVwX2xpc3RbaV07CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkZXAtPmZsYWdzLmluKTsKKworICAgICAgICBpZiAoIGZpbHRlciAmJiBkZXAtPmJhc2VfYWRkciA9PSAwICkgY29udGludWU7IC8vIHNraXAgZmlsdGVyZWQgZW50cmllcworCisgICAgICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmluZm8gPSBfX2ttcF9kZXBoYXNoX2ZpbmQodGhyZWFkLGhhc2gsZGVwLT5iYXNlX2FkZHIpOworICAgICAgICBrbXBfZGVwbm9kZV90ICpsYXN0X291dCA9IGluZm8tPmxhc3Rfb3V0OworCisgICAgICAgIGlmICggZGVwLT5mbGFncy5vdXQgJiYgaW5mby0+bGFzdF9pbnMgKSB7CisgICAgICAgICAgICBmb3IgKCBrbXBfZGVwbm9kZV9saXN0X3QgKiBwID0gaW5mby0+bGFzdF9pbnM7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICAgICAgICAgIGttcF9kZXBub2RlX3QgKiBpbmRlcCA9IHAtPm5vZGU7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRlcC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLGluZGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRlcC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RyYWNrX2RlcGVuZGVuY2UoaW5kZXAsbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlcC0+ZG4uc3VjY2Vzc29ycyA9IF9fa21wX2FkZF9ub2RlKHRocmVhZCwgaW5kZXAtPmRuLnN1Y2Nlc3NvcnMsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbnByZWRlY2Vzc29ycysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSh0aHJlYWQsaW5mby0+bGFzdF9pbnMpOworICAgICAgICAgICAgaW5mby0+bGFzdF9pbnMgPSBOVUxMOworCisgICAgICAgIH0gZWxzZSBpZiAoIGxhc3Rfb3V0ICYmIGxhc3Rfb3V0LT5kbi50YXNrICkgeworICAgICAgICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgIGlmICggbGFzdF9vdXQtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdHJhY2tfZGVwZW5kZW5jZShsYXN0X291dCxub2RlKTsKKyAgICAgICAgICAgICAgICBsYXN0X291dC0+ZG4uc3VjY2Vzc29ycyA9IF9fa21wX2FkZF9ub2RlKHRocmVhZCwgbGFzdF9vdXQtPmRuLnN1Y2Nlc3NvcnMsIG5vZGUpOworICAgICAgICAgICAgICAgIG5wcmVkZWNlc3NvcnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxsYXN0X291dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlcF9iYXJyaWVyICkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHN5bmMgcG9pbnQgaW4gdGhlIHNlcmlhbCBzZXF1ZW5jZSBhbmQgcHJldmlvdXMgb3V0cHV0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoZSBleGVjdXRpb24gb2YgdGhpcyB0YXNrIHNvIHRoZSBwcmV2aW91cyBvdXRwdXQgbm9kZXMgY2FuIGJlIGNsZWFyZWQuCisgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICkgeworICAgICAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IF9fa21wX25vZGVfcmVmKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9pbnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZm8tPmxhc3RfaW5zLCBub2RlKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBucHJlZGVjZXNzb3JzOworfQorCisjZGVmaW5lIE5PX0RFUF9CQVJSSUVSIChmYWxzZSkKKyNkZWZpbmUgREVQX0JBUlJJRVIgKHRydWUpCisKKy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgYW55IG91dHN0YW5kaW5nIGRlcGVuZGVuY2UKK3N0YXRpYyBib29sCitfX2ttcF9jaGVja19kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF9kZXBub2RlX3QgKm5vZGUsIGttcF90YXNrX3QgKnRhc2ssIGttcF9kZXBoYXNoX3QgKmhhc2gsIGJvb2wgZGVwX2JhcnJpZXIsCisgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICkKK3sKKyAgICBpbnQgaTsKKyAgIAkKKyAgICAvLyBGaWx0ZXIgZGVwcyBpbiBkZXBfbGlzdAorICAgIC8vIFRPRE86IERpZmZlcmVudCBhbGdvcml0aG0gZm9yIGxhcmdlIGRlcF9saXN0ICggPiAxMCA/ICkKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5kZXBzOyBpICsrICkgeworICAgICAgICBpZiAoIGRlcF9saXN0W2ldLmJhc2VfYWRkciAhPSAwICkKKyAgICAgICAgICAgIGZvciAoIGludCBqID0gaSsxOyBqIDwgbmRlcHM7IGorKyApCisgICAgICAgICAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgPT0gZGVwX2xpc3Rbal0uYmFzZV9hZGRyICkgeworICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5pbiB8PSBkZXBfbGlzdFtqXS5mbGFncy5pbjsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3Mub3V0IHw9IGRlcF9saXN0W2pdLmZsYWdzLm91dDsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3Rbal0uYmFzZV9hZGRyID0gMDsgLy8gTWFyayBqIGVsZW1lbnQgYXMgdm9pZAorICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljIGFzIG5vIG90aGVyIHRocmVhZCBpcyBnb2luZyB0byBiZSBhY2Nlc3NpbmcgdGhpcyBub2RlIGp1c3QgeWV0CisgICAgLy8gbnByZWRlY2Vzc29ycyBpcyBzZXQgMSB0byBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSByZWxlYXNpbmcgdGFza3MgcXVldWVzIHRoaXMgdGFzayBiZWZvcmUgd2UgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIGFsbCB0aGUgZGVwZW5kZW5jaWVzCisgICAgbm9kZS0+ZG4ubnByZWRlY2Vzc29ycyA9IDE7CisKKyAgICAvLyB1c2VkIHRvIHBhY2sgYWxsIG5wcmVkZWNlc3NvcnMgYWRkaXRpb25zIGludG8gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbiBhdCB0aGUgZW5kCisgICAgaW50IG5wcmVkZWNlc3NvcnM7CisKKyAgICBucHJlZGVjZXNzb3JzID0gX19rbXBfcHJvY2Vzc19kZXBzPHRydWU+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwcywgZGVwX2xpc3QpOworICAgIG5wcmVkZWNlc3NvcnMgKz0gX19rbXBfcHJvY2Vzc19kZXBzPGZhbHNlPihndGlkLCBub2RlLCBoYXNoLCBkZXBfYmFycmllciwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCk7CisKKyAgICBLTVBfVEVTVF9USEVOX0FERDMyKCZub2RlLT5kbi5ucHJlZGVjZXNzb3JzLCBucHJlZGVjZXNzb3JzKTsKKworICAgIC8vIFJlbW92ZSB0aGUgZmFrZSBwcmVkZWNlc3NvciBhbmQgZmluZCBvdXQgaWYgdGhlcmUncyBhbnkgb3V0c3RhbmRpbmcgZGVwZW5kZW5jZSAoc29tZSB0YXNrcyBtYXkgaGF2ZSBmaW5pc2hlZCB3aGlsZSB3ZSBwcm9jZXNzZWQgdGhlIGRlcGVuZGVuY2VzKQorICAgIG5vZGUtPmRuLnRhc2sgPSB0YXNrOworICAgIEtNUF9NQigpOworICAgIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCZub2RlLT5kbi5ucHJlZGVjZXNzb3JzKSAtIDE7CisKKyAgICAvLyBiZXlvbmQgdGhpcyBwb2ludCB0aGUgdGFzayBjb3VsZCBiZSBxdWV1ZWQgKGFuZCBleGVjdXRlZCkgYnkgYSByZWxlYXNpbmcgdGFzay4uLgorICAgIHJldHVybiBucHJlZGVjZXNzb3JzID4gMCA/IHRydWUgOiBmYWxzZTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IHRhc2stPnRkX2RlcG5vZGU7CisKKyAgICBpZiAoIHRhc2stPnRkX2RlcGhhc2ggKQorICAgICAgICBfX2ttcF9kZXBoYXNoX2ZyZWUodGhyZWFkLHRhc2stPnRkX2RlcGhhc2gpOworCisgICAgaWYgKCAhbm9kZSApIHJldHVybjsKKworICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxub2RlKTsKKyAgICBub2RlLT5kbi50YXNrID0gTlVMTDsgLy8gbWFyayB0aGlzIHRhc2sgYXMgZmluaXNoZWQsIHNvIG5vIG5ldyBkZXBlbmRlbmNpZXMgYXJlIGdlbmVyYXRlZAorICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxub2RlKTsKKworICAgIGttcF9kZXBub2RlX2xpc3RfdCAqbmV4dDsKKyAgICBmb3IgKCBrbXBfZGVwbm9kZV9saXN0X3QgKnAgPSBub2RlLT5kbi5zdWNjZXNzb3JzOyBwOyBwID0gbmV4dCApIHsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqc3VjY2Vzc29yID0gcC0+bm9kZTsKKyAgICAgICAga21wX2ludDMyIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCZzdWNjZXNzb3ItPmRuLm5wcmVkZWNlc3NvcnMpIC0gMTsKKworICAgICAgICAvLyBzdWNjZXNzb3IgdGFzayBjYW4gYmUgTlVMTCBmb3Igd2FpdF9kZXBlbmRzIG9yIGJlY2F1c2UgZGVwcyBhcmUgc3RpbGwgYmVpbmcgcHJvY2Vzc2VkCisgICAgICAgIGlmICggbnByZWRlY2Vzc29ycyA9PSAwICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBpZiAoIHN1Y2Nlc3Nvci0+ZG4udGFzayApCisgICAgICAgICAgICAvLyBsb2NfcmVmIHdhcyBhbHJlYWR5IHN0b3JlZCBpbiBzdWNjZXNzb3IncyB0YXNrX2RhdGEKKyAgICAgICAgICAgICAgICBfX2ttcGNfb21wX3Rhc2soTlVMTCxndGlkLHN1Y2Nlc3Nvci0+ZG4udGFzayk7CisgICAgICAgIH0KKworICAgICAgICBuZXh0ID0gcC0+bmV4dDsKKyAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQscC0+bm9kZSk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQscCk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQscCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxub2RlKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5ld190YXNrIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQHJldHVybiBSZXR1cm5zIGVpdGhlciBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCBpZiB0aGUgY3VycmVudCB0YXNrIHdhcyBub3Qgc3VzcGVuZGVuZCBhbmQgcXVldWVkLCBvciBUQVNLX0NVUlJFTlRfUVVFVUVEIGlmIGl0IHdhcyBzdXNwZW5kZWQgYW5kIHF1ZXVlZAorCitTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHdpdGggZGVwZW5kZW5jZXMgZm9yIGV4ZWN1dGlvbgorKi8KK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorCQkJCSBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgICAgYm9vbCBzZXJpYWwgPSBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy5maW5hbDsKKworICAgIGlmICggIXNlcmlhbCAmJiAoIG5kZXBzID4gMCB8fCBuZGVwc19ub2FsaWFzID4gMCApKSB7CSAgIAkJCisgICAgICAgIC8qIGlmIG5vIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gdHJhY2tlZCB5ZXQsIGNyZWF0ZSB0aGUgZGVwZW5kZW5jZSBoYXNoICovCisgICAgICAgIGlmICggY3VycmVudF90YXNrLT50ZF9kZXBoYXNoID09IE5VTEwgKQorICAgICAgICAgICAgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoID0gX19rbXBfZGVwaGFzaF9jcmVhdGUodGhyZWFkKTsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbHNlCisgICAgICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPSAoa21wX2RlcG5vZGVfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfdCkpOworI2VuZGlmCisKKyAgICAgICAgX19rbXBfaW5pdF9ub2RlKG5vZGUpOworICAgICAgICBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayktPnRkX2RlcG5vZGUgPSBub2RlOworCisgICAgICAgIGlmICggX19rbXBfY2hlY2tfZGVwcyggZ3RpZCwgbm9kZSwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCwgTk9fREVQX0JBUlJJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLG5vYWxpYXNfZGVwX2xpc3QgKSApCisgICAgICAgICAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7CisgICAgfQorCisgICAgcmV0dXJuIF9fa21wY19vbXBfdGFzayhsb2NfcmVmLGd0aWQsbmV3X3Rhc2spOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmRlcHMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIG5kZXBzX25vYWxpYXMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCitAcGFyYW0gbm9hbGlhc19kZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCisKK0Jsb2NrcyB0aGUgY3VycmVudCB0YXNrIHVudGlsIGFsbCBzcGVjaWZpZXMgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBmdWxmaWxsZWQuCisqLwordm9pZAorX19rbXBjX29tcF93YWl0X2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisgICAgaWYgKCBuZGVwcyA9PSAwICYmIG5kZXBzX25vYWxpYXMgPT0gMCApIHJldHVybjsKKworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgICAgLy8gZGVwZW5kZW5jZXMgYXJlIG5vdCBjb21wdXRlZCBpbiBzZXJpYWwgdGVhbXMKKyAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBpZiB0aGUgZGVwaGFzaCBpcyBub3QgeWV0IGNyZWF0ZWQgaXQgbWVhbnMgd2UgaGF2ZSBub3RoaW5nIHRvIHdhaXQgZm9yCisgICAgaWYgKCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTCApIHJldHVybjsKKworICAgIGttcF9kZXBub2RlX3Qgbm9kZTsKKyAgICBfX2ttcF9pbml0X25vZGUoJm5vZGUpOworCisgICAgaWYgKCFfX2ttcF9jaGVja19kZXBzKCBndGlkLCAmbm9kZSwgTlVMTCwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLCBERVBfQkFSUklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCApKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAgd2hpbGUgKCBub2RlLmRuLm5wcmVkZWNlc3NvcnMgPiAwICkgeworICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tzKCB0aHJlYWQsIGd0aWQsICh2b2xhdGlsZSBrbXBfdWludDMyICopJihub2RlLmRuLm5wcmVkZWNlc3NvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgfQorCit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3Rhc2tpbmcuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDc1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3Rhc2tpbmcuYwpAQCAtMCwwICsxLDI0MTMgQEAKKy8qCisgKiBrbXBfdGFza2luZy5jIC0tIE9wZW5NUCAzLjAgdGFza2luZyBzdXBwb3J0LgorICogJFJldmlzaW9uOiA0Mjg1MiAkCisgKiAkRGF0ZTogMjAxMy0xMi0wNCAxMDo1MDo0OSAtMDYwMCAoV2VkLCAwNCBEZWMgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKworI2lmIE9NUF8zMF9FTkFCTEVECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApOworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKTsKK3N0YXRpYyBpbnQgIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKKworI2lmbmRlZiBLTVBfREVCVUcKKyMgZGVmaW5lIF9fa21wX3N0YXRpY19kZWxheSggYXJnICkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbHNlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKQoreworLyogV29yayBhcm91bmQgd2VpcmQgY29kZS1nZW4gYnVnIHRoYXQgY2F1c2VzIGFzc2VydCB0byB0cmlwICovCisjIGlmIEtNUF9BUkNIX1g4Nl82NCAmJiBLTVBfT1NfTElOVVgKKyAgICBLTVBfQVNTRVJUKCBhcmcgIT0gMCApOworIyBlbHNlCisgICAgS01QX0FTU0VSVCggYXJnID49IDAgKTsKKyMgZW5kaWYKK30KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfdHJhY2VfdGFza19zdGFjazogcHJpbnQgdGhlIHRpZWQgdGFza3MgZnJvbSB0aGUgdGFzayBzdGFjayBpbiBvcmRlcgorLy8gICAgIGZyb20gdG9wIGRvIGJvdHRvbQorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aHJlc2hvbGQ6IHZhbHVlIGFib3ZlIHdoaWNoIHRoZSB0cmFjZSBzdGF0ZW1lbnQgdHJpZ2dlcnMKKy8vICBsb2NhdGlvbjogc3RyaW5nIGlkZW50aWZ5aW5nIGNhbGwgc2l0ZSBvZiB0aGlzIGZ1bmN0aW9uIChmb3IgdHJhY2UpCisKK3N0YXRpYyB2b2lkCitfX2ttcF90cmFjZV90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhLCBpbnQgdGhyZXNob2xkLCBjaGFyICpsb2NhdGlvbiApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfdGFza2RhdGFfdCAqKnN0YWNrX3RvcCA9IHRhc2tfc3RhY2sgLT4gdHNfdG9wOworICAgIGttcF9pbnQzMiBlbnRyaWVzID0gdGFza19zdGFjayAtPiB0c19lbnRyaWVzOworICAgIGttcF90YXNrZGF0YV90ICp0aWVkX3Rhc2s7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhzdGFydCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZCwgZW50cmllcyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0X2Jsb2NrID0gJXAsIHN0YWNrX3RvcCA9ICVwIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2ssIHN0YWNrX3RvcCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGVudHJpZXMgPiAwICk7CisKKyAgICB3aGlsZSAoIGVudHJpZXMgIT0gMCApCisgICAgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworICAgICAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICAgICAgaWYgKCBlbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHN0YWNrX3RvcCkgOworCisgICAgICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgICAgICBzdGFja190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5pc2ggYm9va2tlZXBpbmcKKyAgICAgICAgc3RhY2tfdG9wLS07CisgICAgICAgIGVudHJpZXMtLTsKKworICAgICAgICB0aWVkX3Rhc2sgPSAqIHN0YWNrX3RvcDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisKKyAgICAgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soJXMpOiAgICAgICAgICAgICBndGlkPSVkLCBlbnRyeT0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhY2tfdG9wPSVwLCB0aWVkX3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkLCBlbnRyaWVzLCBzdGFja190b3AsIHRpZWRfdGFzayApICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YWNrX3RvcCA9PSAmIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLnNiX2Jsb2NrWzBdICk7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhleGl0KTogbG9jYXRpb24gPSAlcywgZ3RpZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbml0X3Rhc2tfc3RhY2s6IGluaXRpYWxpemUgdGhlIHRhc2sgc3RhY2sgZm9yIHRoZSBmaXJzdCB0aW1lCisvLyAgICBhZnRlciBhIHRocmVhZF9kYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgorLy8gICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZG8gdGhpcyBhZ2FpbiAoYXNzdW1pbmcgdGhlIHN0YWNrIHdvcmtzKS4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIG9mIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqZmlyc3RfYmxvY2s7CisKKyAgICAvLyBzZXQgdXAgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzdGFjaworICAgIGZpcnN0X2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gKGttcF90YXNrZGF0YV90ICoqKSBmaXJzdF9ibG9jazsKKyAgICBtZW1zZXQoICh2b2lkICopIGZpcnN0X2Jsb2NrLCAnXDAnLCBUQVNLX1NUQUNLX0JMT0NLX1NJWkUgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgdG8gYmUgZW1wdHkKKyAgICB0YXNrX3N0YWNrICAtPiB0c19lbnRyaWVzID0gVEFTS19TVEFDS19FTVBUWTsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9uZXh0ID0gTlVMTDsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ZyZWVfdGFza19zdGFjazogZnJlZSB0aGUgdGFzayBzdGFjayB3aGVuIHRocmVhZF9kYXRhIGlzIGRlc3Ryb3llZC4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAmIHRhc2tfc3RhY2sgLT4gdHNfZmlyc3RfYmxvY2s7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgPT0gVEFTS19TVEFDS19FTVBUWSApOworICAgIC8vIGZyZWUgZnJvbSB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBzdGFjaworICAgIHdoaWxlICggc3RhY2tfYmxvY2sgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKm5leHRfYmxvY2sgPSAoc3RhY2tfYmxvY2spID8gc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA6IE5VTEw7CisKKyAgICAgICAgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXYgPSBOVUxMOworICAgICAgICBpZiAoc3RhY2tfYmxvY2sgIT0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCBzdGFja19ibG9jayApOyAgLy8gZnJlZSB0aGUgYmxvY2ssIGlmIG5vdCB0aGUgZmlyc3QKKyAgICAgICAgfQorICAgICAgICBzdGFja19ibG9jayA9IG5leHRfYmxvY2s7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzID0gMDsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2tfc3RhY2s6IFB1c2ggdGhlIHRpZWQgdGFzayBvbnRvIHRoZSB0YXNrIHN0YWNrLgorLy8gICAgIEdyb3cgdGhlIHN0YWNrIGlmIG5lY2Vzc2FyeSBieSBhbGxvY2F0aW5nIGFub3RoZXIgYmxvY2suCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWQ6IHRocmVhZCBpbmZvIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgdG8gcHVzaCBvbiB0aGUgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX3B1c2hfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKiB0aWVkX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3MgOworCisgICAgaWYgKCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRpZWRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgKSB7CisgICAgICAgIHJldHVybjsgIC8vIERvbid0IHB1c2ggYW55dGhpbmcgb24gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfdG9wICE9IE5VTEwgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjayhlbnRlcik6IEdUSUQ6ICVkOyBUSFJFQUQ6ICVwOyBUQVNLOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZCwgdGllZF90YXNrICkgKTsKKyAgICAvLyBTdG9yZSBlbnRyeQorICAgICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wKSA9IHRpZWRfdGFzazsKKworICAgIC8vIERvIGJvb2trZWVwaW5nIGZvciBuZXh0IHB1c2gKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCsrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcysrOworCisgICAgaWYgKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCApCisgICAgeworICAgICAgICAvLyBGaW5kIGJlZ2lubmluZyBvZiB0aGlzIHRhc2sgYmxvY2sKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgICAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHRhc2tfc3RhY2sgLT4gdHNfdG9wIC0gVEFTS19TVEFDS19CTE9DS19TSVpFKTsKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBibG9jaworICAgICAgICBpZiAoIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgIT0gTlVMTCApCisgICAgICAgIHsgICAgLy8gcmVzZXQgdHNfdG9wIHRvIGJlZ2lubmluZyBvZiBuZXh0IGJsb2NrCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9ICYgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvLyBBbGxvYyBuZXcgYmxvY2sgYW5kIGxpbmsgaXQgdXAKKyAgICAgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXdfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikKKyAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2NhbGxvYyh0aHJlYWQsIHNpemVvZihrbXBfc3RhY2tfYmxvY2tfdCkpOworCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCAgPSAmIG5ld19ibG9jayAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBuZXdfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX3ByZXYgPSBzdGFja19ibG9jazsKKyAgICAgICAgICAgIG5ld19ibG9jayAgLT4gc2JfbmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjaygpOiBHVElEOiAlZDsgVEFTSzogJXA7IEFsbG9jIG5ldyBibG9jazogJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRpZWRfdGFzaywgbmV3X2Jsb2NrICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZXhpdCk6IEdUSUQ6ICVkOyBUQVNLOiAlcFxuIiwgZ3RpZCwgdGllZF90YXNrICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wb3BfdGFza19zdGFjazogUG9wIHRoZSB0aWVkIHRhc2sgZnJvbSB0aGUgdGFzayBzdGFjay4gIERvbid0IHJldHVybgorLy8gICAgIHRoZSB0YXNrLCBqdXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBlbmRpbmcgdGFzayBwYXNzZWQgaW4uCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgcG9wcGVkIG9mZiB0aGUgc3RhY2sKKy8vICBlbmRpbmdfdGFzazogdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcgKHNob3VsZCBtYXRjaCBwb3BwZWQgdGFzaykKKworc3RhdGljIHZvaWQKK19fa21wX3BvcF90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqZW5kaW5nX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4gdHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgaWYgKCBlbmRpbmdfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwb3AgYW55dGhpbmcgZnJvbSBzdGFjayBpZiB0ZWFtIG9yIHRlYW0gdGFza3MgYXJlIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID4gMCApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcG9wX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcFxuIiwgZ3RpZCwgdGhyZWFkICkgKTsKKworICAgIC8vIGZpeCB1cCB0c190b3AgaWYgd2UgbmVlZCB0byBwb3AgZnJvbSBwcmV2aW91cyBibG9jaworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgOworCisgICAgICAgIHN0YWNrX2Jsb2NrID0gc3RhY2tfYmxvY2sgLT4gc2JfcHJldjsKKyAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgfQorCisgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgdGFza19zdGFjayAtPiB0c190b3AtLTsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMtLTsKKworICAgIHRpZWRfdGFzayA9ICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgPT0gZW5kaW5nX3Rhc2sgKTsgIC8vIElmIHdlIGJ1aWx0IHRoZSBzdGFjayBjb3JyZWN0bHkKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3B1c2hfdGFzazogQWRkIGEgdGFzayB0byB0aGUgdGhyZWFkJ3MgZGVxdWUKKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfcHVzaF90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX2luZm9fdCAqICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAga21wX2ludDMyICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCB0cnlpbmcgdG8gcHVzaCB0YXNrICVwLlxuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworCisgICAgLy8gVGhlIGZpcnN0IGNoZWNrIGF2b2lkcyBidWlsZGluZyB0YXNrX3RlYW0gdGhyZWFkIGRhdGEgaWYgc2VyaWFsaXplZAorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIHRlYW0gc2VyaWFsaXplZDsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHNlcmlhbGl6ZWQgdGFza3MgaGF2ZSByZXR1cm5lZCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGFyZSBub3QgaW4gaW1tZWRpYXRlIGV4ZWMgbW9kZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgaWYgKCAhIEtNUF9UQVNLSU5HX0VOQUJMRUQoIHRhc2tfdGVhbSwgdGhyZWFkLT50aC50aF90YXNrX3N0YXRlICkgKSB7CisgICAgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyggdGFza190ZWFtLCB0aHJlYWQgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKSAhPSBOVUxMICk7CisKKyAgICAvLyBGaW5kIHRhc2tpbmcgZGVxdWUgc3BlY2lmaWMgdG8gZW5jb3VudGVyaW5nIHRocmVhZAorICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyB0aWQgXTsKKworICAgIC8vIE5vIGxvY2sgbmVlZGVkIHNpbmNlIG9ubHkgb3duZXIgY2FuIGFsbG9jYXRlCisgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIHRocmVhZCwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBkZXF1ZSBpcyBmdWxsCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSApCisgICAgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIGRlcXVlIGlzIGZ1bGw7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBMb2NrIHRoZSBkZXF1ZSBmb3IgdGhlIHRhc2sgcHVzaCBvcGVyYXRpb24KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIC8vIE11c3QgaGF2ZSByb29tIHNpbmNlIG5vIHRocmVhZCBjYW4gYWRkIHRhc2tzIGJ1dCBjYWxsaW5nIHRocmVhZAorICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPCBUQVNLX0RFUVVFX1NJWkUgKTsKKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIF0gPSB0YXNrZGF0YTsgIC8vIFB1c2ggdGFza2RhdGEKKyAgICAvLyBXcmFwIGluZGV4LgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgKyAxICkgJiBUQVNLX0RFUVVFX01BU0s7CisgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpICsgMSk7ICAgICAgICAgICAgIC8vIEFkanVzdCB0YXNrIGNvdW50CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCByZXR1cm5pbmcgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOiAiCisgICAgICAgICAgICAgICAgICAidGFzaz0lcCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQpICk7CisKKyAgICByZXR1cm4gVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQ6IHNldCB1cCBjdXJyZW50IHRhc2sgZnJvbSBjYWxsZWQgdGhyZWFkIHdoZW4gdGVhbSBlbmRzCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgY3VycmVudF90YXNrIGluLgorCit2b2lkCitfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7CisKKyAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50ICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGluIGNhbGxlZCB0aHJlYWQgZm9yIGEgbmV3IHRlYW0KKy8vIHRoaXNfdGhyOiB0aHJlYWQgc3RydWN0dXJlIHRvIHNldCB1cAorLy8gdGVhbTogdGVhbSBmb3IgaW1wbGljaXQgdGFzayBkYXRhCisvLyB0aWQ6IHRocmVhZCB3aXRoaW4gdGVhbSB0byBzZXQgdXAKKwordm9pZAorX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApCit7CisgICAgLy8gY3VycmVudCB0YXNrIG9mIHRoZSB0aHJlYWQgaXMgYSBwYXJlbnQgb2YgdGhlIG5ldyBqdXN0IGNyZWF0ZWQgaW1wbGljaXQgdGFza3Mgb2YgbmV3IHRlYW0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChlbnRlcik6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGhpc190aHIgIT0gTlVMTCk7CisKKyAgICBpZiggdGlkID09IDAgKSB7CisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICE9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdICkgeworICAgICAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXS50ZF9wYXJlbnQgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF0udGRfcGFyZW50OworICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChleGl0KTogVCMlZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwICIKKyAgICAgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3N0YXJ0OiBib29ra2VlcGluZyBmb3IgYSB0YXNrIHN0YXJ0aW5nIGV4ZWN1dGlvbgorLy8gR1RJRDogZ2xvYmFsIHRocmVhZCBpZCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFzazogdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIGN1cnJlbnRfdGFzazogdGFzayBzdXNwZW5kaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrX3N0YXJ0KCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfc3RhcnQoZW50ZXIpOiBUIyVkIHN0YXJ0aW5nIHRhc2sgJXA6IGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBtYXJrIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhcyBzdXNwZW5kZWQKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAvLyBBZGQgdGFzayB0byBzdGFjayBpZiB0aWVkCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgaWYgKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQgKQorICAgIHsKKyAgICAgICAgX19rbXBfcHVzaF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgLy8gbWFyayBzdGFydGluZyB0YXNrIGFzIGV4ZWN1dGluZyBhbmQgYXMgY3VycmVudCB0YXNrCisgICAgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayA9IHRhc2tkYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID0gMTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIHBhc3Mgc29tZSBzb3J0IG9mIGxvY2F0aW9uIGlkZW50aWZpZXIgaGVyZT8KKyAgICAvLyBBUFQ6IHllcywgd2Ugd2lsbCBwYXNzIGxvY2F0aW9uIGhlcmUuCisgICAgLy8gbmVlZCB0byBzdG9yZSBjdXJyZW50IHRocmVhZCBzdGF0ZSAoaW4gYSB0aHJlYWQgb3IgdGFza2RhdGEgc3RydWN0dXJlKQorICAgIC8vIGJlZm9yZSBzZXR0aW5nIHdvcmtfc3RhdGUsIG90aGVyd2lzZSB3cm9uZyBzdGF0ZSBpcyBzZXQgYWZ0ZXIgZW5kIG9mIHRhc2sKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfc3RhcnQoZXhpdCk6IFQjJWQgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIHJldHVybjsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjA6IHJlcG9ydCB0aGF0IGEgZ2l2ZW4gc2VyaWFsaXplZCB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBzdGFydGVkIHRhc2suCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2sgKSApOworCisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOyAgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHksIG5vdCBkZWZlcnJlZC4KKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgdGFza2RhdGEgKSApOworCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgVEFTS19VTlVTRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX2JlZ2luOiByZXBvcnQgdGhhdCBhIGdpdmVuIHRhc2sgaGFzIHN0YXJ0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbihlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXAgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayksIGN1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbihleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcCxcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFzazogZnJlZSB0aGUgY3VycmVudCB0YXNrIHNwYWNlIGFuZCB0aGUgc3BhY2UgZm9yIHNoYXJlZHMKKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSwga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZnJlZV90YXNrOiBUIyVkIGZyZWVpbmcgZGF0YSBmcm9tIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBhbGwgZmxhZ3MgYW5kIGNvdW50ZXJzIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPT0gMSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgPT0gMCAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID09IDEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgPSAxOworICAgIC8vIGRlYWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCBzaGFyZWQgdmFyaWFibGUgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgI2VuZGlmCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWQgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgYW5kIGFuY2VzdG9ycyB3aXRob3V0IGNoaWxkcmVuCisvLworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IDA7CisgICAga21wX2ludDMyIHRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkID0gdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXI7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICBpZiAoICF0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCApIHsKKyAgICAgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworICAgIH0KKworICAgIC8vIE5vdywgZ28gdXAgdGhlIGFuY2VzdG9yIHRyZWUgdG8gc2VlIGlmIGFueSBhbmNlc3RvcnMgY2FuIG5vdyBiZSBmcmVlZC4KKyAgICB3aGlsZSAoIGNoaWxkcmVuID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnRfdGFza2RhdGEgPSB0YXNrZGF0YSAtPiB0ZF9wYXJlbnQ7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZW50ZXIpOiBUIyVkIHRhc2sgJXAgY29tcGxldGUgIgorICAgICAgICAgICAgICAgICAgICAgICJhbmQgZnJlZWluZyBpdHNlbGZcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgICAgIC8vIC0tLSBEZWFsbG9jYXRlIG15IGFuY2VzdG9yIHRhc2sgLS0tCisgICAgICAgIF9fa21wX2ZyZWVfdGFzayggZ3RpZCwgdGFza2RhdGEsIHRocmVhZCApOworCisgICAgICAgIHRhc2tkYXRhID0gcGFyZW50X3Rhc2tkYXRhOworCisgICAgICAgIC8vIFN0b3AgY2hlY2tpbmcgYW5jZXN0b3JzIGF0IGltcGxpY2l0IHRhc2sgb3IgaWYgdGFza2luZyBzZXJpYWxpemVkCisgICAgICAgIC8vIGluc3RlYWQgb2Ygd2Fsa2luZyB1cCBhbmNlc3RvciB0cmVlIHRvIGF2b2lkIHByZW1hdHVyZSBkZWFsbG9jYXRpb24gb2YgYW5jZXN0b3JzLgorICAgICAgICBpZiAoIHRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfSU1QTElDSVQgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICggIXRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkICkgeworICAgICAgICAgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgICAgICAgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGV4aXQpOiBUIyVkIHRhc2sgJXAgaGFzICVkIGNoaWxkcmVuOyAiCisgICAgICAgICAgICAgICAgICAibm90IGZyZWVpbmcgaXQgeWV0XG4iLCBndGlkLCB0YXNrZGF0YSwgY2hpbGRyZW4pICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2ZpbmlzaDogYm9va2tlZXBpbmcgdG8gZG8gd2hlbiBhIHRhc2sgZmluaXNoZXMgZXhlY3V0aW9uCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIElEIGZvciBjYWxsaW5nIHRocmVhZAorLy8gdGFzazogdGFzayB0byBiZSBmaW5pc2hlZAorLy8gcmVzdW1lZF90YXNrOiB0YXNrIHRvIGJlIHJlc3VtZWQuICAobWF5IGJlIE5VTEwgaWYgdGFzayBpcyBzZXJpYWxpemVkKQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza19maW5pc2goIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrLCBrbXBfdGFza2RhdGFfdCAqcmVzdW1lZF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZW50ZXIpOiBUIyVkIGZpbmlzaGluZyB0YXNrICVwIGFuZCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIC8vIFBvcCB0YXNrIGZyb20gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3BvcF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsgIC8vIHN1c3BlbmQgdGhlIGZpbmlzaGluZyB0YXNrCisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPSAxOyAgIC8vIG1hcmsgdGhlIHRhc2sgYXMgY29tcGxldGVkCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9PSAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgY291bnQgaWYgdGVhbSBwYXJhbGxlbCBhbmQgdGFza2luZyBub3Qgc2VyaWFsaXplZAorICAgIGlmICggISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApIHsKKyAgICAgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgICAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9wYXJlbnQgLT4gdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgKQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworICAgICAgICBfX2ttcF9yZWxlYXNlX2RlcHMoZ3RpZCx0YXNrZGF0YSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2ZpbmlzaDogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCAlZCBpbmNvbXBsZXRlIGNoaWxkcmVuXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBJZiB0aGUgdGFza3MnIGRlc3RydWN0b3IgdGh1bmsgZmxhZyBoYXMgYmVlbiBzZXQsIHdlIG5lZWQgdG8gaW52b2tlIHRoZQorICAgICAgIGRlc3RydWN0b3IgdGh1bmsgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgICAgIFRoZSBjb2RlIGlzIHBsYWNlZCBoZXJlLCBzaW5jZSBhdCB0aGlzIHBvaW50IG90aGVyIHRhc2tzIG1pZ2h0IGhhdmUgYmVlbiByZWxlYXNlZAorICAgICAgIGhlbmNlIG92ZXJsYXBwaW5nIHRoZSBkZXN0cnVjdG9yIGludm9rYXRpb25zIHdpdGggc29tZSBvdGhlciB3b3JrIGluIHRoZQorICAgICAgIHJlbGVhc2VkIHRhc2tzLiAgVGhlIE9wZW5NUCBzcGVjIGlzIG5vdCBzcGVjaWZpYyBvbiB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUKKyAgICAgICBpbnZva2VkLCBzbyB3ZSBzaG91bGQgYmUgZnJlZSB0byBjaG9vc2UuCisgICAgICovCisgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5kZXN0cnVjdG9yc190aHVuaykgeworICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IGRlc3RyX3RodW5rID0gdGFzay0+ZGVzdHJ1Y3RvcnM7CisgICAgICAgIEtNUF9BU1NFUlQoZGVzdHJfdGh1bmspOworICAgICAgICBkZXN0cl90aHVuayhndGlkLCB0YXNrKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8vIGJvb2trZWVwaW5nIGZvciByZXN1bWluZyB0YXNrOgorICAgIC8vIEdFSCAtIG5vdGUgdGFza2luZ19zZXIgPT4gdGFza19zZXJpYWwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKTsKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApCisgICAgeworICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VtZWRfdGFzayA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7ICAvLyBJbiBhIHNlcmlhbGl6ZWQgdGFzaywgdGhlIHJlc3VtZWQgdGFzayBpcyB0aGUgcGFyZW50CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgcmVzdW1lZCB0YXNrIHBhc3NlZCBpbiBwb2ludHMgdG8gcGFyZW50CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgPT0gdGFza2RhdGEtPnRkX3BhcmVudCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgIT0gTlVMTCApOyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgcmVzdW1lZCB0YXNrIGlzIHBhc3NlZCBhcyBhcmd1ZW1udAorICAgIH0KKworICAgIC8vIEZyZWUgdGhpcyB0YXNrIGFuZCB0aGVuIGFuY2VzdG9yIHRhc2tzIGlmIHRoZXkgaGF2ZSBubyBjaGlsZHJlbi4KKyAgICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKKworICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7IC8vIHJlc3RvcmUgY3VycmVudF90YXNrCisKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsgIC8vIHJlc3VtZSBwcmV2aW91cyB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChleGl0KTogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjA6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gZW5kIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIE5VTEwgKTsgIC8vIHRoaXMgcm91dGluZSB3aWxsIHByb3ZpZGUgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZTogcmVwb3J0IHRoYXQgYSB0YXNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyBOb3Qgc3VyZSBob3cgdG8gZmluZCB0YXNrIHRvIHJlc3VtZQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrOiBJbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIGltcGxpY2l0IHRhc2sgZm9yIGEgZ2l2ZW4gdGhyZWFkCisvLworLy8gbG9jX3JlZjogIHJlZmVyZW5jZSB0byBzb3VyY2UgbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisvLyB0aGlzX3RocjogIHRocmVhZCBkYXRhIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGltcGxpY2l0IHRhc2sKKy8vIHRlYW06IHRlYW0gZm9yIHRoaXNfdGhyCisvLyB0aWQ6IHRocmVhZCBpZCBvZiBnaXZlbiB0aHJlYWQgd2l0aGluIHRlYW0KKy8vIHNldF9jdXJyX3Rhc2s6IFRSVUUgaWYgbmVlZCB0byBwdXNoIGN1cnJlbnQgdGFzayB0byB0aHJlYWQKKy8vIE5PVEU6IFJvdXRpbmUgZG9lcyBub3Qgc2V0IHVwIHRoZSBpbXBsaWNpdCB0YXNrIElDVlMuICBUaGlzIGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBlbHNld2hlcmUuCisvLyBUT0RPOiBHZXQgYmV0dGVyIGxvY19yZWYuICBWYWx1ZSBwYXNzZWQgaW4gbWF5IGJlIE5VTEwKKwordm9pZAorX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFzayAgID0gJiB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soZW50ZXIpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXAsIHJlaW5pdD0lc1xuIiwKKyAgICAgICAgICAgICAgICAgIHRpZCwgdGVhbSwgdGFzaywgc2V0X2N1cnJfdGFzayA/ICJUUlVFIiA6ICJGQUxTRSIgKSApOworCisgICAgdGFzay0+dGRfdGFza19pZCAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrLT50ZF90ZWFtICAgICA9IHRlYW07CisvLyAgICB0YXNrLT50ZF9wYXJlbnQgICA9IE5VTEw7ICAvLyBmaXggZm9yIENRMjMwMTAxIChicm9rZW4gcGFyZW50IHRhc2sgaW5mbyBpbiBkZWJ1Z2dlcikKKyAgICB0YXNrLT50ZF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgdGFzay0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFzay0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFzay0+dGRfdGFza3dhaXRfdGhyZWFkICA9IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IFRBU0tfVElFRDsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNrdHlwZSAgICA9IFRBU0tfSU1QTElDSVQ7CisgICAgLy8gQWxsIGltcGxpY2l0IHRhc2tzIGFyZSBleGVjdXRlZCBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkCisgICAgdGFzay0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIHRhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApID8gMSA6IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmNvbXBsZXRlICAgID0gMDsKKyAgICB0YXNrLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2stPnRkX2RlcGhhc2ggPSBOVUxMOworICAgIHRhc2stPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoc2V0X2N1cnJfdGFzaykgeyAgLy8gb25seSBkbyB0aGlzIGluaXRpYWxpemF0aW9uIHRoZSBmaXJzdCB0aW1lIGEgdGhyZWFkIGlzIGNyZWF0ZWQKKyAgICAgICAgdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgICAgIHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAwOyAvLyBOb3QgdXNlZCBiZWNhdXNlIGRvIG5vdCBuZWVkIHRvIGRlYWxsb2NhdGUgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRhc2stPnRkX3Rhc2tncm91cCA9IE5VTEw7ICAgICAgICAgICAvLyBBbiBpbXBsaWNpdCB0YXNrIGRvZXMgbm90IGhhdmUgdGFza2dyb3VwCisjZW5kaWYKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3RociwgdGVhbSwgdGlkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPT0gMCk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGV4aXQpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2sgKSApOworfQorCisvLyBSb3VuZCB1cCBhIHNpemUgdG8gYSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IHZhbAorLy8gVXNlZCB0byBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHN0cnVjdHVyZXMgY28tYWxsb2NhdGVkIHVzaW5nIGEgc2luZ2xlIG1hbGxvYygpIGNhbGwKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kX3VwX3RvX3ZhbCggc2l6ZV90IHNpemUsIHNpemVfdCB2YWwgKSB7CisgICAgaWYgKCBzaXplICYgKCB2YWwgLSAxICkgKSB7CisgICAgICAgIHNpemUgJj0gfiAoIHZhbCAtIDEgKTsKKyAgICAgICAgaWYgKCBzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gdmFsICkgeworICAgICAgICAgICAgc2l6ZSArPSB2YWw7ICAgIC8vIFJvdW5kIHVwIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kX3VwX3RvX3ZhCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgdGFzayBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgdGFzaworLy8KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyBmbGFnczogaW5jbHVkZSB0aWVkbmVzcyAmIHRhc2sgdHlwZSAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSBvZiB0aGUgJyduZXcnJyB0YXNrIGVuY291bnRlcmVkLgorLy8gICAgICAgIENvbnZlcnRlZCBmcm9tIGttcF9pbnQzMiB0byBrbXBfdGFza2luZ19mbGFnc190IGluIHJvdXRpbmUuCisvLyBzaXplb2Zfa21wX3Rhc2tfdDogIFNpemUgaW4gYnl0ZXMgb2Yga21wX3Rhc2tfdCBkYXRhIHN0cnVjdHVyZSBpbmNsdWRpbmcgcHJpdmF0ZSB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyBzaXplb2Zfc2hhcmVkczogIFNpemUgaW4gYnl0ZXMgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgYWNjZXNzZWQgaW4gdGFzay4KKy8vIHRhc2tfZW50cnk6IFBvaW50ZXIgdG8gdGFzayBjb2RlIGVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBjb21waWxlci4KKy8vIHJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KKwora21wX3Rhc2tfdCAqCitfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oMHgleCkgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsICooKGttcF9pbnQzMiAqKWZsYWdzKSwgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKworICAgIGlmICggcGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsICkgeworICAgICAgICBpZiAoZmxhZ3MtPm1lcmdlZF9pZjApIHsKKyAgICAgICAgfQorICAgICAgICBmbGFncy0+ZmluYWwgPSAxOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBzaGFyZWQgc3RydWN0dXJlIG9mZnNldCBpbmNsdWRpbmcgcGFkZGluZyBhZnRlciBrbXBfdGFza190IHN0cnVjdAorICAgIC8vIHRvIGFsaWduIHBvaW50ZXJzIGluIHNoYXJlZCBzdHJ1Y3QKKyAgICBzaGFyZWRzX29mZnNldCA9IHNpemVvZigga21wX3Rhc2tkYXRhX3QgKSArIHNpemVvZl9rbXBfdGFza190OworICAgIHNoYXJlZHNfb2Zmc2V0ID0gX19rbXBfcm91bmRfdXBfdG9fdmFsKCBzaGFyZWRzX29mZnNldCwgc2l6ZW9mKCB2b2lkICogKSk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIGttcF90YXNrZGF0YV90IGJsb2NrIGFuZCBhIGttcF90YXNrX3QgYmxvY2suCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBGaXJzdCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2hhcmVkc19vZmZzZXQpICk7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBTZWNvbmQgbWFsbG9jIHNpemU6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemVvZl9zaGFyZWRzKSApOworCisgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkcyApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgdGFzayAgICAgICAgICAgICAgICAgICAgICA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0YXNrICYgdGFza2RhdGEgYXJlIGFsaWduZWQgYXBwcm9wcmlhdGVseQorI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2tkYXRhKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihfUXVhZCktMSkgKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzaykgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyNlbmRpZgorICAgIGlmIChzaXplb2Zfc2hhcmVkcyA+IDApIHsKKyAgICAgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9ICYgKChjaGFyICopIHRhc2tkYXRhKVsgc2hhcmVkc19vZmZzZXQgXTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNoYXJlZHMgc3RydWN0IGlzIGFsaWduZWQgdG8gcG9pbnRlciBzaXplCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2stPnNoYXJlZHMpICYgKHNpemVvZih2b2lkICopLTEpICkgPT0gMCApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHRhc2stPnJvdXRpbmUgICAgICAgICAgICAgPSB0YXNrX2VudHJ5OworICAgIHRhc2stPnBhcnRfaWQgICAgICAgICAgICAgPSAwOyAgICAgIC8vIEFDOiBBbHdheXMgc3RhcnQgd2l0aCAwIHBhcnQgaWQKKworICAgIHRhc2tkYXRhLT50ZF90YXNrX2lkICAgICAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrZGF0YS0+dGRfdGVhbSAgICAgICAgID0gdGVhbTsKKyAgICB0YXNrZGF0YS0+dGRfYWxsb2NfdGhyZWFkID0gdGhyZWFkOworICAgIHRhc2tkYXRhLT50ZF9wYXJlbnQgICAgICAgPSBwYXJlbnRfdGFzazsKKyAgICB0YXNrZGF0YS0+dGRfbGV2ZWwgICAgICAgID0gcGFyZW50X3Rhc2stPnRkX2xldmVsICsgMTsgLy8gaW5jcmVtZW50IG5lc3RpbmcgbGV2ZWwKKyAgICB0YXNrZGF0YS0+dGRfaWRlbnQgICAgICAgID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgID0gMDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfcGFyZW50ICE9IE5VTEwgKTsKKyAgICBjb3B5X2ljdnMoICZ0YXNrZGF0YS0+dGRfaWN2cywgJnRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IGZsYWdzLT50aWVkbmVzczsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwgICAgICAgPSBmbGFncy0+ZmluYWw7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLm1lcmdlZF9pZjAgID0gZmxhZ3MtPm1lcmdlZF9pZjA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmsgPSBmbGFncy0+ZGVzdHJ1Y3RvcnNfdGh1bms7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0VYUExJQ0lUOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRhc2tpbmdfc2VyIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgPSAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBHRUggLSBUT0RPOiBmaXggdGhpcyB0byBjb3B5IHBhcmVudCB0YXNrJ3MgdmFsdWUgb2YgdGVhbV9zZXJpYWwgZmxhZworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgLy8gR0VIIC0gTm90ZSB3ZSBzZXJpYWxpemUgdGhlIHRhc2sgaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCB0byBtYWtlIHN1cmUgaW1wbGljaXQgcGFyYWxsZWwgcmVnaW9uCisgICAgLy8gICAgICAgdGFza3MgYXJlIG5vdCBsZWZ0IHVudGlsIHByb2dyYW0gdGVybWluYXRpb24gdG8gZXhlY3V0ZS4gIEFsc28sIGl0IGhlbHBzIGxvY2FsaXR5IHRvIGV4ZWN1dGUKKyAgICAvLyAgICAgICBpbW1lZGlhdGVseS4KKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAoIHRhc2tkYXRhLT50ZF9mbGFncy5maW5hbAorICAgICAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgICAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkICAgICAgID0gMDsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUgICAgICA9IGZsYWdzLT5uYXRpdmU7CisKKyAgICB0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgdGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAxOyAvLyBzdGFydCBhdCBvbmUgYmVjYXVzZSBjb3VudHMgY3VycmVudCB0YXNrIGFuZCBjaGlsZHJlbgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGhlIHRhc2tncm91cCBmcm9tIHRoZSBwYXJlbnQgdGFzaworICAgIHRhc2tkYXRhLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfZGVwbm9kZSA9IE5VTEw7CisjZW5kaWYgCisgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGQgdGFzayBjb3VudHMgaWYgdGVhbSBwYXJhbGxlbCBhbmQgdGFza2luZyBub3Qgc2VyaWFsaXplZAorICAgIGlmICggISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApIHsKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSgmIHBhcmVudF90YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisjZW5kaWYKKyAgICAgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIGNoaWxkIHRhc2tzIGZvciBleHBsaWNpdCB0YXNrcyBzaW5jZSBpbXBsaWNpdCBub3QgZGVhbGxvY2F0ZWQKKyAgICAgICAgaWYgKCB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICkgeworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfYWxsb2MoZXhpdCk6IFQjJWQgY3JlYXRlZCB0YXNrICVwIHBhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0YXNrZGF0YS0+dGRfcGFyZW50KSApOworCisgICAgcmV0dXJuIHRhc2s7Cit9CisKKwora21wX3Rhc2tfdCAqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnJldHZhbDsKKyAgICBrbXBfdGFza2luZ19mbGFnc190ICppbnB1dF9mbGFncyA9IChrbXBfdGFza2luZ19mbGFnc190ICopICYgZmxhZ3M7CisKKyAgICBpbnB1dF9mbGFncy0+bmF0aXZlID0gRkFMU0U7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIHJ1bnRpbWUgZmxhZ3MKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oJXMpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBpbnB1dF9mbGFncy0+dGllZG5lc3MgPyAidGllZCAgIiA6ICJ1bnRpZWQiLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5KSApOworCisgICAgcmV0dmFsID0gX19rbXBfdGFza19hbGxvYyggbG9jX3JlZiwgZ3RpZCwgaW5wdXRfZmxhZ3MsIHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5ICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfb21wX3Rhc2tfYWxsb2MoZXhpdCk6IFQjJWQgcmV0dmFsICVwXG4iLCBndGlkLCByZXR2YWwpICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfaW52b2tlX3Rhc2s6IGludm9rZSB0aGUgc3BlY2lmaWVkIHRhc2sKKy8vCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIElEIG9mIGNhbGxlcgorLy8gdGFzazogdGhlIHRhc2sgdG8gaW52b2tlCisvLyBjdXJyZW50X3Rhc2s6IHRoZSB0YXNrIHRvIHJlc3VtZSBhZnRlciB0YXNrIGludm9rYXRpb24KKworc3RhdGljIHZvaWQKK19fa21wX2ludm9rZV90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCBkaXNjYXJkID0gMCAvKiBmYWxzZSAqLzsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGVudGVyKTogVCMlZCBpbnZva2luZyB0YXNrICVwLCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIFRPRE86IGNhbmNlbCB0YXNrcyBpZiB0aGUgcGFyYWxsZWwgcmVnaW9uIGhhcyBhbHNvIGJlZW4gY2FuY2VsbGVkCisgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgaG9pc3RlZCBhYm92ZSBfX2ttcF90YXNrX3N0YXJ0CisgICAgLy8gaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgZm9yIHRoaXMgcnVuIC4uLgorICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAgICAga21wX3RlYW1fdCAqIHRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBrbXBfdGFza2dyb3VwX3QgKiB0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgICAgICBpZiAoKHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSB8fCAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX3BhcmFsbGVsKSkgeworICAgICAgICAgICAgLy8gdGhpcyB0YXNrIGJlbG9uZ3MgdG8gYSB0YXNrIGdyb3VwIGFuZCB3ZSBuZWVkIHRvIGNhbmNlbCBpdAorICAgICAgICAgICAgZGlzY2FyZCA9IDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSW52b2tlIHRoZSB0YXNrIHJvdXRpbmUgYW5kIHBhc3MgaW4gcmVsZXZhbnQgZGF0YS4KKyAgICAvLyBUaHVua3MgZ2VuZXJhdGVkIGJ5IGdjYyB0YWtlIGEgZGlmZmVyZW50IGFyZ3VtZW50IGxpc3QuCisgICAgLy8KKyAgICBpZiAoIWRpc2NhcmQpIHsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLm5hdGl2ZSkgeworICAgICAgICAgICAgKCh2b2lkICgqKSh2b2lkICopKSgqKHRhc2stPnJvdXRpbmUpKSkodGFzay0+c2hhcmVkcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgICAgICB7CisgICAgICAgICAgICAoKih0YXNrLT5yb3V0aW5lKSkoZ3RpZCwgdGFzayk7CisgICAgICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW5vdmtlX3Rhc2soZXhpdCk6IFQjJWQgY29tcGxldGVkIHRhc2sgJXAsIHJlc3VtaW5nIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX3BhcnRzOiBTY2hlZHVsZSBhIHRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgZm9yIGV4ZWN1dGlvbgorLy8KKy8vIGxvY19yZWY6IGxvY2F0aW9uIG9mIG9yaWdpbmFsIHRhc2sgcHJhZ21hIChpZ25vcmVkKQorLy8gZ3RpZDogR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisvLyBuZXdfdGFzazogdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKSBmb3IgdGhlICcnbmV3IHRhc2snJworLy8gUmV0dXJuczoKKy8vICAgIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEICgwKSBpZiBkaWQgbm90IHN1c3BlbmQgYW5kIHF1ZXVlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza19wYXJ0cyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaykKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19wYXJ0cyhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAgLyogU2hvdWxkIHdlIGV4ZWN1dGUgdGhlIG5ldyB0YXNrIG9yIHF1ZXVlIGl0PyAgIEZvciBub3csIGxldCdzIGp1c3QgYWx3YXlzIHRyeSB0bworICAgICAgIHF1ZXVlIGl0LiAgSWYgdGhlIHF1ZXVlIGZpbGxzIHVwLCB0aGVuIHdlJ2xsIGV4ZWN1dGUgaXQuICAqLworCisgICAgaWYgKCBfX2ttcF9wdXNoX3Rhc2soIGd0aWQsIG5ld190YXNrICkgPT0gVEFTS19OT1RfUFVTSEVEICkgLy8gaWYgY2Fubm90IGRlZmVyCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHkKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICBuZXdfdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIG5ld190YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfcGFydHMoZXhpdCk6IFQjJWQgcmV0dXJuaW5nIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOiAiCisgICAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXAsIHJldHVybjogVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEgKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2s6IFNjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgZm9yIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gcmV0dXJuczoKKy8vCisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisgICAga21wX2ludDMyIHJjOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/ICAgRm9yIG5vdywgbGV0J3MganVzdCBhbHdheXMgdHJ5IHRvCisgICAgICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisKKyAgICBpZiAoIF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIG5ld190YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGV4aXQpOiBUIyVkIHJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDogbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrd2FpdDogV2FpdCB1bnRpbCBhbGwgdGFza3MgZ2VuZXJhdGVkIGJ5IHRoZSBjdXJyZW50IHRhc2sgYXJlIGNvbXBsZXRlCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrd2FpdCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t3YWl0KGVudGVyKTogVCMlZCBsb2M9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmKSApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBiZWdpbiB3YWl0PworCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSB7CisgICAgICAgICAgICAvLyBHRUg6IGlmIHRlYW0gc2VyaWFsaXplZCwgYXZvaWQgcmVhZGluZyB0aGUgdm9sYXRpbGUgdmFyaWFibGUgYmVsb3cuCisgICAgICAgICAgICB3aGlsZSAoIFRDUl80KHRhc2tkYXRhIC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrcyggdGhyZWFkLCBndGlkLCAmKHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZDsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t3YWl0KGV4aXQpOiBUIyVkIHRhc2sgJXAgZmluaXNoZWQgd2FpdGluZywgIgorICAgICAgICAgICAgICAgICAgInJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2t5aWVsZDogc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRhc2sKKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGVudGVyKTogVCMlZCBsb2M9JXAgZW5kX3BhcnQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGVuZF9wYXJ0KSApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBiZWdpbiB3YWl0PworCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICAvLyBTaG91bGQgd2UgbW9kZWwgdGhpcyBhcyBhIHRhc2sgd2FpdCBvciBub3Q/CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgSVRUIGV2ZW50cyBhcyB3ZWxsLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgKz0gMTsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tzKCB0aHJlYWQsIGd0aWQsIE5VTEwsIDAsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGVuZCBvZiB3YWl0PworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gLSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGV4aXQpOiBUIyVkIHRhc2sgJXAgcmVzdW1pbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfdGFza2dyb3VwOiBTdGFydCBhIG5ldyB0YXNrZ3JvdXAKKwordm9pZAorX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCogbG9jLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgICAgICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICAqIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tncm91cF90ICogdGdfbmV3ID0KKyAgICAgICAgKGttcF90YXNrZ3JvdXBfdCAqKV9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZW9mKCBrbXBfdGFza2dyb3VwX3QgKSApOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrZ3JvdXA6IFQjJWQgbG9jPSVwIGdyb3VwPSVwXG4iLCBndGlkLCBsb2MsIHRnX25ldykgKTsKKyAgICB0Z19uZXctPmNvdW50ID0gMDsKKyAgICB0Z19uZXctPmNhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgIHRnX25ldy0+cGFyZW50ID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGdfbmV3OworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX2VuZF90YXNrZ3JvdXA6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrCisvLyAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBkZXNjZW5kYW50cyBhcmUgY29tcGxldGUKKwordm9pZAorX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cCAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gRm9yIElUVCB0aGUgdGFza2dyb3VwIHdhaXQgaXMgc2ltaWxhciB0byB0YXNrd2FpdCB1bnRpbCB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0KKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZ3JvdXAtPmNvdW50KSAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza3MoIHRocmVhZCwgZ3RpZCwgJih0YXNrZ3JvdXAtPmNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2dyb3VwLT5jb3VudCA9PSAwICk7CisKKyAgICAvLyBSZXN0b3JlIHBhcmVudCB0YXNrZ3JvdXAgZm9yIHRoZSBjdXJyZW50IHRhc2sKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGFza2dyb3VwLT5wYXJlbnQ7CisgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgdGFza2dyb3VwICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2tncm91cChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworfQorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlbW92ZV9teV90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gbXkgb3duIGRlcXVlCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3JlbW92ZV9teV90YXNrKCBrbXBfaW5mb190ICogdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ICogdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsKKyAgICBrbXBfdWludDMyIHRhaWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApOyAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgICAgICAgdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZW50ZXIpOiBUIyVkIG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMxKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0YWlsID0gKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLOyAgLy8gV3JhcCBpbmRleC4KKyAgICB0YXNrZGF0YSA9IHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0YWlsIF07CisKKyAgICBpZiAoaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGNoaWxkIG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudCA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBrbXBfaW50MzIgICAgICAgIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gY3VycmVudCAmJiBwYXJlbnQtPnRkX2xldmVsID4gbGV2ZWwgKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnRkX3BhcmVudDsgIC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICggcGFyZW50ICE9IGN1cnJlbnQgKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkcyBjYW4gYXBwZWFyIGluIHRoZSBkZXF1ZS4KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCB0YXNrICVwIHJlbW92ZWQ6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9zdGVhbF90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gYW5vdGhlciB0aHJlYWQncyBkZXF1ZQorLy8gQXNzdW1lIHRoYXQgY2FsbGluZyB0aHJlYWQgaGFzIGFscmVhZHkgY2hlY2tlZCBleGlzdGVuY2Ugb2YKKy8vIHRhc2tfdGVhbSB0aHJlYWRfZGF0YSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3N0ZWFsX3Rhc2soIGttcF9pbmZvX3QgKnZpY3RpbSwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqdW5maW5pc2hlZF90aHJlYWRzLCBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdmljdGltX3RkLCAqdGhyZWFkc19kYXRhOworICAgIGttcF9pbnQzMiB2aWN0aW1fdGlkLCB0aHJlYWRfdGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgIC8vIENhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBjb25kaXRpb24KKworICAgIHZpY3RpbV90aWQgPSB2aWN0aW0tPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIHZpY3RpbV90ZCA9ICYgdGhyZWFkc19kYXRhWyB2aWN0aW1fdGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGVudGVyKTogVCMlZCB0cnkgdG8gc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgbnRhc2tzPSVkICIKKyAgICAgICAgICAgICAgICAgICJoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKCAoVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgfHwgLy8gQ2FsbGVyIHNob3VsZCBub3QgY2hlY2sgdGhpcyBjb25kaXRpb24KKyAgICAgICAgIChUQ1JfUFRSKHZpY3RpbS0+dGgudGhfdGFza190ZWFtKSAhPSB0YXNrX3RlYW0pKSAvLyBHRUg6IHdoeSB3b3VsZCB0aGlzIGhhcHBlbj8KKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMSk6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgd2UgYWNxdWlyZSB0aGUgbG9jaworICAgIGlmICggKFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHx8CisgICAgICAgICAoVENSX1BUUih2aWN0aW0tPnRoLnRoX3Rhc2tfdGVhbSkgIT0gdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgICAgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKTsKKworICAgIGlmICggIWlzX2NvbnN0cmFpbmVkICkgeworICAgICAgICB0YXNrZGF0YSA9IHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZVsgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgXTsKKyAgICAgICAgLy8gQnVtcCBoZWFkIHBvaW50ZXIgYW5kIFdyYXAuCisgICAgICAgIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9oZWFkID0gKCB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGlsZSB3ZSBoYXZlIHBvc3Rwb25lZCB0YXNrcyBsZXQncyBzdGVhbCBmcm9tIHRhaWwgb2YgdGhlIGRlcXVlIChzbWFsbGVyIHRhc2tzKQorICAgICAgICBrbXBfaW50MzIgdGFpbCA9ICggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX3RhaWwgLSAxICkgJiBUQVNLX0RFUVVFX01BU0s7ICAvLyBXcmFwIGluZGV4LgorICAgICAgICB0YXNrZGF0YSA9IHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZVsgdGFpbCBdOworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgb2JleXMgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQ6CisgICAgICAgIC8vIG9ubHkgY2hpbGQgb2YgY3VycmVudCB0YXNrIGNhbiBiZSBzY2hlZHVsZWQKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50ID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGttcF9pbnQzMiAgICAgICAgbGV2ZWwgPSBjdXJyZW50LT50ZF9sZXZlbDsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICB3aGlsZSAoIHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+dGRfcGFyZW50OyAgLy8gY2hlY2sgZ2VuZXJhdGlvbiB1cCB0byB0aGUgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChwYXJlbnQgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwYXJlbnQgIT0gY3VycmVudCApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0YWlsIHRhc2sgaXMgbm90IGEgY2hpbGQsIHRoZW4gbm8gb3RoZXIgY2hpbGRzIGNhbiBhcHBlYXIgaW4gdGhlIGRlcXVlICg/KS4KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZHNfZGF0YVt2aWN0aW1fdGlkXS50ZC50ZF90aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfdGFpbCA9IHRhaWw7CisgICAgfQorICAgIGlmICgqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gdW4tbWFyayB0aGlzIHZpY3RpbSBhcyBhIGZpbmlzaGVkIHZpY3RpbS4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorICAgICAgICAvLyByZWxlYXNpbmcgdGhlIGxvY2ssIG9yIGVsc2Ugb3RoZXIgdGhyZWFkcyAoc3RhcnRpbmcgd2l0aCB0aGUgbWFzdGVyIHZpY3RpbSkKKyAgICAgICAgLy8gbWlnaHQgYmUgcHJlbWF0dXJlbHkgcmVsZWFzZWQgZnJvbSB0aGUgYmFycmllciEhIQorICAgICAgICBrbXBfdWludDMyIGNvdW50ID0gS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3N0ZWFsX3Rhc2s6IFQjJWQgaW5jIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZDogdGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50ICsgMSwgdGFza190ZWFtKSApOworCisgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgICB9CisgICAgVENXXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgLSAxKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMyk6IFQjJWQgc3RvbGUgdGFzayAlcCBmcm9tIFQjZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgdGFzayA9IEtNUF9UQVNLREFUQV9UT19UQVNLKCB0YXNrZGF0YSApOworICAgIHJldHVybiB0YXNrOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2V4ZWN1dGVfdGFza3M6IENob29zZSBhbmQgZXhlY3V0ZSB0YXNrcyB1bnRpbCBlaXRoZXIgdGhlIGNvbmRpdGlvbgorLy8gaXMgc3RhdGlzZmllZCAocmV0dXJuIHRydWUpIG9yIHRoZXJlIGFyZSBub25lIGxlZnQgKHJldHVybiBmYWxzZSkuCisvLyBmaW5hbF9zcGluIGlzIFRSVUUgaWYgdGhpcyBpcyB0aGUgc3BpbiBhdCB0aGUgcmVsZWFzZSBiYXJyaWVyLgorLy8gdGhyZWFkX2ZpbmlzaGVkIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0aHJlYWQgaXMgZmluaXNoZWQgZXhlY3V0aW5nIGFsbAorLy8gdGhlIHRhc2tzIGl0IGhhcyBvbiBpdHMgZGVxdWUsIGFuZCBpcyBhdCB0aGUgcmVsZWFzZSBiYXJyaWVyLgorLy8gc3Bpbm5lciBpcyB0aGUgbG9jYXRpb24gb24gd2hpY2ggdG8gc3Bpbi4KKy8vIHNwaW5uZXIgPT0gTlVMTCBtZWFucyBvbmx5IGV4ZWN1dGUgYSBzaW5nbGUgdGFzayBhbmQgcmV0dXJuLgorLy8gY2hlY2tlciBpcyB0aGUgdmFsdWUgdG8gY2hlY2sgdG8gdGVybWluYXRlIHRoZSBzcGluLgorCitpbnQKK19fa21wX2V4ZWN1dGVfdGFza3MoIGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICBrbXBfdWludCBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksCisgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQgKQoreworICAgIGttcF90YXNrX3RlYW1fdCAqICAgICB0YXNrX3RlYW07CisgICAga21wX3RlYW1fdCAqICAgICAgICAgIHRlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgIHRocmVhZHNfZGF0YTsKKyAgICBrbXBfdGFza190ICogICAgICAgICAgdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgY3VycmVudF90YXNrID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICogdW5maW5pc2hlZF90aHJlYWRzOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICBudGhyZWFkcywgbGFzdF9zdG9sZW4sIGssIHRpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkID09IF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworCisgICAgdGFza190ZWFtID0gdGhyZWFkIC0+IHRoLnRoX3Rhc2tfdGVhbTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gIT0gTlVMTCApOworCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhlbnRlcik6IFQjJWQgZmluYWxfc3Bpbj0lZCAqdGhyZWFkX2ZpbmlzaGVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgZmluYWxfc3BpbiwgKnRocmVhZF9maW5pc2hlZCkgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKVRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtIC0+IHR0LnR0X25wcm9jOworICAgIHVuZmluaXNoZWRfdGhyZWFkcyA9ICYodGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoKGludCkqdW5maW5pc2hlZF90aHJlYWRzKSA+PSAwICk7CisKKyAgICAvLyBDaG9vc2UgdGFza3MgZnJvbSBvdXIgb3duIHdvcmsgcXVldWUuCisgICAgc3RhcnQ6CisgICAgd2hpbGUgKCggdGFzayA9IF9fa21wX3JlbW92ZV9teV90YXNrKCB0aHJlYWQsIGd0aWQsIHRhc2tfdGVhbSwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCApIHsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhdCBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgb25seSBwYXJ0d2F5IHRocm91Z2ggdGhlIGJhcnJpZXIgYW5kIHRoZSBjb25kaXRpb24KKyAgICAgICAgLy8gaXMgbWV0LCB0aGVuIHJldHVybiBub3csIHNvIHRoYXQgdGhlIGJhcnJpZXIgZ2F0aGVyL3JlbGVhc2UgcGF0dGVybiBjYW4gcHJvY2VlZC4KKyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgaW4gdGhlIGxhc3Qgc3BpbiBsb29wIGluIHRoZSBiYXJyaWVyLCB3YWl0aW5nIHRvIGJlCisgICAgICAgIC8vIHJlbGVhc2VkLCB3ZSBrbm93IHRoYXQgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3aWxsIG5vdCBiZSBzYXRpc2lmaWVkLAorICAgICAgICAvLyBzbyBkb24ndCB3YXN0ZSBhbnkgY3ljbGVzIGNoZWNraW5nIGl0LgorICAgICAgICBpZiAoKHNwaW5uZXIgPT0gTlVMTCkgfHwgKCghZmluYWxfc3BpbikgJiYgKFRDUl80KCpzcGlubmVyKSA9PSBjaGVja2VyKSkpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZXhpdCAjMSk6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisgICAgfQorCisgICAgLy8gVGhpcyB0aHJlYWQncyB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAgSWYgd2UgYXJlIGluIHRoZSBmaW5hbCBzcGluIGxvb3AKKyAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICBpZiAoZmluYWxfc3BpbikgeworICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGRlYyAjMSk6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZCB0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgLy8gdGgudGhfdGVhbSBmaWVsZCBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgaWYgKChzcGlubmVyICE9IE5VTEwpICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZXhpdCAjMik6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcnkgdG8gc3RlYWwgZnJvbSB0aGUgbGFzdCBwbGFjZSBJIHN0b2xlIGZyb20gc3VjY2Vzc2Z1bGx5LgorICAgIHRpZCA9IHRocmVhZCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZDsvL19fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBsYXN0X3N0b2xlbiA9IHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW47CisKKyAgICBpZiAobGFzdF9zdG9sZW4gIT0gLTEpIHsKKyAgICAgICAga21wX2luZm9fdCAqb3RoZXJfdGhyZWFkID0gdGhyZWFkc19kYXRhW2xhc3Rfc3RvbGVuXS50ZC50ZF90aHI7CisKKyAgICAgICAgd2hpbGUgKCh0YXNrID0gX19rbXBfc3RlYWxfdGFzayggb3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMKQorICAgICAgICB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGhyZWFkIGNhbiBwcm9jZWVkLgorICAgICAgICAgICAgaWYgKChzcGlubmVyID09IE5VTEwpIHx8ICgoIWZpbmFsX3NwaW4pICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhleGl0ICMzKTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLTVBfWUlFTEQoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV90aHJvdWdocHV0ICk7ICAgLy8gWWllbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXh0IHRhc2sKKyAgICAgICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gb2YgdGhlIHN0b2xlbiB0YXNrIHJlc3VsdGVkIGluIG1vcmUgdGFza3MgYmVpbmcKKyAgICAgICAgICAgIC8vIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCB0aGVuIHJlc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgICAgICAgICBpZiAoVENSXzQodGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9udGFza3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzOiBUIyVkIHN0b2xlbiB0YXNrIHNwYXduZWQgb3RoZXIgdGFza3MsIHJlc3RhcnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBnaXZlIHByaW9yaXR5IHRvIHN0ZWFsaW5nIGZyb20gdGhpcyB0aHJlYWQgYW55bW9yZS4KKyAgICAgICAgdGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworCisgICAgICAgIC8vIFRoZSB2aWN0aW1zJ3Mgd29yayBxdWV1ZSBpcyBlbXB0eS4gIElmIHdlIGFyZSBpbiB0aGUgZmluYWwgc3BpbiBsb29wCisgICAgICAgIC8vIG9mIHRoZSBiYXJyaWVyLCBjaGVjayBhbmQgc2VlIGlmIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICAgICAgICBpZiAoZmluYWxfc3BpbikgeworICAgICAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgIC8vIGJlZW4gZG9uZS4gIFRoaXMgZGVjcmVtZW50IG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQKKyAgICAgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgICAgIGlmICghICp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNvdW50ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApIC0gMTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGRlYyAjMik6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtPSVwXG4iLCBndGlkLCBjb3VudCwgdGFza190ZWFtKSApOworICAgICAgICAgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYworICAgICAgICAgICAgLy8gdGhlbiBpdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgICAgICAvLyBEZWNyZW1lbnRpbmcgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgY2FuIGFsbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vIElmIHdlIGNhbiBzdGVhbCBtb3JlIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgICAgICAgaWYgKChzcGlubmVyICE9IE5VTEwpICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzQpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaW5kIGEgZGlmZmVyZW50IHRocmVhZCB0byBzdGVhbCB3b3JrIGZyb20uICBQaWNrIGEgcmFuZG9tIHRocmVhZC4KKyAgICAvLyBNeSBpbml0aWFsIHBsYW4gd2FzIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSB0aHJlYWRzLCBhbmQgb25seSByZXR1cm4KKyAgICAvLyBpZiB3ZSB0cmllZCB0byBzdGVhbCBmcm9tIGV2ZXJ5IHRocmVhZCwgYW5kIGZhaWxlZC4gIEFyY2ggc2F5cyB0aGF0J3MKKyAgICAvLyBub3Qgc3VjaCBhIGdyZWF0IGlkZWEuCisgICAgLy8gR0VIIC0gbmVlZCB5aWVsZCBjb2RlIGluIHRoaXMgbG9vcCBmb3IgdGhyb3VnaHB1dCBsaWJyYXJ5IG1vZGU/CisgICAgbmV3X3ZpY3RpbToKKyAgICBrID0gX19rbXBfZ2V0X3JhbmRvbSggdGhyZWFkICkgJSAobnRocmVhZHMgLSAxKTsKKyAgICBpZiAoIGsgPj0gdGhyZWFkIC0+IHRoLnRoX2luZm8uZHMuZHNfdGlkICkgeworICAgICAgICArK2s7ICAgICAgICAgICAgICAgLy8gQWRqdXN0cyByYW5kb20gZGlzdHJpYnV0aW9uIHRvIGV4Y2x1ZGUgc2VsZgorICAgIH0KKyAgICB7CisgICAgICAgIGttcF9pbmZvX3QgKm90aGVyX3RocmVhZCA9IHRocmVhZHNfZGF0YVtrXS50ZC50ZF90aHI7CisgICAgICAgIGludCBmaXJzdDsKKworICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBjaGFuY2UgdGhhdCBfX2ttcF9lbmFibGVfdGFza2luZygpIGRpZCBub3Qgd2FrZSB1cAorICAgICAgICAvLyBhbGwgdGhyZWFkcyB3YWl0aW5nIGF0IHRoZSBiYXJyaWVyLiAgSWYgdGhpcyB0aHJlYWQgaXMgc2xlZXBpbmcsIHRoZW4KKyAgICAgICAgLy8gdGhlbiB3YWtlIGl0IHVwLiAgU2luY2Ugd2Ugd2VyZWUgZ29pbmcgdG8gcGF5IHRoZSBjYWNoZSBtaXNzIHBlbmFsdHkKKyAgICAgICAgLy8gZm9yIHJlZmVyZW5jZWluZyBhbm90aGVyIHRocmVhZCdzIGttcF9pbmZvX3Qgc3RydWN0IGFueXdheSwgdGhlIGNoZWNrCisgICAgICAgIC8vIHNob3VsZG4ndCBjb3N0IHRvbyBtdWNoIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIC8vIEluIGV4dHJhIGJhcnJpZXIgbW9kZSwgdGFza3MgZG8gbm90IHNsZWVwIGF0IHRoZSBzZXBhcmF0ZSB0YXNraW5nCisgICAgICAgIC8vIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICBpZiAoICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcyApICYmCisgICAgICAgICAgICAgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSAmJgorICAgICAgICAgICAgIChUQ1JfUFRSKG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKSAhPSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfcmVzdW1lKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBvdGhlcl90aHJlYWQgKSwgTlVMTCApOworCisgICAgICAgICAgICAvLyBBIHNsZWVwaW5nIHRocmVhZCBzaG91bGQgbm90IGhhdmUgYW55IHRhc2tzIG9uIGl0J3MgcXVldWUuCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBwb3NzaWJpbGl0eSB0aGF0IGl0IHJlc3VtZXMsIHN0ZWFscyBhIHRhc2sgZnJvbQorICAgICAgICAgICAgLy8gYW5vdGhlciB0aHJlYWQsIHdoaWNoIHNwYXducyBtb3JlIHRhc2tzLCBhbGwgaW4gdGhlIHRoYXQgaXQgdGFrZXMKKyAgICAgICAgICAgIC8vIHRoaXMgdGhyZWFkIHRvIGNoZWNrID0+IGRvbid0IHdyaXRlIGFuIGFzc2VydGlvbiB0aGF0IHRoZSB2aWN0aW0ncworICAgICAgICAgICAgLy8gcXVldWUgaXMgZW1wdHkuICBUcnkgc3RlYWxpbmcgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICAgICAgICBnb3RvIG5ld192aWN0aW07CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdHJ5IHRvIHN0ZWFsIHdvcmsgZnJvbSB0aGUgc2VsZWN0ZWQgdGhyZWFkCisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgd2hpbGUgKCh0YXNrID0gX19rbXBfc3RlYWxfdGFzayggb3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMKQorICAgICAgICB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAgICAgLy8gVHJ5IHN0ZWFsaW5nIGZyb20gdGhpcyB2aWN0aW0gYWdhaW4sIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gazsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyB0aHJlYWQgY2FuIHByb2NlZWQuCisgICAgICAgICAgICBpZiAoKHNwaW5uZXIgPT0gTlVMTCkgfHwgKCghZmluYWxfc3BpbikgJiYgKFRDUl80KCpzcGlubmVyKSA9PSBjaGVja2VyKSkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzUpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfWUlFTEQoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV90aHJvdWdocHV0ICk7ICAgLy8gWWllbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXh0IHRhc2sKKworICAgICAgICAgICAgLy8gSWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3RvbGVuIHRhc2sgcmVzdWx0ZWQgaW4gbW9yZSB0YXNrcyBiZWluZworICAgICAgICAgICAgLy8gcGxhY2VkIG9uIG91ciBydW4gcXVldWUsIHRoZW4gcmVzdGFydCB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGlmIChUQ1JfNCh0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX250YXNrcykgIT0gMCkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3M6IFQjJWQgc3RvbGVuIHRhc2sgc3Bhd25lZCBvdGhlciB0YXNrcywgcmVzdGFydFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgZ290byBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSB2aWN0aW1zJ3Mgd29yayBxdWV1ZSBpcyBlbXB0eS4gIElmIHdlIGFyZSBpbiB0aGUgZmluYWwgc3BpbiBsb29wCisgICAgICAgIC8vIG9mIHRoZSBiYXJyaWVyLCBjaGVjayBhbmQgc2VlIGlmIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICAgICAgICAvLyBHb2luZyBvbiBhbmQgZmluZGluZyBhIG5ldyB2aWN0aW0gdG8gc3RlYWwgZnJvbSBpcyBleHBlbnNpdmUsIGFzIGl0CisgICAgICAgIC8vIGludm9sdmVzIGEgbG90IG9mIGNhY2hlIG1pc3Nlcywgc28gd2UgZGVmaW5pdGVseSB3YW50IHRvIHJlLWNoZWNrIHRoZQorICAgICAgICAvLyB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVmb3JlIGRvaW5nIHRoYXQuCisgICAgICAgIGlmIChmaW5hbF9zcGluKSB7CisgICAgICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgLy8gYmVlbiBkb25lLiAgVGhpcyBkZWNyZW1lbnQgbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZAorICAgICAgICAgICAgLy8gcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAgICAgIGttcF91aW50MzIgY291bnQgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICkgLSAxOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZGVjICMzKTogVCMlZCBkZWMgdW5maW5pc2hlZF90aHJlYWRzIHRvICVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMsCisgICAgICAgICAgICAvLyB0aGVuIGl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgICAgIC8vIERlY3JlbWVudGluZyB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyBjYW4gYWxsb3cgdGhlIG1hc3RlcgorICAgICAgICAgICAgLy8gdGhyZWFkIHRvIHBhc3MgdGhyb3VnaCB0aGUgYmFycmllciwgd2hlcmUgaXQgbWlnaHQgcmVzZXQgZWFjaCB0aHJlYWQncworICAgICAgICAgICAgLy8gdGgudGhfdGVhbSBmaWVsZCBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgLy8gSWYgd2UgY2FuIHN0ZWFsIG1vcmUgd29yaywgd2Uga25vdyB0aGF0IHRoaXMgaGFzIG5vdCBoYXBwZW5lZCB5ZXQuCisgICAgICAgICAgICBpZiAoKHNwaW5uZXIgIT0gTlVMTCkgJiYgKFRDUl80KCpzcGlubmVyKSA9PSBjaGVja2VyKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZXhpdCAjNik6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZXhpdCAjNyk6IFQjJWQgY2FuJ3QgZmluZCB3b3JrXG4iLCBndGlkKSApOworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9lbmFibGVfdGFza2luZzogQWxsb2NhdGUgdGFzayB0ZWFtIGFuZCByZXN1bWUgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUKKy8vIG5leHQgYmFycmllciBzbyB0aGV5IGNhbiBhc3Npc3QgaW4gZXhlY3V0aW5nIGVucXVldWVkIHRhc2tzLgorLy8gRmlyc3QgdGhyZWFkIGluIGFsbG9jYXRlcyB0aGUgdGFzayB0ZWFtIGF0b21pY2FsbHkuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9lbmFibGVfdGFza2luZygga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZHNfZGF0YTsKKyAgICBpbnQgbnRocmVhZHMsIGksIGlzX2luaXRfdGhyZWFkOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhlbnRlcik6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0gIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworCisgICAgbnRocmVhZHMgPSB0YXNrX3RlYW0tPnR0LnR0X25wcm9jOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID09IHRlYW0tPnQudF9ucHJvYyk7CisKKyAgICAvLyBBbGxvY2F0ZSBvciBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgaXNfaW5pdF90aHJlYWQgPSBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCB0aGlzX3RociwgdGFza190ZWFtICk7CisKKyAgICBpZiAoIWlzX2luaXRfdGhyZWFkKSB7CisgICAgICAgIC8vIFNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBhcnJheS4KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZDogdGhyZWFkcyBhcnJheSBhbHJlYWR5IHNldCB1cC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7CisKKyAgICBpZiAoICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcyApICYmCisgICAgICAgICAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgKQorICAgIHsKKyAgICAgICAgLy8gUmVsZWFzZSBhbnkgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUgYmFycmllciwgc28gdGhhdCB0aGV5IGNhbiBzdGVhbAorICAgICAgICAvLyB0YXNrcyBhbmQgZXhlY3V0ZSB0aGVtLiAgSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAKKyAgICAgICAgLy8gYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcgYmFycmllciwgc28gdGhpcyBpc24ndCBhIHByb2JsZW0uCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICB2b2xhdGlsZSBrbXBfdWludCAqc2xlZXBfbG9jOworICAgICAgICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gdGhyZWFkc19kYXRhW2ldLnRkLnRkX3RocjsKKworICAgICAgICAgICAgaWYgKGkgPT0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYXZlbid0IGxvY2tlZCB0aGUgdGhyZWFkJ3Mgc3VzcGVuZCBtdXRleCBsb2NrIGF0IHRoaXMKKyAgICAgICAgICAgIC8vIHBvaW50LCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyB3aGVyZSBhIHRocmVhZCBtaWdodCBiZSBwdXR0aW5nCisgICAgICAgICAgICAvLyBpdHNlbGYgdG8gc2xlZXAsIGJ1dCBoYXNuJ3Qgc2V0IHRoZSB0aF9zbGVlcF9sb2MgZmllbGQgeWV0LgorICAgICAgICAgICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgX19rbXBfZXhlY3V0ZV90YXNrcygpIHBlcmlvZGljYWxseSBjaGVja3MKKyAgICAgICAgICAgIC8vIHNlZSBpZiBvdGhlciB0aHJlYWRzIGFyZSBzbGVlcGluZyAodXNpbmcgdGhlIHNhbWUgcmFuZG9tCisgICAgICAgICAgICAvLyBtZWNoYW5pc20gdGhhdCBpcyB1c2VkIGZvciB0YXNrIHN0ZWFsaW5nKSBhbmQgYXdha2VucyB0aGVtIGlmCisgICAgICAgICAgICAvLyB0aGV5IGFyZS4KKyAgICAgICAgICAgIGlmICggKCBzbGVlcF9sb2MgPSAgKHZvbGF0aWxlIGttcF91aW50ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDUl9QVFIoIHRocmVhZCAtPiB0aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3Jlc3VtZSggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHNsZWVwX2xvYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCBkb24ndCB3YWtlIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZXhpdCk6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMgZm9yICJ0YXNrIHRlYW1zIi4gIEEgdGFzayB0ZWFtIChrbXBfdGFza190KSBpcyBraW5kIG9mCisgKiBsaWtlIGEgc2hhZG93IG9mIHRoZSBrbXBfdGVhbV90IGRhdGEgc3RydWN0LCB3aXRoIGEgZGlmZmVyZW50IGxpZmV0aW1lLgorICogQWZ0ZXIgYSBjaGlsZCAqIHRocmVhZCBjaGVja3MgaW50byBhIGJhcnJpZXIgYW5kIGNhbGxzIF9fa21wX3JlbGVhc2UoKSBmcm9tCisgKiB0aGUgcGFydGljdWxhciB2YXJpYW50IG9mIF9fa21wXzxiYXJyaWVyX2tpbmQ+X2JhcnJpZXJfZ2F0aGVyKCksIGl0IGNhbiBubworICogbG9uZ2VyIGFzc3VtZSB0aGF0IHRoZSBrbXBfdGVhbV90IHN0cnVjdHVyZSBpcyBpbnRhY3QgKGF0IGFueSBtb21lbnQsIHRoZQorICogbWFzdGVyIHRocmVhZCBtYXkgZXhpdCB0aGUgYmFycmllciBjb2RlIGFuZCBmcmVlIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlLAorICogYW5kIHJldHVybiB0aGUgdGhyZWFkcyB0byB0aGUgdGhyZWFkIHBvb2wpLgorICoKKyAqIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIHRoZSB0aGUgdGFza2luZyBjb2RlLCBhcyB0aGUgdGhyZWFkIGlzIHN0aWxsCisgKiBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZXhlY3V0aW9uIG9mIGFueSB0YXNrcyB0aGF0IG1heSBoYXZlIGJlZW4KKyAqIHNwYXduZWQgbXkgYSBtZW1iZXIgb2YgdGhlIHRlYW0sIGFuZCB0aGUgdGhyZWFkIHN0aWxsIG5lZWRzIGFjY2VzcyB0byBhbGwKKyAqIHRvIGVhY2ggdGhyZWFkIGluIHRoZSB0ZWFtLCBzbyB0aGF0IGl0IGNhbiBzdGVhbCB3b3JrIGZyb20gaXQuCisgKgorICogRW50ZXIgdGhlIGV4aXN0ZW5jZSBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdC4gIEl0IGVtcGxveXMgYSByZWZlcmVuY2UKKyAqIGNvdW50aW5nIG1lY2hhbmltcywgYW5kIGlzIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBiZWZvcmUgY2FsbGluZworICogX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSwgYW5kIHRoZW4gaXMgcmVsZWFzZSBieSB0aGUgbGFzdCB0aHJlYWQgdG8KKyAqIGV4aXQgX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSBhdCB0aGUgbmV4dCBiYXJyaWVyLiAgSS5lLiB0aGUgbGlmZXRpbWVzCisgKiBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdHMgZm9yIGNvbnNlY3V0aXZlIGJhcnJpZXJzIGNhbiBvdmVybGFwCisgKiAoYW5kIHdpbGwsIHVubGVzcyB0aGUgbWFzdGVyIHRocmVhZCBpcyB0aGUgbGFzdCB0aHJlYWQgdG8gZXhpdCB0aGUgYmFycmllcgorICogcmVsZWFzZSBwaGFzZSwgd2hpY2ggaXMgbm90IHR5cGljYWwpLgorICoKKyAqIFRoZSBleGlzdGVuY2Ugb2Ygc3VjaCBhIHN0cnVjdCBpcyB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLAorICogYnV0IGZvciBub3csIEknbSB0cnlpbmcgdG8ga2VlcCBpdCBzcGVjaWZpYyB0byB0aGUgT01QXzMwX0VOQUJMRUQgbWFjcm8sCisgKiBzbyB0aGF0IGFueSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyBzaG93IHVwIHdoZW4gY29tcGFyaW5nIHRoZSAyLjUgdnMuIDMuMAorICogbGlicmFyaWVzLgorICoKKyAqIFdlIGN1cnJlbnRseSB1c2UgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdGhyZWFkcyBhcnJheSBhcyBhbiBpbmRpY2F0b3IgdGhhdAorICogdGFza3Mgd2VyZSBzcGF3bmVkIHNpbmNlIHRoZSBsYXN0IGJhcnJpZXIuICBJZiB0aGUgc3RydWN0dXJlIGlzIHRvIGJlCisgKiB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLCB0aGVuIHRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSwgYnV0CisgKiBub3Qgc2V0dHRpbmcgdGhlIGZpZWxkIG1pbmltaXplcyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIHRhc2tpbmcgb24KKyAqIGJhcnJpZXJzLCB3aGVuIG5vIGV4cGxpY2l0IHRhc2tzIHdlcmUgc3Bhd25lZCAocHVzaGVkLCBhY3R1YWxseSkuCisgKi8KKworc3RhdGljIGttcF90YXNrX3RlYW1fdCAqX19rbXBfZnJlZV90YXNrX3RlYW1zID0gTlVMTDsgICAgICAgICAgIC8vIEZyZWUgbGlzdCBmb3IgdGFza190ZWFtIGRhdGEgc3RydWN0dXJlcworLy8gTG9jayBmb3IgdGFzayB0ZWFtIGRhdGEgc3RydWN0dXJlcworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3Rhc2tfdGVhbV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF90YXNrX3RlYW1fbG9jayApOworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9hbGxvY190YXNrX2RlcXVlOgorLy8gQWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZCwgYW5kIGluaXRpYWxpemUgdGhlIG5lY2Vzc2FyeQorLy8gZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0aW5nIHRvIHRoZSBkZXF1ZS4gIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgcGVyIHRocmVhZAorLy8gcGVyIHRhc2sgdGVhbSBzaW5jZSB0YXNrIHRlYW1zIGFyZSByZWN5Y2xlZC4KKy8vIE5vIGxvY2sgaXMgbmVlZGVkIGR1cmluZyBhbGxvY2F0aW9uIHNpbmNlIGVhY2ggdGhyZWFkIGFsbG9jYXRlcyBpdHMgb3duCisvLyBkZXF1ZS4KKworc3RhdGljIHZvaWQKK19fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICk7CisKKyAgICAvLyBJbml0aWFsaXplIGxhc3Qgc3RvbGVuIHRhc2sgZmllbGQgdG8gIm5vbmUiCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2hlYWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPT0gMCApOworCisgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY190YXNrX2RlcXVlOiBUIyVkIGFsbG9jYXRpbmcgZGVxdWVbJWRdIGZvciB0aHJlYWRfZGF0YSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgVEFTS19ERVFVRV9TSVpFLCB0aHJlYWRfZGF0YSApICk7CisgICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHRhc2sgZGVxdWUsIGFuZCB6ZXJvIHRoZSBkZXF1ZQorICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IChrbXBfdGFza2RhdGFfdCAqKikKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBUQVNLX0RFUVVFX1NJWkUgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfZGVxdWU6CisvLyBEZWFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQuCisvLyBIYXBwZW5zIGF0IGxpYnJhcnkgZGVhbGxvY2F0aW9uIHNvIGRvbid0IG5lZWQgdG8gcmVzZXQgYWxsIHRocmVhZCBkYXRhIGZpZWxkcy4KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19kZXF1ZSgga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgIT0gTlVMTCApIHsKKyAgICAgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCAwKTsKKyAgICAgICAgIF9fa21wX2ZyZWUoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlICk7CisgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlIGZvciB0ZF9zdXNwX3RpZWRfdGFza3MKKyAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX3N1c3BfdGllZF90YXNrcy50c19lbnRyaWVzICE9IFRBU0tfU1RBQ0tfRU1QVFkgKSB7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza19zdGFjayggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLCB0aHJlYWRfZGF0YSApOworICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YToKKy8vIEFsbG9jYXRlcyBhIHRocmVhZHNfZGF0YSBhcnJheSBmb3IgYSB0YXNrIHRlYW0sIGVpdGhlciBieSBhbGxvY2F0aW5nIGFuIGluaXRpYWwKKy8vIGFycmF5IG9yIGVubGFyZ2luZyBhbiBleGlzdGluZyBhcnJheS4gIE9ubHkgdGhlIGZpcnN0IHRocmVhZCB0byBnZXQgdGhlIGxvY2sKKy8vIGFsbG9jcyBvciBlbmxhcmdlcyB0aGUgYXJyYXkgYW5kIHJlLWluaXRpYWxpemVzIHRoZSBhcnJheSBlbGVlbW50cy4KKy8vIFRoYXQgdGhyZWFkIHJldHVybnMgIlRSVUUiLCB0aGUgcmVzdCByZXR1cm4gIkZBTFNFIi4KKy8vIEFzc3VtZXMgdGhhdCB0aGUgbmV3IGFycmF5IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X25wcm9jLgorLy8gVGhlIGN1cnJlbnQgc2l6ZSBpcyBnaXZlbiBieSB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMuCisKK3N0YXRpYyBpbnQKK19fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIGttcF90aHJlYWRfZGF0YV90ICoqIHRocmVhZHNfZGF0YV9wOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIG50aHJlYWRzLCBtYXh0aHJlYWRzOworICAgIGludCAgICAgICAgICAgICAgICAgIGlzX2luaXRfdGhyZWFkID0gRkFMU0U7CisKKyAgICBpZiAoIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgKSB7CisgICAgICAgIC8vIEFscmVhZHkgcmVhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgdGhyZWFkc19kYXRhX3AgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGE7CisgICAgbnRocmVhZHMgICA9IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYzsKKyAgICBtYXh0aHJlYWRzID0gdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzOworCisgICAgLy8gQWxsIHRocmVhZHMgbXVzdCBsb2NrIHdoZW4gdGhleSBlbmNvdW50ZXIgdGhlIGZpcnN0IHRhc2sgb2YgdGhlIGltcGxpY2l0IHRhc2sKKyAgICAvLyByZWdpb24gdG8gbWFrZSBzdXJlIHRocmVhZHNfZGF0YSBmaWVsZHMgYXJlIChyZSlpbml0aWFsaXplZCBiZWZvcmUgdXNlZC4KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKworICAgIGlmICggISBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAvLyBmaXJzdCB0aHJlYWQgdG8gZW5hYmxlIHRhc2tpbmcKKyAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRocmVhZCAtPiB0aC50aF90ZWFtOworICAgICAgICBpbnQgaTsKKworICAgICAgICBpc19pbml0X3RocmVhZCA9IFRSVUU7CisgICAgICAgIGlmICggbWF4dGhyZWFkcyA8IG50aHJlYWRzICkgeworCisgICAgICAgICAgICBpZiAoICp0aHJlYWRzX2RhdGFfcCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICpvbGRfZGF0YSA9ICp0aHJlYWRzX2RhdGFfcDsKKyAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqbmV3X2RhdGEgPSBOVUxMOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOiBUIyVkIHJlYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHMgZGF0YSBmb3IgdGFza190ZWFtICVwLCBuZXdfc2l6ZSA9ICVkLCBvbGRfc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRocmVhZHMsIG1heHRocmVhZHMgKSApOworICAgICAgICAgICAgICAgIC8vIFJlYWxsb2NhdGUgdGhyZWFkc19kYXRhIHRvIGhhdmUgbW9yZSBlbGVtZW50cyB0aGFuIGN1cnJlbnQgYXJyYXkKKyAgICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgICAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLiAgTm90ZSBhbGwgbmV3IGFycmF5IGVudHJpZXMgYXJlIGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgLy8gdG8gemVybyBieSBfX2ttcF9hbGxvY2F0ZSgpLgorICAgICAgICAgICAgICAgIG5ld19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIG50aHJlYWRzICogc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSApOworICAgICAgICAgICAgICAgIC8vIGNvcHkgb2xkIGRhdGEgdG8gbmV3IGRhdGEKKyAgICAgICAgICAgICAgICBtZW1jcHkoICh2b2lkICopIG5ld19kYXRhLCAodm9pZCAqKSBvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heHRocmVhZHMgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikgKTsKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEdFSDogRmlndXJlIG91dCBpZiB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworICAgICAgICAgICAgICAgIGZvciAoaSA9IG1heHRocmVhZHM7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdGFza19zdGFjayggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRocmVhZF9kYXRhICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIG5ldyBkYXRhIGFuZCBmcmVlIHRoZSBvbGQgZGF0YQorICAgICAgICAgICAgICAgICgqdGhyZWFkc19kYXRhX3ApID0gbmV3X2RhdGE7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggb2xkX2RhdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIHNpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLCBudGhyZWFkcyApICk7CisgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgaW5pdGlhbCBhbGxvY2F0ZSBmb3IgdGhyZWFkc19kYXRhIGFycmF5LCBhbmQgemVybyBlbnRyaWVzCisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgICAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgICAgICAgICAgICAgICp0aHJlYWRzX2RhdGFfcCA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkgKTsKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcyA9IG50aHJlYWRzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gSWYgYXJyYXkgaGFzIChtb3JlIHRoYW4pIGVub3VnaCBlbGVtZW50cywgZ28gYWhlYWQgYW5kIHVzZSBpdAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKnRocmVhZHNfZGF0YV9wICE9IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhyZWFkc19kYXRhIHBvaW50ZXJzIGJhY2sgdG8gdGhyZWFkX2luZm8gc3RydWN0dXJlcworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX3RociA9IHRlYW0gLT4gdC50X3RocmVhZHNbaV07CisKKyAgICAgICAgICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPj0gbnRocmVhZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBzdG9sZW4gZmllbGQgc3Vydml2ZXMgYWNyb3NzIHRlYW1zIC8gYmFycmllciwgYW5kIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAvLyBvZiB0aHJlYWRzIG1heSBoYXZlIGNoYW5nZWQuICBJdCdzIHBvc3NpYmxlIChsaWtlbHk/KSB0aGF0IGEgbmV3CisgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgcmVnaW9uIHdpbGwgZXhoaWJpdCB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgcHJldmlvdXMgcmVnaW9uLgorICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgVENXX1NZTkNfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIFRSVUUpOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgIHJldHVybiBpc19pbml0X3RocmVhZDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YToKKy8vIERlYWxsb2NhdGVzIGEgdGhyZWFkc19kYXRhIGFycmF5IGZvciBhIHRhc2sgdGVhbSwgaW5jbHVkaW5nIGFueSBhdHRhY2hlZAorLy8gdGFza2luZyBkZXF1ZXMuICBPbmx5IG9jY3VycyBhdCBsaWJyYXJ5IHNodXRkb3duLgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YSgga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgIGlmICggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhc2tfdGVhbS0+dHQudHRfbWF4X3RocmVhZHM7IGkrKyApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza19kZXF1ZSggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhW2ldICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfZnJlZSggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSApOworICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0ZWFtLCB0YWtpbmcgaXQgZnJvbQorLy8gdGhlIGdsb2JhbCB0YXNrIHRlYW0gZnJlZSBsaXN0IGlmIHBvc3NpYmxlLiAgQWxzbyBpbml0aWFsaXplcyBkYXRhIHN0cnVjdHVyZXMuCisKK3N0YXRpYyBrbXBfdGFza190ZWFtX3QgKgorX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gTlVMTDsKKyAgICBpbnQgbnRocmVhZHM7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBlbnRlcmluZzsgdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAodGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSksIHRlYW0gKSApOworCisgICAgaWYgKFRDUl9QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRha2UgYSB0YXNrIHRlYW0gZnJvbSB0aGUgdGFzayB0ZWFtIHBvb2wKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgICAgIGlmIChfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgIT0gTlVMTCkgeworICAgICAgICAgICAgdGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgICAgICAgICAgVENXX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMsIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0KTsKKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAodGFza190ZWFtID09IE5VTEwpIHsKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrIHRlYW0gZm9yIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0ZWFtICkgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBuZXcgdGFzayB0ZWFtIGlmIG9uZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9tYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgICAgICB0YXNrX3RlYW0gPSAoa21wX3Rhc2tfdGVhbV90ICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Rhc2tfdGVhbV90KSApOworICAgICAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhID0gTlVMTDsgICAvLyBBQzogX19rbXBfYWxsb2NhdGUgemVyb2VzIHJldHVybmVkIG1lbW9yeQorICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcyA9IDA7CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworICAgIH0KKworICAgIFRDV180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcywgRkFMU0UpOworICAgIHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYyA9IG50aHJlYWRzID0gdGVhbS0+dC50X25wcm9jOworCisgICAgdGFza190ZWFtIC0+IHR0LnR0X3N0YXRlID0gMDsKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgbnRocmVhZHMgKTsKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X2FjdGl2ZSwgVFJVRSApOworICAgIFRDV180KCB0YXNrX3RlYW0gLT4gdHQudHRfcmVmX2N0LCBudGhyZWFkcyAtIDEpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZXhpdGluZzsgdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICh0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xKSwgdGFza190ZWFtICkgKTsKKyAgICByZXR1cm4gdGFza190ZWFtOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfdGVhbToKKy8vIEZyZWVzIHRoZSB0YXNrIHRlYW0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGhyZWFkLCBhbmQgYWRkcyBpdAorLy8gdG8gdGhlIGdsb2JhbCB0YXNrIHRlYW0gZnJlZSBsaXN0LgorLy8KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza190ZWFtKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2ZyZWVfdGFza190ZWFtOiBUIyVkIHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xLCB0YXNrX3RlYW0gKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X3JlZl9jdCkgPT0gMCApOworCisgICAgLy8gUHV0IHRhc2sgdGVhbSBiYWNrIG9uIGZyZWUgbGlzdAorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID09IE5VTEwgKTsKKyAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IF9fa21wX2ZyZWVfdGFza190ZWFtczsKKyAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyAgICBUQ1dfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcywgdGFza190ZWFtKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfdGFza190ZWFtX2xvY2sgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVhcF90YXNrX3RlYW1zOgorLy8gRnJlZSBhbGwgdGhlIHRhc2sgdGVhbXMgb24gdGhlIHRhc2sgdGVhbSBmcmVlIGxpc3QuCisvLyBTaG91bGQgb25seSBiZSBkb25lIGR1cmluZyBsaWJyYXJ5IHNodXRkb3duLgorLy8gQ2Fubm90IGRvIGFueXRoaW5nIHRoYXQgbmVlZHMgYSB0aHJlYWQgc3RydWN0dXJlIG9yIGd0aWQgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBnb25lLgorCit2b2lkCitfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoIHZvaWQgKQoreworICAgIGttcF90YXNrX3RlYW1fdCAgICp0YXNrX3RlYW07CisKKyAgICBpZiAoIFRDUl9QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMICkgeworICAgICAgICAvLyBGcmVlIGFsbCB0YXNrX3RlYW1zIG9uIHRoZSBmcmVlIGxpc3QKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgICAgIHdoaWxlICggKCB0YXNrX3RlYW0gPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgKSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX3RlYW1zID0gdGFza190ZWFtIC0+IHR0LnR0X25leHQ7CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vIEZyZWUgdGhyZWFkc19kYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YSggdGFza190ZWFtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCB0YXNrX3RlYW0gKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3VucmVmX3Rhc2tfdGVhbXM6CisvLyBSZW1vdmUgb25lIHRocmVhZCBmcm9tIHJlZmVyZW5jaW5nIHRoZSB0YXNrIHRlYW0gc3RydWN0dXJlIGJ5CisvLyBkZWNyZWFzaW5nIHRoZSByZWZlcmVuY2UgY291bnQgYW5kIGRlYWxsb2NhdGUgdGFzayB0ZWFtIGlmIG5vIG1vcmUKKy8vIHJlZmVyZW5jZXMgdG8gaXQuCisvLwordm9pZAorX19rbXBfdW5yZWZfdGFza190ZWFtKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwga21wX2luZm9fdCAqdGhyZWFkICkKK3sKKyAgICBrbXBfdWludCByZWZfY3Q7CisKKyAgICByZWZfY3QgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza190ZWFtLT50dC50dF9yZWZfY3QpICkgLSAxOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF91bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID0gJXAgcmVmX2N0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0YXNrX3RlYW0sIHJlZl9jdCApICk7CisKKworICAgIGlmICggcmVmX2N0ID09IDAgKSB7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza190ZWFtKCB0aHJlYWQsIHRhc2tfdGVhbSApOworICAgIH0KKworICAgIFRDV19QVFIoICooKHZvbGF0aWxlIGttcF90YXNrX3RlYW1fdCAqKikoJnRocmVhZC0+dGgudGhfdGFza190ZWFtKSksIE5VTEwgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zOgorLy8gU29tZSB0aHJlYWRzIGNvdWxkIHN0aWxsIGJlIGluIHRoZSBmb3JrIGJhcnJpZXIgcmVsZWFzZSBjb2RlLCBwb3NzaWJseQorLy8gdHJ5aW5nIHRvIHN0ZWFsIHRhc2tzLiAgV2FpdCBmb3IgZWFjaCB0aHJlYWQgdG8gdW5yZWZlcmVuY2UgaXRzIHRhc2sgdGVhbS4KKy8vCit2b2lkCitfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXModm9pZCkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBpbnQgZG9uZTsKKworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRvbmUgPSBUUlVFOworCisgICAgICAgIC8vIFRPRE86IEdFSCAtIHRoaXMgbWF5IGJlIGlzIHdyb25nIGJlY2F1c2Ugc29tZSBzeW5jIHdvdWxkIGJlIG5lY2Vzc2FyeQorICAgICAgICAvLyAgICAgICAgICAgICBpbiBjYXNlIHRocmVhZHMgYXJlIGFkZGVkIHRvIHRoZSBwb29sIGR1cmluZyB0aGUgdHJhdmVyc2FsLgorICAgICAgICAvLyAgICAgICAgICAgICBOZWVkIHRvIHZlcmlmeSB0aGF0IGxvY2sgZm9yIHRocmVhZCBwb29sIGlzIGhlbGQgd2hlbiBjYWxsaW5nCisgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMgcm91dGluZS4KKyAgICAgICAgZm9yICh0aHJlYWQgPSAoa21wX2luZm9fdCAqKV9fa21wX3RocmVhZF9wb29sOworICAgICAgICAgICAgIHRocmVhZCAhPSBOVUxMOworICAgICAgICAgICAgIHRocmVhZCA9IHRocmVhZC0+dGgudGhfbmV4dF9wb29sKQorICAgICAgICB7CisgICAgICAgICAgICB2b2xhdGlsZSBrbXBfdWludCAqc2xlZXBfbG9jOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBEV09SRCBleGl0X3ZhbDsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBUQ1JfUFRSKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPT0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIC8vIFRPRE86IEdFSCAtIGFkZCB0aGlzIGNoZWNrIGZvciBMaW51eCogT1MgLyBPUyBYKiBhcyB3ZWxsPworICAgICAgICAgICAgaWYgKCFfX2ttcF9pc190aHJlYWRfYWxpdmUodGhyZWFkLCAmZXhpdF92YWwpKSB7CisgICAgICAgICAgICAgICAgaWYgKFRDUl9QVFIodGhyZWFkLT50aC50aF90YXNrX3RlYW0pICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdW5yZWZfdGFza190ZWFtKCB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSwgdGhyZWFkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsgIC8vIEJlY2F1c2UgdGhfdGFza190ZWFtIHBvaW50ZXIgaXMgbm90IE5VTEwgZm9yIHRoaXMgdGhyZWFkCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogV2FpdGluZyBmb3IgVCMlZCB0byB1bnJlZmVyZW5jZSB0YXNrX3RlYW1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpcyBzbGVlcGluZywgYXdha2VuIGl0LgorICAgICAgICAgICAgICAgIGlmICggKCBzbGVlcF9sb2MgPSAodm9sYXRpbGUga21wX3VpbnQgKikgVENSX1BUUiggdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZXN1bWUoIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCBzbGVlcF9sb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAvLyBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIGxpYnJhcnkgbW9kZSBpcyB0aHJvdWdocHV0KSwgeWllbGQuCisgICAgICAgIC8vIFBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgIC8vIFlpZWxkcyBvbmx5IGlmIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKKyAgICB9CisKKworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fc2V0dXA6ICBDcmVhdGUgYSB0YXNrX3RlYW0gZm9yIHRoZSBjdXJyZW50IHRlYW0sIGJ1dCB1c2UKKy8vIGFuIGFscmVhZHkgY3JlYXRlZCwgdW51c2VkIG9uZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBieSBhbnkgdGhyZWFkLCBidXQgb25seSBmb3IgdGVhbXMgd2l0aCAjIHRocmVhZHMgPjEuCisKK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV9zZXR1cCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICBpZiAoICggdGVhbS0+dC50X3Rhc2tfdGVhbSA9PSBOVUxMICkgJiYgKCB0ZWFtLT50LnRfbnByb2MgPiAxICkgKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHRhc2sgdGVhbSwgd2hpY2ggd2lsbCBiZSBwcm9wYWdhdGVkIHRvCisgICAgICAgIC8vIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMgYWZ0ZXIgdGhlIGJhcnJpZXIuICBBcyB0aGV5CisgICAgICAgIC8vIHNwaW4gaW4gdGhlIGJhcnJpZXIgcmVsZWFzZSBwaGFzZSwgdGhlbiB3aWxsIGNvbnRpbnVlCisgICAgICAgIC8vIHRvIHVzZSB0aGUgcHJldmlvdXMgdGFzayB0ZWFtIHN0cnVjdCwgdW50aWwgdGhleSByZWNlaXZlCisgICAgICAgIC8vIHRoZSBzaWduYWwgdG8gc3RvcCBjaGVja2luZyBmb3IgdGFza3MgKHRoZXkgY2FuJ3Qgc2FmZWx5CisgICAgICAgIC8vIHJlZmVyZW5jZSB0aGUga21wX3RlYW1fdCBzdHJ1Y3QsIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkCisgICAgICAgIC8vIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkKS4KKyAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSA9IF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIGNyZWF0ZWQgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrX3RlYW0gJXAgZm9yIHRlYW0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0ZWFtLT50LnRfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gQWxsIHRocmVhZHMgaGF2ZSByZXBvcnRlZCBpbiwgYW5kIG5vIHRhc2tzIHdlcmUgc3Bhd25lZAorICAgICAgICAvLyBmb3IgdGhpcyByZWxlYXNlLT5nYXRoZXIgcmVnaW9uLiAgTGVhdmUgdGhlIG9sZCB0YXNrCisgICAgICAgIC8vIHRlYW0gc3RydWN0IGluIHBsYWNlIGZvciB0aGUgdXBjb21pbmcgcmVnaW9uLiAgTm8gdGFzaworICAgICAgICAvLyB0ZWFtcyBhcmUgZm9ybWVkIGZvciBzZXJpYWxpemVkIHRlYW1zLgorICAgIH0KKyAgICBpZiAoIHRlYW0tPnQudF90YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgLy8gVG9nZ2xlIHRoZSBzdGF0ZSBmbGFnIHNvIHRoYXQgd2UgY2FuIHRlbGwgd2hpY2ggc2lkZSBvZgorICAgICAgICAvLyB0aGUgYmFycmllciB3ZSBhcmUgb24uCisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW0tPnR0LnR0X3N0YXRlID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3N5bmM6IFByb3BhZ2F0aW9uIG9mIHRhc2sgdGVhbSBkYXRhIGZyb20gdGVhbSB0byB0aHJlYWRzCisvLyB3aGljaCBoYXBwZW5zIGp1c3QgYWZ0ZXIgdGhlIHJlbGVhc2UgcGhhc2Ugb2YgYSB0ZWFtIGJhcnJpZXIuICBUaGlzIG1heSBiZQorLy8gY2FsbGVkIGJ5IGFueSB0aHJlYWQsIGJ1dCBvbmx5IGZvciB0ZWFtcyB3aXRoICMgdGhyZWFkcyA+IDEuCisKK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV9zeW5jKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIC8vIE9uIHRoZSByYXJlIGNoYW5jZSB0aGF0IHRoaXMgdGhyZWFkIG5ldmVyIHNhdyB0aGF0IHRoZSB0YXNrCisgICAgLy8gdGVhbSB3YXMgbm8gbG9uZ2VyIGFjdGl2ZSwgdGhlbiB1bnJlZi9kZWFsbG9jYXRlIGl0IG5vdy4KKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCAhIFRDUl9TWU5DXzQoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSApICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISBLTVBfTUFTVEVSX1RJRCggX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICkgKTsKKyAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgcmUtdXNpbmcgYSB0YXNrIHRlYW0gdGhhdCB3YXMgbmV2ZXIgZW5hYmxlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRlYW0tPnQudF90YXNrX3RlYW0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSXQgaXMgbm93IHNhZmUgdG8gcHJvcGFnYXRlIHRoZSB0YXNrIHRlYW0gcG9pbnRlciBmcm9tIHRoZQorICAgIC8vIHRlYW0gc3RydWN0IHRvIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGVhbS0+dC50X3Rhc2tfdGVhbSk7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRvZ2dsZSB0aGUgdGhfdGFza19zdGF0ZSBmaWVsZCwgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20KKyAgICAgICAgLy8gdGhlIHRhc2sgdGVhbS4gIFJlYWRpbmcgdGhlIHR0X3N0YXRlIGZpZWxkIGF0IHRoaXMgcG9pbnQKKyAgICAgICAgLy8gY2F1c2VzIGEgMzAlIHJlZ3Jlc3Npb24gb24gRVBDQyBwYXJhbGxlbCAtIHRvZ2dsaW5nIGl0CisgICAgICAgIC8vIGlzIG11Y2ggY2hlYXBlci4KKyAgICAgICAgLy8KKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUgPSAxIC0gdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID09IFRDUl80KHRlYW0tPnQudF90YXNrX3RlYW0tPnR0LnR0X3N0YXRlKSApOworICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3Rhc2tfdGVhbV9zeW5jOiBUaHJlYWQgVCMlZCB0YXNrIHRlYW0gYXNzaWduZWQgcG9pbnRlciAoJXApIGZyb20gVGVhbSAjJWQgdGFzayB0ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCAmdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgKCh0ZWFtICE9IE5VTEwpID8gKHRlYW0tPnQudF9pZCkgOiAtMSkgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIHRocmVhZCB3YWl0cyBmb3Igb3V0c3RhbmRpbmcgdGFza3MgYWZ0ZXIKKy8vIHRoZSBiYXJyaWVyIGdhdGhlciBwaGFzZS4gIE9ubHkgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgaWYgI3RocmVhZHMKKy8vIGluIHRlYW0gPiAxICEKKwordm9pZAorX19rbXBfdGFza190ZWFtX3dhaXQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0KKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICk7CisKKyAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBLTVBfVEFTS0lOR19FTkFCTEVEKCB0YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlICkgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciBUIyVkIHdhaXRpbmcgZm9yIGFsbCB0YXNrczogdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRhc2tfdGVhbSApICk7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbCB3b3JrZXIgdGhyZWFkcyBtaWdodCBoYXZlIGRyb3BwZWQgdGhyb3VnaCB0byB0aGUKKyAgICAgICAgLy8gcmVsZWFzZSBwaGFzZSwgYnV0IGNvdWxkIHN0aWxsIGJlIGV4ZWN1dGluZyB0YXNrcy4KKyAgICAgICAgLy8gV2FpdCBoZXJlIGZvciBhbGwgdGFza3MgdG8gY29tcGxldGUuICBUbyBhdm9pZCBtZW1vcnkKKyAgICAgICAgLy8gY29udGVudGlvbiwgb25seSB0aGUgbWFzdGVyIHRocmVhZCBjaGVja3MgZm9yIHRoZQorICAgICAgICAvLyB0ZXJtaW5hdGlvbiBjb25kaXRpb24uCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3dhaXRfc2xlZXAoIHRoaXNfdGhyLCAmdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIDAsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEtpbGwgdGhlIG9sZCB0YXNrIHRlYW0sIHNvIHRoYXQgdGhlIHdvcmtlciB0aHJlYWRzIHdpbGwKKyAgICAgICAgLy8gc3RvcCByZWZlcmVuY2luZyBpdCB3aGlsZSBzcGlubmluZy4gIFRoZXkgd2lsbAorICAgICAgICAvLyBkZWFsbG9jYXRlIGl0IHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCisgICAgICAgIC8vIFRoZSBtYXN0ZXIgdGhyZWFkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVmIGNvdW50LgorICAgICAgICAvLworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0YXNrX3RlYW0gKSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID4gMSApOworICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNraW5nX2JhcnJpZXI6CisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBleGVjdXRlIGFsbCB0YXNrcyBwcmlvciB0byBhIHJlZ3VsYXIgYmFycmllciBvciBhCisvLyBqb2luIGJhcnJpZXIuICBJdCBpcyBhIGZ1bGwgYmFycmllciBpdHNlbGYsIHdoaWNoIHVuZm9ydHVuYXRlbHkgdHVybnMKKy8vIHJlZ3VsYXIgYmFycmllcnMgaW50byBkb3VibGUgYmFycmllcnMgYW5kIGpvaW4gYmFycmllcnMgaW50byAxIDEvMgorLy8gYmFycmllcnMuCisvLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgY2FsbGVkIHdoZW4gX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllci4KKwordm9pZAorX19rbXBfdGFza2luZ19iYXJyaWVyKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkICkKK3sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluID0gJnRlYW0tPnQudF90YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgICBpbnQgZmxhZyA9IEZBTFNFOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBzcGluLCAoa21wX3VpbnQzMiopIE5VTEwgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgd2hpbGUgKCEgX19rbXBfZXhlY3V0ZV90YXNrcyggdGhyZWFkLCBndGlkLCBzcGluLCAwLCBUUlVFLCAmZmxhZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSwgMCApICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gVE9ETzogV2hhdCBhYm91dCBpdHRfc3luY19vYmo/PworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKQorICAgICAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAvLyBHSDogV2UgYWx3YXlzIHlpZWxkIGhlcmUKKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCAodm9pZCopIHNwaW4gKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3Rhc2txLmMgYi9yYzEvcnVudGltZS9zcmMva21wX3Rhc2txLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliYTNmMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdGFza3EuYwpAQCAtMCwwICsxLDIwNTEgQEAKKy8qCisgKiBrbXBfdGFza3EuYyAtLSBUQVNLUSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQyNTgyICQKKyAqICREYXRlOiAyMDEzLTA4LTA5IDA2OjMwOjIyIC0wNTAwIChGcmksIDA5IEF1ZyAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3Egcm91dGluZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisjZGVmaW5lIEtNUF9ERUJVR19SRUZfQ1RTKHgpICAgIEtGX1RSQUNFKDEsIHgpOworCisjZGVmaW5lIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY19kZWxheSggaW50IGFyZyApCit7CisvKiBXb3JrIGFyb3VuZCB3ZWlyZCBjb2RlLWdlbiBidWcgdGhhdCBjYXVzZXMgYXNzZXJ0IHRvIHRyaXAgKi8KKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgS01QX09TX0xJTlVYCisgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyNlbHNlCisgICAgS01QX0FTU0VSVCggYXJnID49IDAgKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX3lpZWxkKCBpbnQgYXJnICkKK3sKKyAgICBfX2ttcF95aWVsZCggYXJnICk7Cit9CisKK3N0YXRpYyBpbnQKK2luX3BhcmFsbGVsX2NvbnRleHQoIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIHJldHVybiAhIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9lbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgZ3RpZCA9ICpndGlkX3JlZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgICAgICAgc3BpbnM7CisgICAga21wX3VpbnQzMiAgICAgICAgIG15X3Rva2VuOworICAgIGttcGNfdGFza19xdWV1ZV90ICp0YXNrcTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHEgICA9ICYgX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmLCBOVUxMICk7CisKKyAgICBpZiAoICEgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogR0VIIC0gbmVlZCBjaGVjayBoZXJlIHVuZGVyIHN0YXRzIHRvIG1ha2Ugc3VyZSAgICovCisgICAgICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rWyp0aWRfcmVmXSAhPSBOVUxMKSAqLworCisgICAgICAgIG15X3Rva2VuID10cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aF90YXNrbnVtOworCisgICAgICAgIHRhc2txID0gdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZTsKKworICAgICAgICBLTVBfV0FJVF9ZSUVMRCgmdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZywgbXlfdG9rZW4sIEtNUF9FUSwgTlVMTCk7CisgICAgICAgIEtNUF9NQigpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX3hvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCAgICAgICAgICAgZ3RpZCA9ICpndGlkX3JlZjsKKyAgICBpbnQgICAgICAgICAgIHRpZCAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3VpbnQzMiAgICBteV90b2tlbjsKKyAgICBrbXBfdGFza3FfdCAgKnRxICAgPSAmIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmICk7CisKKyAgICBpZiAoICEgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogR0VIIC0gbmVlZCBjaGVjayBoZXJlIHVuZGVyIHN0YXRzIHRvIG1ha2Ugc3VyZSAqLworICAgICAgICAvKiAgICAgICBpbnNpZGUgdGFzayAoY3Vycl90aHVua1t0aWRdICE9IE5VTEwpICAgICovCisKKyAgICAgICAgbXlfdG9rZW4gPSB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPnRoX3Rhc2tudW07CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZSAtPiB0cV90YXNrbnVtX3NlcnZpbmcgPSBteV90b2tlbiArIDE7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfY2hlY2tfb3JkZXJlZCgga21wX2ludDMyIGd0aWQsIGttcGNfdGh1bmtfdCAqdGh1bmsgKQoreworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAga21wX3VpbnQzMiBteV90b2tlbjsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdGFza3E7CisKKyAgICAvKiBhc3N1bWUgd2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBhbiBhY3RpdmUgcGFyYWxsZWwgY29udGV4dCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBteV90b2tlbiA9ICB0aHVuayAtPiB0aF90YXNrbnVtOworCisgICAgdGFza3EgPSAgdGh1bmsgLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZTsKKworICAgIGlmKHRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcgPD0gbXlfdG9rZW4pIHsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcsIG15X3Rva2VuLCBLTVBfR0UsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsxOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX1RRRihrbXBfaW50MzIgZmxhZ3MpCit7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX09SREVSRUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiT1JERVJFRCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTEFTVFBSSVZBVEUpCisgICAgICAgIF9fa21wX3ByaW50ZigiTEFTVF9QUklWICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19OT1dBSVQpCisgICAgICAgIF9fa21wX3ByaW50ZigiTk9XQUlUICIpOworICAgIGlmIChmbGFncyAmIFRRRl9IRVVSSVNUSUNTKQorICAgICAgICBfX2ttcF9wcmludGYoIkhFVVJJU1QgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDEpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMSAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMikKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYyICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjMgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDQpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWNCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKQorICAgICAgICBfX2ttcF9wcmludGYoIkxBU1RfVEFTSyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJUQVNLUV9UQVNLICIpOworICAgIGlmIChmbGFncyAmIFRRRl9SRUxFQVNFX1dPUktFUlMpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVMRUFTRSAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJBTExfUVVFVUVEICIpOworICAgIGlmIChmbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKQorICAgICAgICBfX2ttcF9wcmludGYoIlBBUkFMTEVMICIpOworICAgIGlmIChmbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJERUFMTE9DICIpOworICAgIGlmICghKGZsYWdzICYgKFRRRl9JTlRFUk5BTF9GTEFHU3xUUUZfSU5URVJGQUNFX0ZMQUdTKSkpCisgICAgICAgIF9fa21wX3ByaW50ZigiKE5PTkUpIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3RodW5rKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworCisgICAgX19rbXBfcHJpbnRmKCJcdFRodW5rIGF0ICVwIG9uICglZCk6ICAiLCB0aHVuaywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAodGh1bmsgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rW2ldID09IHRodW5rICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiWyVpXSAiLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9wcmludGYoInRoX3NoYXJlZHM9JXAsICIsIHRodW5rLT50aC50aF9zaGFyZWRzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrPSVwLCAiLCB0aHVuay0+dGhfdGFzayk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfZW5jbF90aHVuaz0lcCwgIiwgdGh1bmstPnRoX2VuY2xfdGh1bmspOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3N0YXR1cz0lZCwgIiwgdGh1bmstPnRoX3N0YXR1cyk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfdGFza251bT0ldSwgIiwgdGh1bmstPnRoX3Rhc2tudW0pOworICAgICAgICBfX2ttcF9wcmludGYoInRoX2ZsYWdzPSIpOyBfX2ttcF9kdW1wX1RRRih0aHVuay0+dGhfZmxhZ3MpOworICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGh1bmtfc3RhY2soa21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHRocmVhZF9udW0pCit7CisgICAga21wY190aHVua190ICp0aDsKKworICAgIF9fa21wX3ByaW50ZigiICAgIFRodW5rIHN0YWNrIGZvciBUIyVkOiAgIiwgdGhyZWFkX251bSk7CisKKyAgICBmb3IgKHRoID0gdGh1bms7IHRoICE9IE5VTEw7IHRoID0gdGgtPnRoX2VuY2xfdGh1bmsgKQorICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRoKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGFza19xdWV1ZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBxcywgY291bnQsIGk7CisgICAga21wY190aHVua190ICAgICAgICAqdGh1bms7CisgICAga21wY190YXNrX3F1ZXVlX3QgICAqdGFza3E7CisKKyAgICBfX2ttcF9wcmludGYoIlRhc2sgUXVldWUgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKTsKKworICAgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpbl9wYXJhbGxlbCA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2xvYyAgICAgICAgICAgICA6ICIpOworICAgIH0KKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisKKyAgICAgICAgICAgIC8vaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcGFyZW50ICAgICAgICAgIDogJXBcbiIsIHF1ZXVlLT50cS50cV9wYXJlbnQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZmlyc3RfY2hpbGQgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9maXJzdF9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uZXh0X2NoaWxkICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX25leHRfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcHJldl9jaGlsZCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9wcmV2X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3JlZl9jb3VudCAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKworICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL2lmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IDApCisgICAgICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3NoYXJlZHMgICAgICAgICA6ICIpOworICAgICAgICBmb3IgKGk9MDsgaTwoKHF1ZXVlID09IHRxLT50cV9yb290KSA/IHF1ZXVlLT50cV9ucHJvYyA6IDEpOyBpKyspCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHF1ZXVlLT50cV9zaGFyZWRzW2ldLmFpX2RhdGEpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3F1ZXVpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZyk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3NlcnZpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9xdWV1ZSAgICAgICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3F1ZXVlKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGh1bmtfc3BhY2UgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90aHVua19zcGFjZSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2txX3Nsb3QgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfdGFza3Ffc2xvdCk7CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZnJlZV90aHVua3MgICAgIDogIik7CisgICAgICAgIGZvciAodGh1bmsgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rID0gdGh1bmstPnRoLnRoX25leHRfZnJlZSApCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRodW5rKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25zbG90cyAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfbnNsb3RzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGVhZCAgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oZWFkKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFpbCAgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV90YWlsKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbmZ1bGwgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9uZnVsbCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2hpd2F0ICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfaGl3YXQpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9mbGFncyAgICAgICAgICAgOiAiKTsgX19rbXBfZHVtcF9UUUYocXVldWUtPnRxX2ZsYWdzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGhfdGh1bmtzICAgICAgIDogIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVkICIsIHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFF1ZXVlIHNsb3RzOlxuIik7CisKKworICAgICAgICBxcyA9IHF1ZXVlLT50cV90YWlsOworICAgICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgcXVldWUtPnRxX25mdWxsOyArK2NvdW50ICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIoJWQpIiwgcXMpOworICAgICAgICAgICAgX19rbXBfZHVtcF90aHVuayggdHEsIHF1ZXVlLT50cV9xdWV1ZVtxc10ucXNfdGh1bmssIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIHFzID0gKHFzKzEpICUgcXVldWUtPnRxX25zbG90czsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgVGFza1Egc2xvdDpcbiIpOworICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfdGh1bmsoIHRxLCAoa21wY190aHVua190ICopIHF1ZXVlLT50cV90YXNrcV9zbG90LCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIiAgICBUYXNrcSBmcmVlbGlzdDogIik7CisKKyAgICAvL19fa21wX2FjcXVpcmVfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBmb3IoIHRhc2txID0gdHEtPnRxX2ZyZWVsaXN0OyB0YXNrcSAhPSBOVUxMOyB0YXNrcSA9IHRhc2txLT50cS50cV9uZXh0X2ZyZWUgKQorICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRhc2txKTsKKworICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG5cbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlLCBrbXBfaW50MzIgbGV2ZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgaSwgY291bnQsIHFzOworICAgIGludCBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIF9fa21wX3ByaW50ZigiICAgICIpOworCisgICAgZm9yIChpPTA7IGk8bGV2ZWw7IGkrKykKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICIpOworCisgICAgX19rbXBfcHJpbnRmKCIlcCIsIGN1cnJfcXVldWUpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rW2ldICYmIHRxLT50cV9jdXJyX3RodW5rW2ldLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSA9PSBjdXJyX3F1ZXVlICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgWyVpXSIsIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCI6Iik7CisKKyAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBxcyA9IGN1cnJfcXVldWUtPnRxX3RhaWw7CisKKyAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgY3Vycl9xdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgY3Vycl9xdWV1ZS0+dHFfcXVldWVbcXNdLnFzX3RodW5rKTsKKyAgICAgICAgIHFzID0gKHFzKzEpICUgY3Vycl9xdWV1ZS0+dHFfbnNsb3RzOworICAgIH0KKworICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCkgeworICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCkgeworICAgICAgICAgICAgZm9yKHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgICAgICAgICAgcXVldWUgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgcXVldWUsIGxldmVsKzEsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICp0cXJvb3QsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX3ByaW50ZigiVGFza1EgVHJlZSBhdCByb290ICVwIG9uICglZCk6XG4iLCB0cXJvb3QsIGdsb2JhbF90aWQpOworCisgICAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHFyb290LCAwLCBnbG9iYWxfdGlkICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICAgIE5ldyB0YXNrcSBzdG9yYWdlIHJvdXRpbmVzIHRoYXQgdHJ5IHRvIG1pbmltaXplIG92ZXJoZWFkIG9mIG1hbGxvY3MgYnV0CisgICAgc3RpbGwgcHJvdmlkZSBjYWNoZSBsaW5lIGFsaWdubWVudC4KKyovCisKKworc3RhdGljIHZvaWQgKgorX19rbXBfdGFza3FfYWxsb2NhdGUoc2l6ZV90IHNpemUsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIHZvaWQgKmFkZHIsICpvcmlnX2FkZHI7CisgICAgc2l6ZV90IGJ5dGVzOworCisgICAgS0JfVFJBQ0UoIDUsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6IGNhbGxlZCBzaXplPSVkLCBndGlkPSVkXG4iLCAoaW50KSBzaXplLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGJ5dGVzID0gc2l6ZW9mKHZvaWQgKikgKyBDQUNIRV9MSU5FICsgc2l6ZTsKKworI2lmZGVmIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKyAgICBvcmlnX2FkZHIgPSAodm9pZCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGdsb2JhbF90aWQpLCBieXRlcyApOworI2Vsc2UKKyAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIE1BTExPQyggJWQgKVxuIiwgYnl0ZXMgKSApOworICAgIG9yaWdfYWRkciA9ICh2b2lkICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ5dGVzICk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworCisgICAgaWYgKG9yaWdfYWRkciA9PSAwKQorICAgICAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworCisgICAgYWRkciA9IG9yaWdfYWRkcjsKKworICAgIGlmICgoKGttcF91aW50cHRyX3QpIGFkZHIgJiAoIENBQ0hFX0xJTkUgLSAxICkpICE9IDApIHsKKyAgICAgICAgS0JfVFJBQ0UoIDUwLCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiAgYWRqdXN0IGZvciBjYWNoZSBhbGlnbm1lbnRcbiIgKSApOworICAgICAgICBhZGRyID0gKHZvaWQgKikgKCgoa21wX3VpbnRwdHJfdCkgYWRkciArIENBQ0hFX0xJTkUpICYgfiggQ0FDSEVfTElORSAtIDEgKSk7CisgICAgfQorCisgICAgKCogKHZvaWQgKiopIGFkZHIpID0gb3JpZ19hZGRyOworCisgICAgS0JfVFJBQ0UoIDEwLCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiAgYWxsb2NhdGU6ICVwLCB1c2U6ICVwIC0gJXAsIHNpemU6ICVkLCBndGlkOiAlZFxuIiwKKyAgICAgICAgICAgICBvcmlnX2FkZHIsICgodm9pZCAqKikgYWRkcikgKyAxLCAoKGNoYXIgKikoKCh2b2lkICoqKSBhZGRyKSArIDEpKSArIHNpemUtMSwKKyAgICAgICAgICAgICAoaW50KSBzaXplLCBnbG9iYWxfdGlkICkpOworCisgICAgcmV0dXJuICggKCh2b2lkICoqKSBhZGRyKSArIDEgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wY190YXNrcV9mcmVlKHZvaWQgKnAsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtCX1RSQUNFKCA1LCAoIl9fa21wY190YXNrcV9mcmVlOiBjYWxsZWQgYWRkcj0lcCwgZ3RpZD0lZFxuIiwgcCwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLQl9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza3FfZnJlZTogIGZyZWVpbmc6ICVwLCBndGlkOiAlZFxuIiwgKCooICgodm9pZCAqKikgcCktMSkpLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorICAgIF9fa21wX3RocmVhZF9mcmVlKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGdsb2JhbF90aWQpLCAqKCAoKHZvaWQgKiopIHApLTEpICk7CisjZWxzZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAqKCAoKHZvaWQgKiopIHApLTEpICk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqICAgICAgS2VlcCBmcmVlZCBrbXBjX3Rhc2tfcXVldWVfdCBvbiBhbiBpbnRlcm5hbCBmcmVlbGlzdCBhbmQgcmVjeWNsZSBzaW5jZQorICogICAgICB0aGV5J3JlIG9mIGNvbnN0YW50IHNpemUuCisgKi8KKworc3RhdGljIGttcGNfdGFza19xdWV1ZV90ICoKK19fa21wX2FsbG9jX3Rhc2txICgga21wX3Rhc2txX3QgKnRxLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBuc2xvdHMsIGttcF9pbnQzMiBudGh1bmtzLAorICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnNoYXJlZHMsIGttcF9pbnQzMiBucHJvYywgc2l6ZV90IHNpemVvZl90aHVuaywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9zaGFyZWRzLCBrbXBjX3RodW5rX3QgKipuZXdfdGFza3FfdGh1bmssIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICBpOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgICAgICAgICpuZXdfcXVldWU7CisgICAga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKnNoYXJlZF92YXJfYXJyYXk7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnNoYXJlZF92YXJfc3RvcmFnZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqcHQ7IC8qIGZvciBkb2luZyBieXRlLWFkanVzdGVkIGFkZHJlc3MgY29tcHV0YXRpb25zICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgaWYoIHRxLT50cV9mcmVlbGlzdCApIHsKKyAgICAgICAgbmV3X3F1ZXVlID0gIHRxIC0+IHRxX2ZyZWVsaXN0OworICAgICAgICB0cSAtPiB0cV9mcmVlbGlzdCA9ICB0cSAtPiB0cV9mcmVlbGlzdCAtPiB0cS50cV9uZXh0X2ZyZWU7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKTsKKworICAgICAgICBuZXdfcXVldWUtPnRxX2ZsYWdzID0gMDsKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgICAgICBuZXdfcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKHNpemVvZiAoa21wY190YXNrX3F1ZXVlX3QpLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyA9IDA7CisgICAgfQorCisgICAgLyogIHNwYWNlIGluIHRoZSB0YXNrIHF1ZXVlIGZvciBxdWV1ZSBzbG90cyAoYWxsb2NhdGUgYXMgb25lIGJpZyBjaHVuayAqLworICAgIC8qIG9mIHN0b3JhZ2UgaW5jbHVkaW5nIG5ld190YXNrcV90YXNrIHNwYWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHNpemVvZl90aHVuayArPSAoQ0FDSEVfTElORSAtIChzaXplb2ZfdGh1bmsgJSBDQUNIRV9MSU5FKSk7ICAgICAgICAgLyogcGFkIHRvIGNhY2hlIGxpbmUgc2l6ZSAqLworICAgIHB0ID0gKGNoYXIgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKG50aHVua3MgKiBzaXplb2ZfdGh1bmssIGdsb2JhbF90aWQpOworICAgIG5ld19xdWV1ZS0+dHFfdGh1bmtfc3BhY2UgPSAoa21wY190aHVua190ICopcHQ7CisgICAgKm5ld190YXNrcV90aHVuayA9IChrbXBjX3RodW5rX3QgKikocHQgKyAobnRodW5rcyAtIDEpICogc2l6ZW9mX3RodW5rKTsKKworICAgIC8qICBjaGFpbiB0aGUgYWxsb2NhdGVkIHRodW5rcyBpbnRvIGEgZnJlZWxpc3QgZm9yIHRoaXMgcXVldWUgICovCisKKyAgICBuZXdfcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gKGttcGNfdGh1bmtfdCAqKXB0OworCisgICAgZm9yIChpID0gMDsgaSA8IChudGh1bmtzIC0gMik7IGkrKykgeworICAgICAgICAoKGttcGNfdGh1bmtfdCAqKShwdCtpKnNpemVvZl90aHVuaykpLT50aC50aF9uZXh0X2ZyZWUgPSAoa21wY190aHVua190ICopKHB0ICsgKGkrMSkqc2l6ZW9mX3RodW5rKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgKChrbXBjX3RodW5rX3QgKikocHQraSpzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKyAgICB9CisKKyAgICAoKGttcGNfdGh1bmtfdCAqKShwdCsobnRodW5rcy0yKSpzaXplb2ZfdGh1bmspKS0+dGgudGhfbmV4dF9mcmVlID0gTlVMTDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAoKGttcGNfdGh1bmtfdCAqKShwdCsobnRodW5rcy0yKSpzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGxvY2tzICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIG5ld19xdWV1ZS0+dHFfbGlua19sY2sgKTsKKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIG5ld19xdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrICk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX3F1ZXVlX2xjayApOworICAgIH0KKworICAgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgc2xvdHMgKi8KKworICAgIGJ5dGVzID0gbnNsb3RzICogc2l6ZW9mIChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90KTsKKyAgICBuZXdfcXVldWUtPnRxX3F1ZXVlID0gKGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUoIGJ5dGVzLCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiAgc3BhY2UgZm9yIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZSBzdHJ1Y3R1cmVzICovCisgICAgc2l6ZW9mX3NoYXJlZHMgKz0gc2l6ZW9mKGttcGNfdGFza19xdWV1ZV90ICopOworICAgIHNpemVvZl9zaGFyZWRzICs9IChDQUNIRV9MSU5FIC0gKHNpemVvZl9zaGFyZWRzICUgQ0FDSEVfTElORSkpOyAgICAgLyogcGFkIHRvIGNhY2hlIGxpbmUgc2l6ZSAqLworCisgICAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZiAoa21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QpOworICAgIHNoYXJlZF92YXJfYXJyYXkgPSAoa21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKCBieXRlcywgZ2xvYmFsX3RpZCk7CisKKyAgICBieXRlcyA9IG5zaGFyZWRzICogc2l6ZW9mX3NoYXJlZHM7CisgICAgc2hhcmVkX3Zhcl9zdG9yYWdlID0gKGNoYXIgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKCBieXRlcywgZ2xvYmFsX3RpZCk7CisKKyAgICBmb3IgKGk9MDsgaTxuc2hhcmVkczsgaSsrKSB7CisgICAgICAgIHNoYXJlZF92YXJfYXJyYXlbaV0uYWlfZGF0YSA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgKHNoYXJlZF92YXJfc3RvcmFnZSArIGkqc2l6ZW9mX3NoYXJlZHMpOworICAgICAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEtPnN2X3F1ZXVlID0gbmV3X3F1ZXVlOworICAgIH0KKyAgICBuZXdfcXVldWUtPnRxX3NoYXJlZHMgPSBzaGFyZWRfdmFyX2FycmF5OworCisKKyAgICAvKiBhcnJheSBmb3IgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHRodW5rcyBwZXIgdGhyZWFkICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihrbXBjX2FsaWduZWRfaW50MzJfdCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfdGhfdGh1bmtzID0gKGttcGNfYWxpZ25lZF9pbnQzMl90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworICAgICAgICBuZXdfcXVldWUtPnRxX25wcm9jICAgICA9IG5wcm9jOworCisgICAgICAgIGZvciAoaT0wOyBpPG5wcm9jOyBpKyspCisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3X3F1ZXVlOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrcSAoa21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqcCwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV90aHVua19zcGFjZSwgZ2xvYmFsX3RpZCk7CisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfcXVldWUsIGdsb2JhbF90aWQpOworCisgICAgLyogZnJlZSBzaGFyZWQgdmFyIHN0cnVjdHVyZSBzdG9yYWdlICovCisgICAgX19rbXBjX3Rhc2txX2ZyZWUoKHZvaWQgKikgcC0+dHFfc2hhcmVkc1swXS5haV9kYXRhLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIGZyZWUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgc3RvcmFnZSAqLworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3NoYXJlZHMsIGdsb2JhbF90aWQpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX25leHRfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX3JlZl9jb3VudCA9IC0xMDsKKyAgICBwLT50cV9zaGFyZWRzID0gTlVMTDsKKyAgICBwLT50cV90YXNrbnVtX3F1ZXVpbmcgPSAwOworICAgIHAtPnRxX3Rhc2tudW1fc2VydmluZyA9IDA7CisgICAgcC0+dHFfcXVldWUgPSBOVUxMOworICAgIHAtPnRxX3RodW5rX3NwYWNlID0gTlVMTDsKKyAgICBwLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICBwLT50cV9mcmVlX3RodW5rcyA9IE5VTEw7CisgICAgcC0+dHFfbnNsb3RzID0gMDsKKyAgICBwLT50cV9oZWFkID0gMDsKKyAgICBwLT50cV90YWlsID0gMDsKKyAgICBwLT50cV9uZnVsbCA9IDA7CisgICAgcC0+dHFfaGl3YXQgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaT0wOyBpPHAtPnRxX25wcm9jOyBpKyspCisgICAgICAgICAgICBwLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgICAgfQorICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgcC0+dHFfbG9jID0gTlVMTDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCApOworICAgIHAtPnRxX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSAgeworICAgICAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV90aF90aHVua3MsIGdsb2JhbF90aWQpOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9saW5rX2xjayk7CisgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmIHAtPnRxX3F1ZXVlX2xjayk7CisgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmIHAtPnRxX2ZyZWVfdGh1bmtzX2xjayk7CisgICAgfQorI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRxX3RoX3RodW5rcyA9IE5VTEw7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworICAgIHAtPnRxLnRxX25leHRfZnJlZSA9IHRxLT50cV9mcmVlbGlzdDsKKworICAgIHRxLT50cV9mcmVlbGlzdCA9IHA7CisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKK30KKworLyoKKyAqICAgIE9uY2UgYSBncm91cCBvZiB0aHVua3MgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB1c2UgaW4gYSBwYXJ0aWN1bGFyIHF1ZXVlLAorICogICAgdGhlc2UgYXJlIG1hbmFnZWQgdmlhIGEgcGVyLXF1ZXVlIGZyZWVsaXN0LgorICogICAgV2UgZm9yY2UgYSBjaGVjayB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgdGh1bmsgZnJlZSBpZiB3ZSBuZWVkIG9uZS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2FsbG9jX3RodW5rIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wY190aHVua190ICpmbDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIGZsID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoZmwgIT0gTlVMTCk7CisKKyAgICBxdWV1ZS0+dHFfZnJlZV90aHVua3MgPSBmbC0+dGgudGhfbmV4dF9mcmVlOworICAgIGZsLT50aF9mbGFncyA9IDA7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworCisgICAgcmV0dXJuIGZsOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90aHVuayAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnAsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dGhfdGFzayA9IDA7CisgICAgcC0+dGhfZW5jbF90aHVuayA9IDA7CisgICAgcC0+dGhfc3RhdHVzID0gMDsKKyAgICBwLT50aF90YXNrbnVtID0gMDsKKyAgICAvKiBBbHNvIGNvdWxkIHplcm8gcG9pbnRlcnMgdG8gcHJpdmF0ZSB2YXJzICovCisjZW5kaWYKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIHAtPnRoLnRoX25leHRfZnJlZSA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsKKyAgICBxdWV1ZS0+dHFfZnJlZV90aHVua3MgPSBwOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKworICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgcmV0dXJucyBub256ZXJvIGlmIHRoZSBxdWV1ZSBqdXN0IGJlY2FtZSBmdWxsIGFmdGVyIHRoZSBlbnF1ZXVlICAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9lbnF1ZXVlX3Rhc2sgKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGttcGNfdGh1bmtfdCAqdGh1bmssIGludCBpbl9wYXJhbGxlbCApCit7CisgICAga21wX2ludDMyICAgIHJldDsKKworICAgIC8qICBka3A6IGNhbiB3ZSBnZXQgYXJvdW5kIHRoZSBsb2NrIGluIHRoZSBUUUZfUkVMRUFTRV9XT1JLRVJTIGNhc2UgKG9ubHkgdGhlIG1hc3RlciBpcyBleGVjdXRpbmcgdGhlbikgICovCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX25mdWxsIDwgcXVldWUtPnRxX25zbG90cyk7ICAvKiAgY2hlY2sgcXVldWUgbm90IGZ1bGwgICovCisKKyAgICBxdWV1ZS0+dHFfcXVldWVbKHF1ZXVlLT50cV9oZWFkKSsrXS5xc190aHVuayA9IHRodW5rOworCisgICAgaWYgKHF1ZXVlLT50cV9oZWFkID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgICAgIHF1ZXVlLT50cV9oZWFkID0gMDsKKworICAgIChxdWV1ZS0+dHFfbmZ1bGwpKys7CisKKyAgICBLTVBfTUIoKTsgICAvKiB0byBhc3N1cmUgdGhhdCBuZnVsbCBpcyBzZWVuIHRvIGluY3JlYXNlIGJlZm9yZSBUUUZfQUxMX1RBU0tTX1FVRVVFRCBpcyBzZXQgKi8KKworICAgIHJldCA9IChpbl9wYXJhbGxlbCkgPyAocXVldWUtPnRxX25mdWxsID09IHF1ZXVlLT50cV9uc2xvdHMpIDogRkFMU0U7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgLyogZG9uJ3QgbmVlZCB0byB3YWl0IHVudGlsIHdvcmtlcnMgYXJlIHJlbGVhc2VkIGJlZm9yZSB1bmxvY2tpbmcgKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgaWYoIHRxLT50cV9nbG9iYWxfZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTICkgeworICAgICAgICAgICAgLyogSWYganVzdCBjcmVhdGluZyB0aGUgcm9vdCBxdWV1ZSwgdGhlIHdvcmtlciB0aHJlYWRzIGFyZSB3YWl0aW5nIGF0ICovCisgICAgICAgICAgICAvKiBhIGpvaW4gYmFycmllciB1bnRpbCBub3csIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIHF1ZXVlIGZvciAgKi8KKyAgICAgICAgICAgIC8qIHRoZW0gdG8gZG87IHJlbGVhc2UgdGhlbSBub3cgdG8gZG8gd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgb25seSBiZSBkb25lIHdoZW4gdGhpcyBpcyB0aGUgZmlyc3QgdGFzayBlbnF1ZXVlZCwgICAgICovCisgICAgICAgICAgICAvKiBzbyByZXNldCB0aGUgZmxhZyBoZXJlIGFsc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsgIC8qIG5vIGxvY2sgbmVlZGVkLCB3b3JrZXJzIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKworICAgICAgICAgICAgS01QX01CKCk7ICAgLyogYXZvaWQgcmVsZWFzaW5nIGJhcnJpZXIgdHdpY2UgaWYgdGFza3FfdGFzayBzd2l0Y2hlcyB0aHJlYWRzICovCisKKyAgICAgICAgICAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoIE5VTEwsIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9kZXF1ZXVlX3Rhc2sgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0OworICAgIGludCAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX25mdWxsID4gMCk7ICAvKiAgY2hlY2sgcXVldWUgbm90IGVtcHR5ICAqLworCisgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICBpbnQgY3Q7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgIH0KKworICAgIHB0ID0gcXVldWUtPnRxX3F1ZXVlWyhxdWV1ZS0+dHFfdGFpbCkrK10ucXNfdGh1bms7CisKKyAgICBpZiAocXVldWUtPnRxX3RhaWwgPj0gcXVldWUtPnRxX25zbG90cykKKyAgICAgICAgcXVldWUtPnRxX3RhaWwgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhKys7CisKKyAgICAgICAgS01QX01CKCk7IC8qIG5lY2Vzc2FyeSBzbyBhaV9kYXRhIGluY3JlbWVudCBpcyBwcm9wYWdhdGVkIHRvIG90aGVyIHRocmVhZHMgaW1tZWRpYXRlbHkgKGRpZ2l0YWwpICovCisKKyAgICAgICAgS0ZfVFJBQ0UoMjAwLCAoIl9fa21wX2RlcXVldWVfdGFzazogVCMlZCg6JWQpIG5vdyBoYXMgJWQgb3V0c3RhbmRpbmcgdGh1bmtzIGZyb20gcXVldWUgJXBcbiIsCisgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLCBxdWV1ZSkpOworICAgIH0KKworICAgIChxdWV1ZS0+dHFfbmZ1bGwpLS07CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5lY2Vzc2FyeSBzbyAocXVldWUtPnRxX25mdWxsID4gMCkgYWJvdmUgc3VjY2VlZHMgYWZ0ZXIgdHFfbmZ1bGwgaXMgZGVjcmVtZW50ZWQgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID49IDApOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPD0gX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IChub24tbnVsbCkgdGFzayB0byBkZXF1ZXVlIGFuZCByZXR1cm4gaXQuCisgKiBUaGlzIGlzIG5ldmVyIGNhbGxlZCB1bmxlc3MgaW5fcGFyYWxsZWw9VFJVRQorICoKKyAqIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggcXVldWUgdG8gdGFrZSB0aGUgdGFzayBmcm9tOgorICogMS4gIFdhbGsgdXAgdGhlIHRhc2sgcXVldWUgdHJlZSBmcm9tIHRoZSBjdXJyZW50IHF1ZXVlJ3MgcGFyZW50IGFuZCBsb29rCisgKiAgICAgIG9uIHRoZSB3YXkgdXAgKGZvciBsb29wLCBiZWxvdykuCisgKiAyLiAgRG8gYSBkZXB0aC1maXJzdCBzZWFyY2ggYmFjayBkb3duIHRoZSB0cmVlIGZyb20gdGhlIHJvb3QgYW5kCisgKiAgICAgIGxvb2sgKGZpbmRfdGFza19pbl9kZXNjYW5kZW50X3F1ZXVlKCkpLgorICoKKyAqIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggdGFzayB0byB0YWtlIGZyb20gYSBxdWV1ZQorICogKF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoKSk6CisgKiAxLiAgTmV2ZXIgdGFrZSB0aGUgbGFzdCB0YXNrIGZyb20gYSBxdWV1ZSBpZiBUUUZfSVNfTEFTVFBSSVZBVEU7IHRoaXMgdGFzaworICogICAgIG11c3QgYmUgc3RhZ2VkIHRvIG1ha2Ugc3VyZSB3ZSBleGVjdXRlIHRoZSBsYXN0IG9uZSB3aXRoCisgKiAgICAgVFFGX0lTX0xBU1RfVEFTSyBhdCB0aGUgZW5kIG9mIHRhc2sgcXVldWUgZXhlY3V0aW9uLgorICogMi4gIElmIHRoZSBxdWV1ZSBsZW5ndGggaXMgYmVsb3cgc29tZSBoaWdoIHdhdGVyIG1hcmsgYW5kIHRoZSB0YXNrcSB0YXNrCisgKiAgICAgaXMgZW5xdWV1ZWQsIHByZWZlciBydW5uaW5nIHRoZSB0YXNrcSB0YXNrLgorICogMy4gIE90aGVyd2lzZSwgdGFrZSBhIChub3JtYWwpIHRhc2sgZnJvbSB0aGUgcXVldWUuCisgKgorICogSWYgd2UgZG8gYWxsIHRoaXMgYW5kIHJldHVybiBwdCA9PSBOVUxMIGF0IHRoZSBib3R0b20gb2YgdGhpcyByb3V0aW5lLAorICogdGhpcyBtZWFucyB0aGVyZSBhcmUgbm8gbW9yZSB0YXNrcyB0byBleGVjdXRlIChleGNlcHQgcG9zc2libHkgZm9yCisgKiBUUUZfSVNfTEFTVFBSSVZBVEUpLgorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX3F1ZXVlIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGttcGNfdGh1bmtfdCAqcHQgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIC8qIFRvIHByZXZlbnQgZGVhZGxvY2sgZnJvbSB0cV9xdWV1ZV9sY2sgaWYgcXVldWUgYWxyZWFkeSBkZWFsbG9jYXRlZCAqLworICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworCisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIC8qIENoZWNrIGFnYWluIHRvIGF2b2lkIHJhY2UgaW4gX19rbXBjX2VuZF90YXNrcSgpICovCisgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgaWYgKChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSAmJiAocXVldWUtPnRxX25mdWxsIDw9IHF1ZXVlLT50cV9oaXdhdCkpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGVyZSdzIGVub3VnaCByb29tIGluIHRoZSBxdWV1ZSBhbmQgdGhlIGRpc3BhdGNoZXIgKi8KKyAgICAgICAgICAgICAgICAvKiAodGFza3EgdGFzaykgaXMgYXZhaWxhYmxlLCBzY2hlZHVsZSBtb3JlIHRhc2tzICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdCA9IChrbXBjX3RodW5rX3QgKikgcXVldWUtPnRxX3Rhc2txX3Nsb3Q7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX3Rhc2txX3Nsb3QgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVldWUtPnRxX25mdWxsID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhID49IF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpIHsKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nIGlmIG5vIHRodW5rcyBhdmFpbGFibGUgb3IgdGhpcyB0aHJlYWQgY2FuJ3QgKi8KKyAgICAgICAgICAgICAgICAvKiBydW4gYW55IGJlY2F1c2UgaXQgYWxyZWFkeSBpcyBleGVjdXRpbmcgdG9vIG1hbnkgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA+IDEpIHsKKyAgICAgICAgICAgICAgICAvKiAgYWx3YXlzIHNhZmUgdG8gc2NoZWR1bGUgYSB0YXNrIGV2ZW4gaWYgVFFGX0lTX0xBU1RQUklWQVRFICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKSkgeworICAgICAgICAgICAgICAgIC8qICBvbmUgdGhpbmcgaW4gcXVldWUsIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGlmICFUUUZfSVNfTEFTVFBSSVZBVEUgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IF9fa21wX2RlcXVldWVfdGFzayAoZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykgeworICAgICAgICAgICAgICAgIC8qIFRRRl9JU19MQVNUUFJJVkFURSwgb25lIHRoaW5nIGluIHF1ZXVlLCBrbXBjX2VuZF90YXNrcV90YXNrKCkgICAqLworICAgICAgICAgICAgICAgIC8qIGhhcyBiZWVuIHJ1biBzbyB0aGlzIGlzIGxhc3QgdGFzaywgcnVuIHdpdGggVFFGX0lTX0xBU1RfVEFTSyBzbyAqLworICAgICAgICAgICAgICAgIC8qIGluc3RydW1lbnRhdGlvbiBkb2VzIGNvcHktb3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBwdC0+dGhfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsgIC8qIGRvbid0IG5lZWQgdGVzdF90aGVuX29yIHNpbmNlIGFscmVhZHkgbG9ja2VkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHRUggLSBXaGF0IGhhcHBlbnMgaGVyZSBpZiBpcyBsYXN0cHJpdmF0ZSwgYnV0IG5vdCBsYXN0IHRhc2s/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIFdhbGsgYSB0cmVlIG9mIHF1ZXVlcyBzdGFydGluZyBhdCBxdWV1ZSdzIGZpcnN0IGNoaWxkCisgKiBhbmQgcmV0dXJuIGEgbm9uLU5VTEwgdGh1bmsgaWYgb25lIGNhbiBiZSBzY2hlZHVsZWQuCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRQorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0ID0gTlVMTDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChxdWV1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisKKyAgICAgICAgICAgIGN0PSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAgICAgICBpZiAocHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBjdDsKKworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHF1ZXVlLT50cV9yZWZfY291bnQgPj0gMCApOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssIHNob3VsZG4ndCBtYXR0ZXIgICovCisgICAgICAgICAgICAvKiBzaW5jZSBpZiBjaGlsZHJlbiBzdGlsbCBleGlzdCwgcmVmZXJlbmNlIGNvdW50cyBhcmVuJ3QgYmVpbmcgbW9uaXRvcmVkIGFueXdheSAgICovCisKKyAgICAgICAgICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIG5leHQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICBxdWV1ZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogV2FsayB1cCB0aGUgdGFza3EgdHJlZSBsb29raW5nIGZvciBhIHRhc2sgdG8gZXhlY3V0ZS4KKyAqIElmIHdlIGdldCB0byB0aGUgcm9vdCwgc2VhcmNoIHRoZSB0cmVlIGZvciBhIGRlc2NlbmRlbnQgcXVldWUgdGFzay4KKyAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2hlbiBpbl9wYXJhbGxlbD1UUlVFCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9maW5kX3Rhc2tfaW5fYW5jZXN0b3JfcXVldWUgKGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAqcHQ7CisKKyAgICBwdCA9IE5VTEw7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgcXVldWUgPSBjdXJyX3F1ZXVlLT50cS50cV9wYXJlbnQ7CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoZ2xvYmFsX3RpZCwgcXVldWUpOworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICAgICAgICBpZiAocXVldWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKCBnbG9iYWxfdGlkLCB0cS0+dHFfcm9vdCApOworCisgICAgcmV0dXJuIHB0OworfQorCitzdGF0aWMgaW50CitfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZCAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGludCBpOworCisgICAgLyogS01QX01CKCk7ICovLyogaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCisgICAgZm9yIChpPTA7IGk8cXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgaWYgKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpCit7CisgICAgcmV0dXJuIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCApCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2ludDMyICAgICBpOworICAgIGttcGNfdGh1bmtfdCAqdGh1bms7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKDUwLCAoIkJlZm9yZSBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIC8qICBzdWItcXVldWUgaW4gYSByZWN1cnNpb24sIG5vdCB0aGUgcm9vdCB0YXNrIHF1ZXVlICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX2ZpcnN0X2NoaWxkID09IE5VTEwpOworCisgICAgLyogIHVubGluayBxdWV1ZSBmcm9tIGl0cyBzaWJsaW5ncyBpZiBhbnkgYXQgdGhpcyBsZXZlbCAgKi8KKyAgICBpZiAocXVldWUtPnRxX3ByZXZfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQtPnRxX25leHRfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKyAgICBpZiAocXVldWUtPnRxX25leHRfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgcXVldWUtPnRxX25leHRfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBxdWV1ZS0+dHFfcHJldl9jaGlsZDsKKyAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudC0+dHFfZmlyc3RfY2hpbGQgPT0gcXVldWUpCisgICAgICAgIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICBxdWV1ZS0+dHFfcHJldl9jaGlsZCA9IE5VTEw7CisgICAgcXVldWUtPnRxX25leHRfY2hpbGQgPSBOVUxMOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGttcF91aW50MzIgc3BpbnM7CisKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgd2FpdGluZyBmb3IgcmVmX2NvdW50IG9mICVkIHRvIHJlYWNoIDFcbiIsCisgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBxdWV1ZS0+dHFfcmVmX2NvdW50KSk7CisKKyAgICAgICAgLyogd2FpdCB1bnRpbCBhbGwgb3RoZXIgdGhyZWFkcyBoYXZlIHN0b3BwZWQgYWNjZXNzaW5nIHRoaXMgcXVldWUgKi8KKyAgICAgICAgd2hpbGUgKHF1ZXVlLT50cV9yZWZfY291bnQgPiAxKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludDMyKikmcXVldWUtPnRxX3JlZl9jb3VudCwgMSwgS01QX0xFLCBOVUxMKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBmcmVlaW5nIHF1ZXVlXG4iLAorICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAwKTsKKworICAgIGZvciAoaT0wOyBpPHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID09IDApOworICAgIH0KKworICAgIGkgPSAwOworICAgIGZvciAodGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKQorICAgICAgICArK2k7CisKKyAgICBLTVBfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAocXVldWUtPnRxX25wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworI2VuZGlmCisKKyAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciBxdWV1ZSBlbnRyeSAgKi8KKyAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBUUlVFLCBnbG9iYWxfdGlkICk7CisKKyAgICBLRl9UUkFDRSg1MCwgKCJBZnRlciBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkICkpOworfQorCisvKgorICogU3RhcnRpbmcgZnJvbSBpbmRpY2F0ZWQgcXVldWUsIHByb2NlZWQgZG93bndhcmQgdGhyb3VnaCB0cmVlIGFuZAorICogcmVtb3ZlIGFsbCB0YXNrcXMgd2hpY2ggYXJlIGZpbmlzaGVkLCBidXQgb25seSBnbyBkb3duIHRvIHRhc2txcworICogd2hpY2ggaGF2ZSB0aGUgIm5vd2FpdCIgY2xhdXNlIHByZXNlbnQuICBBc3N1bWUgdGhpcyBpcyBvbmx5IGNhbGxlZAorICogd2hlbiBpbl9wYXJhbGxlbD1UUlVFLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0OworICAgICAgICAgICAgaW50IGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKworCisgICAgICAgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssICovCisgICAgICAgICAgICAvKiBzaG91bGRuJ3QgbWF0dGVyIHNpbmNlIGlmIGNoaWxkcmVuIHN0aWxsIGV4aXN0LCByZWZlcmVuY2UgICAgICovCisgICAgICAgICAgICAvKiBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSAmJiAocXVldWUtPnRxX25mdWxsID09IDApICYmCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSAmJiAhIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVtb3ZlIHRoaXMgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBtYXJrZWQgaXQgZm9yIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkcyBmcm9tIHRyeWluZyB0byBmcmVlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGVzdF9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBkbyBhbnkgbW9yZSBoZXJlIHNpbmNlIGNhbid0IGJlIHN1cmUgd2hlcmUgc2libGluZyBxdWV1ZSBpcyBzbyBqdXN0IGV4aXQgdGhpcyBsZXZlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwganVzdCBmYWxsIHRocm91Z2ggYW5kIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIG5leHQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICBxdWV1ZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorfQorCisvKgorICogU3RhcnRpbmcgZnJvbSBpbmRpY2F0ZWQgcXVldWUsIHByb2NlZWQgZG93bndhcmQgdGhyb3VnaCB0cmVlIGFuZAorICogcmVtb3ZlIGFsbCB0YXNrcSdzIGFzc3VtaW5nIGFsbCBhcmUgZmluaXNoZWQgYW5kCisgKiBhc3N1bWluZyBOTyBvdGhlciB0aHJlYWRzIGFyZSBleGVjdXRpbmcgYXQgdGhpcyBwb2ludC4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqbmV4dF9jaGlsZDsKKworICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIHF1ZXVlLT50cV9maXJzdF9jaGlsZDsKKworICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICBfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgbmV4dF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBGQUxTRSApOworICAgICAgICBxdWV1ZSA9IG5leHRfY2hpbGQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIGttcF90YXNrcV90ICp0cSwgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywgaW50IGluX3BhcmFsbGVsICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAga21wX2ludDMyICAgICAgICAgIHRpZCAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkFmdGVyIGRlcXVldWVpbmcgdGhpcyBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFzayBRdWV1ZTogJXAgbG9va3MgbGlrZSB0aGlzICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIC8qCisgICAgICogRm9yIHRoZSB0YXNrcSB0YXNrLCB0aGUgY3Vycl90aHVuayBwdXNoZXMgYW5kIHBvcCBwYWlycyBhcmUgc2V0IHVwIGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiBoYXBwZW5zIGV4YWN0bHkgb25jZToKKyAgICAgKiAxKSBfX2ttcGNfdGFza3EgICAgICAgICAgICAgOiBwdXNoIChpZiByZXR1cm5pbmcgdGh1bmsgb25seSkKKyAgICAgKiA0KSBfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgICAgOiBwb3AKKyAgICAgKgorICAgICAqIG9wdGlvbmFsbHkgaGFwcGVucyAqZWFjaCogdGltZSB0YXNrcSB0YXNrIGlzIGRlcXVldWVkL2VucXVldWVkOgorICAgICAqIDIpIF9fa21wY190YXNrcV90YXNrICAgICAgICA6IHBvcAorICAgICAqIDMpIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlICA6IHB1c2gKKyAgICAgKgorICAgICAqIGV4ZWN1dGlvbiBvcmRlcmluZzogIDEsKDIsMykqLDQKKyAgICAgKi8KKworICAgIGlmICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSkgeworICAgICAgICBrbXBfaW50MzIgaW5kZXggPSAocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gdGlkIDogMDsKKyAgICAgICAgdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHF1ZXVlLT50cV9zaGFyZWRzW2luZGV4XS5haV9kYXRhOworCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgPyBjdF90YXNrX29yZGVyZWQgOiBjdF90YXNrLAorICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgcXVldWUtPnRxX2xvYyApOworICAgIH0KKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuazsKKworICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDUwLCAoIkJlZ2luIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIHRodW5rLT50aF90YXNrIChnbG9iYWxfdGlkLCB0aHVuayk7CisgICAgS0ZfVFJBQ0UoIDUwLCAoIkVuZCBFeGVjdXRpbmcgVGh1bmsgJXAgZnJvbSBxdWV1ZSAlcCBvbiAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgIGlmICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpID8gY3RfdGFza19vcmRlcmVkIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MgKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICAgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrcV9jaGVja19vcmRlcmVkKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWVfdGh1bmsgKHF1ZXVlLCB0aHVuaywgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQpOworCisgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJUIyVkIEFmdGVyIGZyZWVpbmcgdGh1bms6ICVwLCBUYXNrUSBsb29rcyBsaWtlIHRoaXM6XG4iLCBnbG9iYWxfdGlkLCB0aHVuaykpOworICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBLTVBfTUIoKTsgICAvKiBuZWVkZWQgc28gdGh1bmsgcHV0IG9uIGZyZWUgbGlzdCBiZWZvcmUgb3V0c3RhbmRpbmcgdGh1bmsgY291bnQgaXMgZGVjcmVtZW50ZWQgKi8KKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA+PSAxKTsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDIwMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZTogVCMlZCBoYXMgJWQgdGh1bmtzIGluIHF1ZXVlICVwXG4iLAorICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLTEsIHF1ZXVlKSk7CisKKyAgICAgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLS07CisKKyAgICAgICAgICAgIC8qIEtNUF9NQigpOyAqLyAgICAgLyogaXMgTUIgcmVhbGx5IG5lY2Vzc2FyeSA/ICovCisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzdGFydHMgYSB0YXNrcTsgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHRodW5rIGZvciB0aGUgdGFza3FfdGFzayAgICAgICAgKi8KKy8qIGFsc28sIHJldHVybnMgcG9pbnRlciB0byBzaGFyZWQgdmFycyBmb3IgdGhpcyB0aHJlYWQgaW4gInNoYXJlZHMiIGFyZyAqLworCitrbXBjX3RodW5rX3QgKgorX19rbXBjX3Rhc2txKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLAorICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3RodW5rLCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgIGttcF9pbnQzMiBmbGFncywga21wY19zaGFyZWRfdmFyc190ICoqc2hhcmVkcyApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX2ludDMyICAgICAgICAgICAgbnNsb3RzLCBudGh1bmtzLCBuc2hhcmVkcywgbnByb2M7CisgICAga21wY190YXNrX3F1ZXVlX3QgICAqbmV3X3F1ZXVlLCAqY3Vycl9xdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgICpuZXdfdGFza3FfdGh1bms7CisgICAga21wX2luZm9fdCAgICAgICAgICAqdGg7CisgICAga21wX3RlYW1fdCAgICAgICAgICAqdGVhbTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAgICp0cTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICB0aWQ7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICB0ZWFtID0gdGggLT4gdGgudGhfdGVhbTsKKyAgICB0cSA9ICYgdGVhbSAtPiB0LnRfdGFza3E7CisgICAgbnByb2MgPSB0ZWFtIC0+IHQudF9ucHJvYzsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBwYXJhbGxlbCB0YXNrcSBvciBzZXJpYWxpemVkIG9uZS4gKi8KKyAgICBpbl9wYXJhbGxlbCA9IGluX3BhcmFsbGVsX2NvbnRleHQoIHRlYW0gKTsKKworICAgIGlmKCAhIHRxLT50cV9yb290ICkgeworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfdGFza3FfZW87CisKKyAgICAgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGJlIGEgYmFycmllciByZWdpb24gYm91bmRhcnksIGl0IHdpbGwgY29uZnVzZSB0aGUgdXNlci4gKi8KKyAgICAgICAgICAgIC8qIE5lZWQgdGhlIGJvdW5kYXJ5IHRvIGJlIGF0IHRoZSBlbmQgdGFza3EgaW5zdGVhZC4gKi8KKyAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApKSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRpbmcgdGhlIGFjdGl2ZSByb290IHF1ZXVlLCBhbmQgd2UgYXJlIG5vdCB0aGUgbWFzdGVyIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBiZWxvdyBjcmVhdGVkIHRoZSBxdWV1ZSBhbmQgdGFza3MgaGF2ZSBiZWVuICAgICAqLworICAgICAgICAgICAgICAgIC8qIGVucXVldWVkLCBhbmQgdGhlIG1hc3RlciB0aHJlYWQgcmVsZWFzZWQgdGhpcyBiYXJyaWVyLiAgVGhpcyAgICAgICovCisgICAgICAgICAgICAgICAgLyogd29ya2VyIHRocmVhZCBjYW4gbm93IHByb2NlZWQgYW5kIGV4ZWN1dGUgdGFza3MuICBTZWUgYWxzbyB0aGUgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBUUUZfUkVMRUFTRV9XT1JLRVJTIHdoaWNoIGlzIHVzZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4gICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgKnNoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHRxLT50cV9yb290LT50cV9zaGFyZWRzW3RpZF0uYWlfZGF0YTsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbWFzdGVyIHRocmVhZCBvbmx5IGV4ZWN1dGVzIHRoaXMgY29kZSAqLworCisgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua19jYXBhY2l0eSA8IG5wcm9jICkgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGlmKHRxLT50cV9jdXJyX3RodW5rKQorICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodHEtPnRxX2N1cnJfdGh1bmspOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSBhdCBvdXRlciBsZXZlbCwgaS5lLiB3aGVuIHRxX2N1cnJfdGh1bmsgaXMgc3RpbGwgTlVMTCAqLworICAgICAgICAgICAgICAgIF9fa21wX2luaXRfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRxLT50cV9jdXJyX3RodW5rID0gKGttcGNfdGh1bmtfdCAqKikgX19rbXBfYWxsb2NhdGUoIG5wcm9jICogc2l6ZW9mKGttcGNfdGh1bmtfdCAqKSApOworICAgICAgICAgICAgdHEgLT4gdHFfY3Vycl90aHVua19jYXBhY2l0eSA9IG5wcm9jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyA9IFRRRl9SRUxFQVNFX1dPUktFUlM7CisgICAgfQorCisgICAgLyogZGtwOiBpbiBmdXR1cmUsIGlmIGZsYWdzICYgVFFGX0hFVVJJU1RJQ1MsIHdpbGwgY2hvb3NlIG5zbG90cyBiYXNlZCAqLworICAgIC8qICAgICAgb24gc29tZSBoZXVyaXN0aWNzIChlLmcuLCBkZXB0aCBvZiBxdWV1ZSBuZXN0aW5nPykuICAgICAgICAgICAgKi8KKworICAgIG5zbG90cyA9IChpbl9wYXJhbGxlbCkgPyAoMiAqIG5wcm9jKSA6IDE7CisKKyAgICAvKiBUaGVyZSBtdXN0IGJlIG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCBleHRyYSBzbG90cyBmb3IgcGVuZGluZyAqLworICAgIC8qIGpvYnMgYmVpbmcgZXhlY3V0ZWQgYnkgb3RoZXIgdGhyZWFkcywgYW5kIG9uZSBleHRyYSBmb3IgdGFza3Egc2xvdCAgICAgICAgICAqLworCisgICAgbnRodW5rcyA9IChpbl9wYXJhbGxlbCkgPyAobnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkgKyAxKSA6IG5zbG90cyArIDI7CisKKyAgICAvKiBPbmx5IHRoZSByb290IHRhc2txIGdldHMgYSBwZXItdGhyZWFkIGFycmF5IG9mIHNoYXJlZHMuICAgICAgICovCisgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHRhc2txJ3Mgb25seSBnZXQgb25lIGNvcHkgb2YgdGhlIHNoYXJlZCB2YXJzLiAqLworCisgICAgbnNoYXJlZHMgPSAoICF0cS0+dHFfcm9vdCAmJiBpbl9wYXJhbGxlbCkgPyBucHJvYyA6IDE7CisKKyAgICAvKiAgY3JlYXRlIG92ZXJhbGwgcXVldWUgZGF0YSBzdHJ1Y3R1cmUgYW5kIGl0cyBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhbGxvY2F0aW9uICovCisKKyAgICBuZXdfcXVldWUgPSBfX2ttcF9hbGxvY190YXNrcSAoIHRxLCBpbl9wYXJhbGxlbCwgbnNsb3RzLCBudGh1bmtzLCBuc2hhcmVkcywgbnByb2MsCisgICAgICAgIHNpemVvZl90aHVuaywgc2l6ZW9mX3NoYXJlZHMsICZuZXdfdGFza3FfdGh1bmssIGdsb2JhbF90aWQgKTsKKworICAgIC8qICByZXN0IG9mIG5ld19xdWV1ZSBpbml0aWFsaXphdGlvbnMgICovCisKKyAgICBuZXdfcXVldWUtPnRxX2ZsYWdzICAgICAgICAgICA9IGZsYWdzICYgVFFGX0lOVEVSRkFDRV9GTEFHUzsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZyAgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyAgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxX2ZsYWdzICAgICAgICAgICB8PSBUUUZfUEFSQUxMRUxfQ09OVEVYVDsKKyAgICB9CisKKyAgICBuZXdfcXVldWUtPnRxX3Rhc2txX3Nsb3QgICA9IE5VTEw7CisgICAgbmV3X3F1ZXVlLT50cV9uc2xvdHMgICAgICAgPSBuc2xvdHM7CisgICAgbmV3X3F1ZXVlLT50cV9oaXdhdCAgICAgICAgPSBISUdIX1dBVEVSX01BUksgKG5zbG90cyk7CisgICAgbmV3X3F1ZXVlLT50cV9uZnVsbCAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfaGVhZCAgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX3RhaWwgICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV9sb2MgICAgICAgICAgPSBsb2M7CisKKyAgICBpZiAoKG5ld19xdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgLyogcHJlcGFyZSB0byBzZXJ2ZSB0aGUgZmlyc3QtcXVldWVkIHRhc2sncyBPUkRFUkVEIGRpcmVjdGl2ZSAqLworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyA9IDE7CisKKyAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IF9fa21wX3Rhc2txX2VvOworCisgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgICB9CisKKyAgICAvKiAgY3JlYXRlIGEgbmV3IHRodW5rIGZvciB0aGUgdGFza3FfdGFzayBpbiB0aGUgbmV3X3F1ZXVlICAqLworICAgICpzaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSBuZXdfcXVldWUtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YTsKKworICAgIG5ld190YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcyA9ICpzaGFyZWRzOworICAgIG5ld190YXNrcV90aHVuay0+dGhfdGFzayAgICAgICA9IHRhc2txX3Rhc2s7CisgICAgbmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAgICAgID0gbmV3X3F1ZXVlLT50cV9mbGFncyB8IFRRRl9UQVNLUV9UQVNLOworICAgIG5ld190YXNrcV90aHVuay0+dGhfc3RhdHVzICAgICA9IDA7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChuZXdfdGFza3FfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOworCisgICAgLyogS01QX01CKCk7ICovIC8qIG1ha2Ugc3VyZSB0aGVzZSBpbml0cyBjb21wbGV0ZSBiZWZvcmUgdGhyZWFkcyBzdGFydCB1c2luZyB0aGlzIHF1ZXVlIChuZWNlc3Nhcnk/KSAqLworCisgICAgLyogaW5zZXJ0IHRoZSBuZXcgdGFzayBxdWV1ZSBpbnRvIHRoZSB0cmVlLCBidXQgb25seSBhZnRlciBhbGwgZmllbGRzIGluaXRpYWxpemVkICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaWYoICEgdHEtPnRxX3Jvb3QgKSB7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3ByZXZfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOworICAgICAgICAgICAgdHEtPnRxX3Jvb3QgPSBuZXdfcXVldWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJyX3F1ZXVlID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gY3Vycl9xdWV1ZTsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsgICAgICAvKiBmb3IgdGhpcyB0aGUgdGhyZWFkIHRoYXQgYnVpbHQgdGhlIHF1ZXVlICovCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGFsbG9jICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgbmV3X3F1ZXVlLCBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCkpOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgPSAoc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworCisgICAgICAgICAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZC0+dHFfcHJldl9jaGlsZCA9IG5ld19xdWV1ZTsKKworICAgICAgICAgICAgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBuZXdfcXVldWU7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB1cCB0aHVuayBzdGFjayBvbmx5IGFmdGVyIGNvZGUgdGhhdCBkZXRlcm1pbmVzIGN1cnJfcXVldWUgYWJvdmUgKi8KKyAgICAgICAgbmV3X3Rhc2txX3RodW5rLT50aF9lbmNsX3RodW5rID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXTsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IG5ld190YXNrcV90aHVuazsKKworICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdfdGFza3FfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCAgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX3ByZXZfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7CisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgS0ZfVFJBQ0UoMTUwLCAoIkNyZWF0aW5nIFRhc2tRIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDE1MCwgX19rbXBfZHVtcF90aHVuayggdHEsIG5ld190YXNrcV90aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLRl9UUkFDRSgyNSwgKCJBZnRlciBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0ZfVFJBQ0UoMjUsICgiQWZ0ZXIgU2VyaWFsIFRhc2tRIGF0ICVwIENyZWF0aW9uIG9uICglZCk6XG4iLCBuZXdfcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICB9CisKKyAgICBLRl9EVU1QKDI1LCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBuZXdfcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbmV3X3F1ZXVlLT50cV9sb2MgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiBuZXdfdGFza3FfdGh1bms7Cit9CisKKworLyogIGVuZHMgYSB0YXNrcTsgbGFzdCB0aHJlYWQgb3V0IGRlc3Ryb3lzIHRoZSBxdWV1ZSAgKi8KKwordm9pZAorX19rbXBjX2VuZF90YXNrcShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbnQzMiAgICAgICAgICAgaTsKKyNlbmRpZgorICAgIGttcF90YXNrcV90ICAgICAgICAqdHE7CisgICAgaW50ICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfaW5mb190ICAgICAgICAgKnRoOworICAgIGttcF9pbnQzMiAgICAgICAgICAgaXNfb3V0ZXJtb3N0OworICAgIGttcGNfdGFza19xdWV1ZV90ICAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgICp0aHVuazsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5wcm9jOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRxID0gJiBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKworICAgIC8qIEZvciB0aGUgb3V0ZXJtb3N0IHRhc2txIG9ubHksIGFsbCBidXQgb25lIHRocmVhZCB3aWxsIGhhdmUgdGFza3FfdGh1bmsgPT0gTlVMTCAqLworICAgIHF1ZXVlID0gKHRhc2txX3RodW5rID09IE5VTEwpID8gdHEtPnRxX3Jvb3QgOiB0YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisKKyAgICBLRV9UUkFDRSggNTAsICgiX19rbXBjX2VuZF90YXNrcSBxdWV1ZT0lcCAoJWQpIFxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBpc19vdXRlcm1vc3QgPSAocXVldWUgPT0gdHEtPnRxX3Jvb3QpOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBrbXBfdWludDMyIHNwaW5zOworCisgICAgICAgIC8qIHRoaXMgaXMganVzdCBhIHNhZmVndWFyZCB0byByZWxlYXNlIHRoZSB3YWl0aW5nIHRocmVhZHMgaWYgKi8KKyAgICAgICAgLyogdGhlIG91dGVybW9zdCB0YXNrcSBuZXZlciBxdWV1ZXMgYSB0YXNrICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGlmIChpc19vdXRlcm1vc3QgJiYgKEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKSkgeworICAgICAgICAgICAgaWYoIHRxLT50cV9nbG9iYWxfZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTICkgeworICAgICAgICAgICAgICAgIC8qIG5vIGxvY2sgbmVlZGVkLCB3b3JrZXJzIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB0cS0+dHFfZ2xvYmFsX2ZsYWdzICY9IH5UUUZfUkVMRUFTRV9XT1JLRVJTOworCisgICAgICAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGtlZXAgZGVxdWV1ZWluZyB3b3JrIHVudGlsIGFsbCB0YXNrcyBhcmUgcXVldWVkIGFuZCBkZXF1ZXVlZCAqLworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHdhaXQgdW50aWwgc29tZXRoaW5nIGlzIGF2YWlsYWJsZSB0byBkZXF1ZXVlICovCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgICAgIHdoaWxlICggKHF1ZXVlLT50cV9uZnVsbCA9PSAwKQorICAgICAgICAgICAgICAgICAmJiAocXVldWUtPnRxX3Rhc2txX3Nsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgJiYgKCEgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkgKQorICAgICAgICAgICAgICAgICAmJiAoISAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICkKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpY19kZWxheSggMSApOworICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCBUUlVFLCBzcGlucyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGV4ZWN1dGUgdGFza3MgaW4gdGhlIHF1ZXVlICovCisgICAgICAgICAgICB3aGlsZSAoICggKHF1ZXVlLT50cV9uZnVsbCAhPSAwKSB8fCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgKQorICAgICAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJGb3VuZCB0aHVuazogJXAgaW4gcHJpbWFyeSBxdWV1ZSAlcCAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNlZSBpZiB3b3JrIGZvdW5kIGNhbiBiZSBmb3VuZCBpbiBhIGRlc2NlbmRhbnQgcXVldWUgKi8KKyAgICAgICAgICAgIGlmICggKF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKQorICAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSkpICE9IE5VTEwKKyAgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gd2hpbGUgKCAoISAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpKQorICAgICAgICAgICAgICAgfHwgKHF1ZXVlLT50cV9uZnVsbCAhPSAwKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiQWxsIHRhc2tzIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgaW4gcXVldWU6ICVwICglZClcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgLyogd2FpdCB3aGlsZSBhbGwgdGFza3MgYXJlIG5vdCBmaW5pc2hlZCBhbmQgbW9yZSB3b3JrIGZvdW5kCisgICAgICAgICAgIGluIGRlc2NlbmRhbnQgcXVldWVzICovCisKKyAgICAgICAgd2hpbGUgKCAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSkKKyAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSkpICE9IE5VTEwKKyAgICAgICAgICAgICAgKSB7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIk5vIHdvcmsgZm91bmQgaW4gZGVzY2VuZGVudCBxdWV1ZXMgb3IgYWxsIHdvcmsgZmluaXNoZWQgaW4gcXVldWU6ICVwICglZClcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgaWYgKCFpc19vdXRlcm1vc3QpIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gcmV0dXJuIGlmIE5PV0FJVCBwcmVzZW50IGFuZCBub3Qgb3V0ZXJtb3N0IHRhc2txICovCisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9yZWZfY291bnQtLTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxdWV1ZS0+dHFfcmVmX2NvdW50ID49IDAgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcSByZXR1cm4gZm9yIG5vd2FpdCBjYXNlICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgLyogV0FJVCB1bnRpbCBhbGwgdGFza3MgYXJlIGZpbmlzaGVkIGFuZCBubyBjaGlsZCBxdWV1ZXMgZXhpc3QgYmVmb3JlIHByb2NlZWRpbmcgKi8KKyAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICAgICAgd2hpbGUgKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkgfHwgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpIHsKKyAgICAgICAgICAgICAgICB0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9hbmNlc3Rvcl9xdWV1ZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAodGh1bmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gYW5jZXN0b3IgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCB0aHVuayA9PSBOVUxMLCBzcGlucyApOworCisgICAgICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8qIG9ubHkgdGhlIGFsbG9jYXRpbmcgdGhyZWFkIGNhbiBkZWFsbG9jYXRlIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgaWYgKHRhc2txX3RodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuIGZvciBub25fb3V0ZXJtb3N0IHF1ZXVlLCB3YWl0IGNhc2UgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBPdXRlcm1vc3QgUXVldWU6IHN0ZWFsIHdvcmsgZnJvbSBkZXNjZW5kYW50cyB1bnRpbCBhbGwgdGFza3MgYXJlIGZpbmlzaGVkICovCisKKyAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpKSB7CisgICAgICAgICAgICB0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS01QX1lJRUxEX1dIRU4oIHRodW5rID09IE5VTEwsIHNwaW5zICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZWVkIHRoaXMgYmFycmllciB0byBwcmV2ZW50IGRlc3RydWN0aW9uIG9mIHF1ZXVlIGJlZm9yZSB0aHJlYWRzIGhhdmUgYWxsIGV4ZWN1dGVkIGFib3ZlIGNvZGUgKi8KKyAgICAgICAgLyogVGhpcyBtYXkgbmVlZCB0byBiZSBkb25lIGVhcmxpZXIgd2hlbiBOT1dBSVQgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZSBvdXRlcm1vc3QgbGV2ZWwgKi8KKworICAgICAgICBpZiAoICFfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICkpIHsKKyAgICAgICAgICAgIC8qIHRoZSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUIGNhc2UgaXMgbm90IHlldCBoYW5kbGVkIGhlcmU7ICAgKi8KKyAgICAgICAgICAgIC8qIGZvciByaWdodCBub3csIGV2ZXJ5Ym9keSB3YWl0cywgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIGRlc3Ryb3lzIHRoZSAgKi8KKyAgICAgICAgICAgIC8qIHJlbWFpbmluZyBxdWV1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgIC8qIE5vdyBkZXN0cm95IHRoZSByb290IHF1ZXVlICovCisgICAgICAgICAgICBLRl9UUkFDRSgxMDAsICgiVCMlZCBCZWZvcmUgRGVsZXRpb24gb2YgdG9wLWxldmVsIFRhc2tRIGF0ICVwOlxuIiwgZ2xvYmFsX3RpZCwgcXVldWUgKSk7CisgICAgICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIC8qICB0aGUgcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKChxdWV1ZS0+dHEudHFfcGFyZW50ID09IE5VTEwpICYmIChxdWV1ZS0+dHFfbmV4dF9jaGlsZCA9PSBOVUxMKSk7CisKKyAgICAgICAgICAgIC8qICBjaGlsZHJlbiBtdXN0IGFsbCBiZSBnb25lIGJ5IG5vdyBiZWNhdXNlIG9mIGJhcnJpZXIgYWJvdmUgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8bnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID09IDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGk9MCwgdGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyBpKyssIHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAobnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISB0cS0+dHFfY3Vycl90aHVua1tpXSApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKiAgdW5saW5rIHRoZSByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgICAgICAgdHEgLT4gdHFfcm9vdCA9ICBOVUxMOworCisgICAgICAgICAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiQWZ0ZXIgRGVsZXRpb24gb2YgdG9wLWxldmVsIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrcSAoIHRxLCBxdWV1ZSwgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQgKTsKKworICAgICAgICAgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICAgICAgLyogcmVsZWFzZSB0aGUgd29ya2VycyBub3cgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1cCB0byBkYXRlICovCisgICAgICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCApOworICAgICAgICB9CisKKyAgICAgICAgdGggPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisKKyAgICAgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gMDsKKworICAgICAgICAvKiBSZXNldCBPUkRFUkVEIFNFQ1RJT04gdG8gcGFyYWxsZWwgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogaW4gc2VyaWFsIGV4ZWN1dGlvbiBjb250ZXh0LCBkZXF1ZXVlIHRoZSBsYXN0IHRhc2sgICovCisgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0LCBpZiB0aGVyZSB3ZXJlIGFueSB0YXNrcyBlbmNvdW50ZXJlZCAqLworCisgICAgICAgIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPiAwKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAxKTsKKworICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9kZXF1ZXVlX3Rhc2soZ2xvYmFsX3RpZCwgcXVldWUsIGluX3BhcmFsbGVsKTsKKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0spIHsKKyAgICAgICAgICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwgX19rbXBjX2VuZF90YXNrcV90YXNrKCkgKi8KKyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgICAgICAgICAvKiBpbnN0cnVtZW50YXRpb24gZG9lcyBjb3B5LW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8qIG5vIG5lZWQgZm9yIHRlc3RfdGhlbl9vciBjYWxsIHNpbmNlIGFscmVhZHkgbG9ja2VkICovCisgICAgICAgICAgICAgICAgdGh1bmstPnRoX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsIHRodW5rLCBxdWV1ZSkpOworCisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBkZXN0cm95IHRoZSB1bmF0dGFjaGVkIHNlcmlhbCBxdWV1ZSBub3cgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHdvcmsgdG8gZG8gKi8KKyAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIkJlZm9yZSBEZWxldGlvbiBvZiBTZXJpYWxpemVkIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGZvciAodGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKQorICAgICAgICAgICAgKytpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAxKTsKKyNlbmRpZgorICAgICAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciB1bmF0dGFjaGVkIHNlcmlhbCBxdWV1ZSAgKi8KKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU2VyaWFsaXplZCBUYXNrUSBhdCAlcCBkZWxldGVkIG9uICglZCkuXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogIEVucXVldWVzIGEgdGFzayBmb3IgdGh1bmsgcHJldmlvdXNseSBjcmVhdGVkIGJ5IF9fa21wY190YXNrX2J1ZmZlci4gKi8KKy8qICBSZXR1cm5zIG5vbnplcm8gaWYganVzdCBmaWxsZWQgdXAgcXVldWUgICovCisKK2ttcF9pbnQzMgorX19rbXBjX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaykKK3sKKyAgICBrbXBfaW50MzIgICAgICAgICAgcmV0OworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSk7ICAvKiAgdGh1bmstPnRoX3Rhc2sgaXMgYSByZWd1bGFyIHRhc2sgICovCisKKyAgICB0cSAgICAgICAgICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIHF1ZXVlICAgICAgID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCAmJiAodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpKQorICAgICAgICB0aHVuay0+dGhfdGFza251bSA9ICsrcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZzsKKworICAgIC8qIEZvciBzZXJpYWwgZXhlY3V0aW9uIGRlcXVldWUgdGhlIHByZWNlZGluZyB0YXNrIGFuZCBleGVjdXRlIGl0LCBpZiBvbmUgZXhpc3RzICovCisgICAgLyogVGhpcyBjYW5ub3QgYmUgdGhlIGxhc3QgdGFzay4gIFRoYXQgb25lIGlzIGhhbmRsZWQgaW4gX19rbXBjX2VuZF90YXNrcSAqLworCisgICAgaWYgKCFpbl9wYXJhbGxlbCAmJiBxdWV1ZS0+dHFfbmZ1bGwgPiAwKSB7CisgICAgICAgIGttcGNfdGh1bmtfdCAqcHJldl90aHVuazsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAxKTsKKworICAgICAgICBwcmV2X3RodW5rID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBpbl9wYXJhbGxlbCk7CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiVCMlZCBmb3VuZCB0aHVuazogJXAgaW4gc2VyaWFsIHF1ZXVlOiAlcFxuIiwgZ2xvYmFsX3RpZCwgcHJldl90aHVuaywgcXVldWUpKTsKKworICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgcHJldl90aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyAgICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZSAgICAqLworICAgIC8qIHZhcmlhYmxlcywgX19rbXBjX3Rhc2soKS4gIFRoZSBfX2ttcGNfdGFza19idWZmZXIgcm91dGluZSBjaGVja3MgdGhhdCB0aGUgICAgICovCisgICAgLyogdGFzayBxdWV1ZSBpcyBub3QgZnVsbCBhbmQgYWxsb2NhdGVzIGEgdGh1bmsgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvICAgICAgICAgKi8KKyAgICAvKiBfX2ttcGNfdGFzaygpKS4gIFNvLCB0aGUgZW5xdWV1ZSBiZWxvdyBzaG91bGQgbmV2ZXIgZmFpbCBkdWUgdG8gYSBmdWxsIHF1ZXVlLiAqLworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkFmdGVyIGVucXVldWVpbmcgdGhpcyBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIHJldCA9IF9fa21wX2VucXVldWVfdGFzayAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsICk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFzayBRdWV1ZSBsb29rcyBsaWtlIHRoaXMgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qICBlbnF1ZXVlcyBhIHRhc2txX3Rhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza3EgICovCisvKiAgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHVubGVzcyBpbiBhIHBhcmFsbGVsIGNvbnRleHQgICAgICAgICAgICAqLworCit2b2lkCitfX2ttcGNfdGFza3FfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgc3RhdHVzKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHEgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3FfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrUSBUYXNrIGFyZ3VtZW50IHRodW5rIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIHF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbG9jICk7CisKKyAgICAvKiAgdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOworCisgICAgLyogIG5vdCBzdXBwb3NlZCB0byBjYWxsIF9fa21wY190YXNrcV90YXNrIGlmIGl0J3MgYWxyZWFkeSBlbnF1ZXVlZCAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9PSBOVUxMKTsKKworICAgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKworICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKworICAgIHRodW5rLT50aF9zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBLTVBfTUIoKTsgIC8qICBmbHVzaCB0aHVuay0+dGhfc3RhdHVzIGJlZm9yZSB0YXNrcV90YXNrIGVucXVldWVkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uICAqLworCisgICAgLyogIGVucXVldWUgdGFza3FfdGFzayBpbiB0aHVuayBpbnRvIHNwZWNpYWwgc2xvdCBpbiBxdWV1ZSAgICAgKi8KKyAgICAvKiBHRUggLSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGxvY2sgdGFza3Egc2xvdCBzaW5jZSBvbmx5IG9uZSAqLworICAgIC8qICAgICAgIHRocmVhZCBlbnF1ZXVlcyAmIGFscmVhZHkgYSBsb2NrIHNldCBhdCBkZXF1ZXVlIHBvaW50ICovCisKKyAgICBxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9IHRodW5rOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcV90YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBlbmRzIGEgdGFza3FfdGFzazsgZG9uZSBnZW5lcmF0aW5nIHRhc2tzICAqLworCit2b2lkCitfX2ttcGNfZW5kX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaykKK3sKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGludCAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3FfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisgICAgdGlkICAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBsb2MgKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworI2lmIEtNUF9BUkNIX1g4NiB8fCBcCisgICAgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAmcXVldWUtPnRxX2ZsYWdzLCAoa21wX2ludDMyKSBUUUZfQUxMX1RBU0tTX1FVRVVFRCApOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0FMTF9UQVNLU19RVUVVRUQ7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKSB7CisgICAgICAgIC8qIE5vcm1hbGx5LCBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUoKSByZWZ1c2VzIHRvIHNjaGVkdWxlIHRoZSBsYXN0IHRhc2sgaW4gdGhlICovCisgICAgICAgIC8qIHF1ZXVlIGlmIFRRRl9JU19MQVNUUFJJVkFURSBzbyB3ZSBjYW4gcG9zaXRpdmVseSBpZGVudGlmeSB0aGF0IGxhc3QgdGFzayAgICAgICovCisgICAgICAgIC8qIGFuZCBydW4gaXQgd2l0aCBpdHMgVFFGX0lTX0xBU1RfVEFTSyBiaXQgdHVybmVkIG9uIGluIHRoX2ZsYWdzLiAgV2hlbiAgICAgICAgICovCisgICAgICAgIC8qIF9fa21wY19lbmRfdGFza3FfdGFzaygpIGlzIGNhbGxlZCB3ZSBhcmUgZG9uZSBnZW5lcmF0aW5nIGFsbCB0aGUgdGFza3MsIHNvICAgICovCisgICAgICAgIC8qIHdlIGtub3cgdGhlIGxhc3Qgb25lIGluIHRoZSBxdWV1ZSBpcyB0aGUgbGFzdHByaXZhdGUgdGFzay4gIE1hcmsgdGhlIHF1ZXVlICAgICovCisgICAgICAgIC8qIGFzIGhhdmluZyBnb3R0ZW4gdG8gdGhpcyBzdGF0ZSB2aWEgdHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLOyB3aGVuIHRoYXQgICAgICovCisgICAgICAgIC8qIHRhc2sgYWN0dWFsbHkgZXhlY3V0ZXMgbWFyayBpdCB2aWEgdGhfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLICh0aGlzIHRoX2ZsYWdzICovCisgICAgICAgIC8qIGJpdCBzaWduYWxzIHRoZSBpbnN0cnVtZW50ZWQgY29kZSB0byBkbyBjb3B5LW91dHMgYWZ0ZXIgZXhlY3V0aW9uKS4gICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCEgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIE5vIHN5bmNocm9uaXphdGlvbiBuZWVkZWQgZm9yIHNlcmlhbCBjb250ZXh0ICovCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyNpZiBLTVBfQVJDSF9YODYgfHwgXAorICAgIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX09SMzIoICZxdWV1ZS0+dHFfZmxhZ3MsIChrbXBfaW50MzIpIFRRRl9JU19MQVNUX1RBU0sgKTsKKyNlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbiB3aGVyZSBsYXN0IHRhc2sgaXMgZGVxdWV1ZWQgYnV0ICovCisgICAgICAgICAgICAvKiBmbGFnIGlzbid0IHZpc2libGUgeWV0IChub3Qgc3VyZSBhYm91dCB0aGlzKSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVxdWV1ZSB0YXNrcSB0aHVuayBmcm9tIGN1cnJfdGh1bmsgc3RhY2sgKi8KKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogcmV0dXJucyB0aHVuayBmb3IgYSByZWd1bGFyIHRhc2sgYmFzZWQgb24gdGFza3FfdGh1bmsgICAgICAgICAgICAgICovCisvKiAoX19rbXBjX3Rhc2txX3Rhc2sgZG9lcyB0aGUgYW5hbG9nb3VzIHRoaW5nIGZvciBhIFRRRl9UQVNLUV9UQVNLKSAgKi8KKwora21wY190aHVua190ICoKK19fa21wY190YXNrX2J1ZmZlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKQoreworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgKm5ld190aHVuazsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2tfYnVmZmVyIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICh0YXNrcV90aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyk7ICAvKiAgdGFza3FfdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisKKyAgICB0cSAgICAgICAgICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIHF1ZXVlICAgICAgID0gdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIC8qIFRoZSBpbnN0cnVtZW50YXRpb24gc2VxdWVuY2UgaXM6ICBfX2ttcGNfdGFza19idWZmZXIoKSwgaW5pdGlhbGl6ZSBwcml2YXRlICovCisgICAgLyogdmFyaWFibGVzLCBfX2ttcGNfdGFzaygpLiAgVGhlIF9fa21wY190YXNrX2J1ZmZlciByb3V0aW5lIGNoZWNrcyB0aGF0IHRoZSAgKi8KKyAgICAvKiB0YXNrIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCBhbGxvY2F0ZXMgYSB0aHVuayAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdG8gICAgICAqLworICAgIC8qIF9fa21wY190YXNrKCkpLiAgU28sIHdlIGNhbiBwcmUtYWxsb2NhdGUgYSB0aHVuayBoZXJlIGFzc3VtaW5nIGl0IHdpbGwgYmUgICovCisgICAgLyogdGhlIG5leHQgdG8gYmUgZW5xdWV1ZWQgaW4gX19rbXBjX3Rhc2soKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIG5ld190aHVuayA9IF9fa21wX2FsbG9jX3RodW5rIChxdWV1ZSwgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQpOworICAgIG5ld190aHVuay0+dGgudGhfc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgcXVldWUtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YTsKKyAgICBuZXdfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworICAgIG5ld190aHVuay0+dGhfdGFzayAgICAgICA9IHRhc2s7CisKKyAgICAvKiBHRUggLSBzaG91bGRuJ3QgbmVlZCB0byBsb2NrIHRoZSByZWFkIG9mIHRxX2ZsYWdzIGhlcmUgKi8KKyAgICBuZXdfdGh1bmstPnRoX2ZsYWdzICAgICAgPSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSU5URVJGQUNFX0ZMQUdTOworCisgICAgbmV3X3RodW5rLT50aF9zdGF0dXMgICAgID0gMDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKCEobmV3X3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiQ3JlYXRpbmcgUmVndWxhciBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBuZXdfdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2tfYnVmZmVyIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gbmV3X3RodW5rOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiNzk2OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzM1IEBACisvKgorICoga21wX3RocmVhZHByaXZhdGUuYyAtLSBPcGVuTVAgdGhyZWFkcHJpdmF0ZSBzdXBwb3J0IGxpYnJhcnkKKyAqICRSZXZpc2lvbjogNDI2MTggJAorICogJERhdGU6IDIwMTMtMDgtMjcgMDk6MTU6NDUgLTA1MDAgKFR1ZSwgMjcgQXVnIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFVTRV9DSEVDS1NfQ09NTU9OCisKKyNkZWZpbmUgS01QX0lOTElORV9TVUJSICAgICAgICAgMQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYworI2lmZGVmIEtNUF9JTkxJTkVfU1VCUgorX19mb3JjZWlubGluZQorI2VuZGlmCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgorX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBzdHJ1Y3QgY29tbW9uX3RhYmxlICp0YmwsIGludCBndGlkLCB2b2lkICpwY19hZGRyICkKKworeworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBjYWxsZWQgd2l0aCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICBkdW1wX2xpc3QoKTsKKyNlbmRpZgorCisgICAgZm9yICh0biA9IHRibC0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXTsgdG47IHRuID0gdG4tPm5leHQpIHsKKyAgICAgICAgaWYgKHRuLT5nYmxfYWRkciA9PSBwY19hZGRyKSB7CisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBmb3VuZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiB0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljCisjaWZkZWYgS01QX0lOTElORV9TVUJSCitfX2ZvcmNlaW5saW5lCisjZW5kaWYKK3N0cnVjdCBzaGFyZWRfY29tbW9uICoKK19fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCBzdHJ1Y3Qgc2hhcmVkX3RhYmxlICp0YmwsIGludCBndGlkLCB2b2lkICpwY19hZGRyICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqdG47CisKKyAgICBmb3IgKHRuID0gdGJsLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgeworICAgICAgICBpZiAodG4tPmdibF9hZGRyID09IHBjX2FkZHIpIHsKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb246IHRocmVhZCMlZCwgZm91bmQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gdG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBkYXRhIGluaXRpYWxpemVkIHN0b3JhZ2UuCisgKiAgICAgIEVpdGhlciB0aGUgdGVtcGxhdGUgaXMgTlVMTCBpbmRpY2F0aW5nIHplcm8gZmlsbCwKKyAqICAgICAgb3IgdGhlIHRlbXBsYXRlIGlzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZGF0YS4KKyAqLworCitzdGF0aWMgc3RydWN0IHByaXZhdGVfZGF0YSAqCitfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCB2b2lkICpwY19hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAqZDsKKyAgICBzaXplX3QgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAqcDsKKworICAgIGQgPSAoc3RydWN0IHByaXZhdGVfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICkgKTsKKy8qCisgICAgZC0+ZGF0YSA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgZC0+bmV4dCA9IDA7CisqLworICAgIGQtPnNpemUgPSBwY19zaXplOworICAgIGQtPm1vcmUgPSAxOworCisgICAgcCA9IChjaGFyKilwY19hZGRyOworCisgICAgZm9yIChpID0gcGNfc2l6ZTsgIGkgPiAwOyAtLWkpIHsKKyAgICAgICAgaWYgKCpwKysgIT0gJ1wwJykgeworICAgICAgICAgICAgZC0+ZGF0YSA9IF9fa21wX2FsbG9jYXRlKCBwY19zaXplICk7CisgICAgICAgICAgICBtZW1jcHkoIGQtPmRhdGEsIHBjX2FkZHIsIHBjX3NpemUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qCisgKiAgICAgIEluaXRpYWxpemUgdGhlIGRhdGEgYXJlYSBmcm9tIHRoZSB0ZW1wbGF0ZS4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfY29weV9jb21tb25fZGF0YSggdm9pZCAqcGNfYWRkciwgc3RydWN0IHByaXZhdGVfZGF0YSAqZCApCit7CisgICAgY2hhciAqYWRkciA9IChjaGFyICopIHBjX2FkZHI7CisgICAgaW50ICAgaSwgb2Zmc2V0OworCisgICAgZm9yIChvZmZzZXQgPSAwOyBkICE9IDA7IGQgPSBkLT5uZXh0KSB7CisgICAgICAgIGZvciAoaSA9IGQtPm1vcmU7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGlmIChkLT5kYXRhID09IDApCisgICAgICAgICAgICAgICAgbWVtc2V0KCAmIGFkZHJbIG9mZnNldCBdLCAnXDAnLCBkLT5zaXplICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWVtY3B5KCAmIGFkZHJbIG9mZnNldCBdLCBkLT5kYXRhLCBkLT5zaXplICk7CisgICAgICAgICAgICBvZmZzZXQgKz0gZC0+c2l6ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogd2UgYXJlIGNhbGxlZCBmcm9tIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCkgd2l0aCBfX2ttcF9pbml0el9sb2NrIGhlbGQuICovCit2b2lkCitfX2ttcF9jb21tb25faW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworICAgICAgICBpbnQgcTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaW50IGd0aWQ7CisjZW5kaWYKKworICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBOVUxMOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIC8qIHZlcmlmeSB0aGUgdWJlciBtYXN0ZXJzIHdlcmUgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgZm9yKGd0aWQgPSAwIDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGd0aWQrKyApCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXSApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBxID0gMDsgcTwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKQorICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhX19rbXBfcm9vdFtndGlkXS0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9wcmlfY29tbW9uLT5kYXRhW3FdICk7CisvKiAgICAgICAgICAgICAgICAgICAgX19rbXBfcm9vdFsgZ2l0ZCBdLT4gci5yX3ViZXJfdGhyZWFkIC0+IHRoLnRoX3ByaV9jb21tb24gLT4gZGF0YVsgcSBdID0gMDsqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpCisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdID0gMDsKKworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgVFJVRSk7CisgICAgfQorfQorCisvKiBDYWxsIGFsbCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhIGJlbG9uZ2luZyB0byBhbGwgdGhyZWFkcy4KKyAgIEN1cnJlbnRseSB1bnVzZWQhICovCit2b2lkCitfX2ttcF9jb21tb25fZGVzdHJveSggdm9pZCApCit7CisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKyAgICAgICAgaW50IHE7CisKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsKKworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKSB7CisgICAgICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisgICAgICAgICAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgKmRfdG47CisKKyAgICAgICAgICAgIC8qICBDKysgZGVzdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBwZXIgdGhyZWFkIGJlZm9yZSBleGl0aW5nICAqLworICAgICAgICAgICAgLyogIGRvbid0IGNhbGwgZGVzdHJ1Y3RvcnMgZm9yIG1hc3RlciB0aHJlYWQgdGhvdWdoIHVubGVzcyB3ZSB1c2VkIGNvcHkgY29uc3RydWN0b3IgKi8KKworICAgICAgICAgICAgZm9yIChkX3RuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXTsgZF90bjsgZF90biA9IGRfdG4tPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGd0aWQgPSAwOyBndGlkIDwgX19rbXBfYWxsX250aDsgKytndGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBkX3RuLT5nYmxfYWRkciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcnYpIChkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGd0aWQgPSAwOyBndGlkIDwgX19rbXBfYWxsX250aDsgKytndGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBkX3RuLT5nYmxfYWRkciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9yKSAoZF90bi0+b2JqX2luaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENhbGwgYWxsIGRlc3RydWN0b3JzIGZvciB0aHJlYWRwcml2YXRlIGRhdGEgYmVsb25naW5nIHRvIHRoaXMgdGhyZWFkICovCit2b2lkCitfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBpbnQgZ3RpZCApCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKworICAgICAgICBpZiggVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworCisgICAgICAgICAgICAvKiBDYW5ub3QgZG8gdGhpcyBoZXJlIHNpbmNlIG5vdCBhbGwgdGhyZWFkcyBoYXZlIGRlc3Ryb3llZCB0aGVpciBkYXRhICovCisgICAgICAgICAgICAvKiBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOyAqLworCisgICAgICAgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZDsgdG47IHRuID0gdG4tPmxpbmspIHsKKworICAgICAgICAgICAgICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRuLT5nYmxfYWRkciApOworCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZF90biApOworCisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9ydikgKGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9yKSAoZF90bi0+b2JqX2luaXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS0NfVFJBQ0UoIDMwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBjb21wbGV0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCitzdGF0aWMgdm9pZAorZHVtcF9saXN0KCB2b2lkICkKK3sKKyAgICBpbnQgcCwgcTsKKworICAgIGZvciAocCA9IDA7IHAgPCBfX2ttcF9hbGxfbnRoOyArK3ApIHsKKyAgICAgICAgaWYoICFfX2ttcF90aHJlYWRzW3BdICkgY29udGludWU7CisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF90aHJlYWRzWyBwIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIHEgXSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlx0ZHVtcF9saXN0OiBndGlkOiVkIGFkZHJlc3Nlc1xuIiwgcCApICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1sgcCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBxIF07IHRuOyB0biA9IHRuLT5uZXh0KSAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlx0ZHVtcF9saXN0OiBUSFJFQURQUklWQVRFOiBTZXJpYWwgJXAgLT4gUGFyYWxsZWwgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bi0+Z2JsX2FkZHIsIHRuLT5wYXJfYWRkciApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIEtNUF9UQVNLX0NPTU1PTl9ERUJVRyAqLworCisKKy8qCisgKiBOT1RFOiB0aGlzIHJvdXRpbmUgaXMgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgc2VyaWFsIHBhcnQgb2YgdGhlIHByb2dyYW0uCisgKi8KKwordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICoqbG5rX3RuLCAqZF90bjsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0gJiYKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUgPT0gMCApOworCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApOworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBwY19zaXplICk7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSAwOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSAwOzsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IDA7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOworICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisqLworICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuLCAqKnR0OworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAqZF90bjsKKworICAgIC8qICsrKysrKysrKyBTVEFSVCBPRiBDUklUSUNBTCBTRUNUSU9OICsrKysrKysrKyAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICB0biA9IChzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiAoc3RydWN0IHByaXZhdGVfY29tbW9uKSApOworCisgICAgdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKTsgICAgIC8qIE9ubHkgdGhlIE1BU1RFUiBkYXRhIHRhYmxlIGV4aXN0cy4gKi8KKworICAgIGlmIChkX3RuICE9IDApIHsKKyAgICAgICAgLyogVGhpcyB0aHJlYWRwcml2YXRlIHZhcmlhYmxlIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gKi8KKworICAgICAgICBpZiAoIGRfdG4tPnBvZF9pbml0ID09IDAgJiYgZF90bi0+b2JqX2luaXQgPT0gMCApIHsKKyAgICAgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5jdC5jdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBmcm9tIHNjcmF0Y2ggc28gbm8gcHJvdG90eXBlIGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZGF0YSBpbml0aWFsaXplIHRoZSBwcm90b3R5cGUgc2luY2UgaXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3J2KSAoZF90bi0+b2JqX2luaXQsIHBjX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+Y3QuY3RvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBmcm9tIHNjcmF0Y2ggc28gbm8gcHJvdG90eXBlIGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcikgKGRfdG4tPm9ial9pbml0LCBwY19hZGRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKipsbmtfdG47CisKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKyAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgcGNfc2l6ZSApOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5jdC5jdG9yID0gMDsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gMDsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IDA7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOworICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorCisgICAgdG4tPmNtbl9zaXplID0gZF90bi0+Y21uX3NpemU7CisKKyAgICBpZiAoIChfX2ttcF9mb3JlaWduX3RwKSA/IChLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOiAoS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICB0bi0+cGFyX2FkZHIgPSAodm9pZCAqKSBwY19hZGRyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdG4tPnBhcl9hZGRyID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIHRuLT5jbW5fc2l6ZSApOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgLyogKysrKysrKysrIEVORCBPRiBDUklUSUNBTCBTRUNUSU9OICsrKysrKysrKyAqLworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAgICAgaWYgKHBjX3NpemUgPiBkX3RuLT5jbW5fc2l6ZSkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogVEhSRUFEUFJJVkFURTogJXAgKCUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1VJTlRQVFJfU1BFQyAiICwlIiBLTVBfVUlOVFBUUl9TUEVDICIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjX2FkZHIsIHBjX3NpemUsIGRfdG4tPmNtbl9zaXplICkgKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICB0dCA9ICYoX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIGlmICgqdHQgIT0gMCkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiBXQVJOSU5HISB0aHJlYWQjJWQ6IGNvbGxpc2lvbiBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIH0KKyNlbmRpZgorICAgIHRuLT5uZXh0ID0gKnR0OworICAgICp0dCA9IHRuOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogdGhyZWFkIyVkLCBpbnNlcnRlZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIGR1bXBfbGlzdCggKTsKKyNlbmRpZgorCisgICAgLyogTGluayB0aGUgbm9kZSBpbnRvIGEgc2ltcGxlIGxpc3QgKi8KKworICAgIHRuLT5saW5rID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZDsKKyAgICBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkID0gdG47CisKKyNpZmRlZiBCVUlMRF9UVgorICAgIF9fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIF9fa21wX3RocmVhZHNbIGd0aWQgXSwgdG4tPmdibF9hZGRyLCB0bi0+cGFyX2FkZHIgKTsKKyNlbmRpZgorCisgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/IChLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOiAoS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkKKyAgICAgICAgcmV0dXJuIHRuOworCisgICAgLyoKKyAgICAgKiBpZiBDKysgb2JqZWN0IHdpdGggY29weSBjb25zdHJ1Y3RvciwgdXNlIGl0OworICAgICAqIGVsc2UgaWYgQysrIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9yLCB1c2UgaXQgZm9yIHRoZSBub24tbWFzdGVyIGNvcGllcyBvbmx5OworICAgICAqIGVsc2UgdXNlIHBvZF9pbml0IGFuZCBtZW1jcHkKKyAgICAgKgorICAgICAqIEMrKyBjb25zdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBub24tbWFzdGVyIHRocmVhZCBvbiBhbGxvY2F0ZQorICAgICAqIEMrKyBjb3B5IGNvbnN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRocmVhZCBvbiBhbGxvY2F0ZQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBDKysgb2JqZWN0IHdpdGggY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzOworICAgICAqIGRvbid0IGNhbGwgY29uc3RydWN0b3JzIGZvciBtYXN0ZXIgdGhyZWFkIHRob3VnaAorICAgICAqLworICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgaWYgKCBkX3RuLT5jdC5jdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jdC5jdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgIH0gZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgIH0gZWxzZSBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikgeworICAgICAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBkX3RuLT5jdC5jdG9yICE9IDAgKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jdC5jdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgfSBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3IgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9yKSAodG4tPnBhcl9hZGRyLCBkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgIH0gZWxzZSBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikgeworICAgICAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOworICAgICAgICB9CisgICAgfQorLyogIUJVSUxEX09QRU5NUF9DCisgICAgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpCisgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsgKi8KKworICAgIHJldHVybiB0bjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBXZSBhcmUgY3VycmVudGx5IHBhcmFsbGVsLCBhbmQgd2Uga25vdyB0aGUgdGhyZWFkIGlkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyBAaW5ncm91cCBUSFJFQURQUklWQVRFCisKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIGJlaW5nIHByaXZhdGl6ZWQgCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGNjdG9yICBwb2ludGVyIHRvIGNvcHkgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGR0b3IgIHBvaW50ZXIgdG8gZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKworIFJlZ2lzdGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZCBwcml2YXRlIGRhdGEuCisgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBleGVjdXRpbmcgaW4gcGFyYWxsZWwsIHdoZW4gd2Uga25vdyB0aGUgdGhyZWFkIGlkLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyKGlkZW50X3QgKmxvYywgdm9pZCAqZGF0YSwga21wY19jdG9yIGN0b3IsIGttcGNfY2N0b3IgY2N0b3IsIGttcGNfZHRvciBkdG9yKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuLCAqKmxua190bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcjogY2FsbGVkXG4iICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICAgIEtNUF9BU1NFUlQoIGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLCAtMSwgZGF0YSApOworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSBjY3RvcjsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IGR0b3I7CisvKgorICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CisKK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcmV0OworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgY2FsbGVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgaWYgKCEgX19rbXBfaW5pdF9zZXJpYWwpCisgICAgICAgIEtNUF9GQVRBTCggUlRMTm90SW5pdGlhbGl6ZWQgKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlICYmICEgX19rbXBfZm9yZWlnbl90cCApIHsKKyAgICAgICAgLyogVGhlIHBhcmFsbGVsIGFkZHJlc3Mgd2lsbCBORVZFUiBvdmVybGFwIHdpdGggdGhlIGRhdGFfYWRkcmVzcyAqLworICAgICAgICAvKiBka3A6IDNyZCBhcmcgdG8ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSgpIGlzIHRoZSBkYXRhX2FkZHJlc3M7IHVzZSBkYXRhX2FkZHJlc3MgPSBkYXRhICovCisKKyAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBwcml2YXRlIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisKKyAgICAgICAgcmV0ID0gZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtDX1RSQUNFKCA1MCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCB0cnkgdG8gZmluZCBwcml2YXRlIGRhdGEgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgZGF0YSApICk7CisgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF0tPnRoLnRoX3ByaV9jb21tb24sIGdsb2JhbF90aWQsIGRhdGEgKTsKKworICAgICAgICBpZiAoIHRuICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGZvdW5kIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgICAgICAgICBpZiAoKHNpemVfdCkgc2l6ZSA+IHRuLT5jbW5fc2l6ZSkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiVEhSRUFEUFJJVkFURTogJXAgKCUiIEtNUF9VSU5UUFRSX1NQRUMgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgdG4tPmNtbl9zaXplICkgKTsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFRQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgICAgICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgICAgIHRuID0ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0bi0+cGFyX2FkZHI7CisgICAgfQorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCByZXQgKSApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIAorIEBwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIHByaXZhdGl6ZSAKKyBAcGFyYW0gc2l6ZSAgc2l6ZSBvZiBkYXRhIHRvIHByaXZhdGl6ZSAKKyBAcGFyYW0gY2FjaGUgIHBvaW50ZXIgdG8gY2FjaGUgCisgQHJldHVybiBwb2ludGVyIHRvIHByaXZhdGUgc3RvcmFnZSAKKworIEFsbG9jYXRlIHByaXZhdGUgc3RvcmFnZSBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhLiAKKyovCit2b2lkICoKK19fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCgKKyAgICBpZGVudF90ICogIGxvYywKKyAgICBrbXBfaW50MzIgIGdsb2JhbF90aWQsICAgLy8gZ3RpZC4KKyAgICB2b2lkICogICAgIGRhdGEsICAgICAgICAgLy8gUG9pbnRlciB0byBvcmlnaW5hbCBnbG9iYWwgdmFyaWFibGUuCisgICAgc2l6ZV90ICAgICBzaXplLCAgICAgICAgIC8vIFNpemUgb2Ygb3JpZ2luYWwgZ2xvYmFsIHZhcmlhYmxlLgorICAgIHZvaWQgKioqICAgY2FjaGUKKykgeworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgY2FsbGVkIHdpdGggY2FjaGU6ICVwLCBhZGRyZXNzOiAlcCwgc2l6ZTogJSIKKyAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCAqY2FjaGUsIGRhdGEsIHNpemUgKSApOworCisgICAgaWYgKCBUQ1JfUFRSKCpjYWNoZSkgPT0gMCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGdsb2JhbF90aWQgKTsKKworICAgICAgICBpZiAoIFRDUl9QVFIoKmNhY2hlKSA9PSAwKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF90cF9jYWNoZWQgPSAxOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgdm9pZCAqKiBteV9jYWNoZTsKKyAgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgbXlfY2FjaGUgPSAodm9pZCoqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZiggdm9pZCAqICkgKiBfX2ttcF90cF9jYXBhY2l0eSArIHNpemVvZiAoIGttcF9jYWNoZWRfYWRkcl90ICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gemVybyB0aGUgYWxsb2NhdGVkIG1lbW9yeTsgX19rbXBfYWxsb2NhdGUgZG9lcyB0aGF0LgorICAgICAgICAgICAgS0NfVFJBQ0UoIDUwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBhbGxvY2F0ZWQgY2FjaGUgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIG15X2NhY2hlICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVE9ETzogZnJlZSBhbGwgdGhpcyBtZW1vcnkgaW4gX19rbXBfY29tbW9uX2Rlc3Ryb3kgdXNpbmcgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICovCisgICAgICAgICAgICAvKiBBZGQgYWRkcmVzcyBvZiBteWNhY2hlIHRvIGxpbmtlZCBsaXN0IGZvciBjbGVhbnVwIGxhdGVyICAqLworICAgICAgICAgICAga21wX2NhY2hlZF9hZGRyX3QgKnRwX2NhY2hlX2FkZHI7CisKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgPSAoa21wX2NhY2hlZF9hZGRyX3QgKikgJiBteV9jYWNoZVtfX2ttcF90cF9jYXBhY2l0eV07CisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyIC0+IGFkZHIgPSBteV9jYWNoZTsKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgLT4gbmV4dCA9IF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IHRwX2NhY2hlX2FkZHI7CisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICBUQ1dfUFRSKCAqY2FjaGUsIG15X2NhY2hlKTsKKworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGdsb2JhbF90aWQgKTsKKyAgICB9CisKKyAgICB2b2lkICpyZXQ7CisgICAgaWYgKChyZXQgPSBUQ1JfUFRSKCgqY2FjaGUpWyBnbG9iYWxfdGlkIF0pKSA9PSAwKSB7CisgICAgICAgIHJldCA9IF9fa21wY190aHJlYWRwcml2YXRlKCBsb2MsIGdsb2JhbF90aWQsIGRhdGEsIChzaXplX3QpIHNpemUpOworCisgICAgICAgIFRDV19QVFIoICgqY2FjaGUpWyBnbG9iYWxfdGlkIF0sIHJldCk7CisgICAgfQorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgZXhpdGluZzsgcmV0dXJuIHZhbHVlID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcmV0ICkgKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIGJlaW5nIHByaXZhdGl6ZWQgCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGNjdG9yICBwb2ludGVyIHRvIGNvcHkgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGR0b3IgIHBvaW50ZXIgdG8gZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gdmVjdG9yX2xlbmd0aCBsZW5ndGggb2YgdGhlIHZlY3RvciAoYnl0ZXMgb3IgZWxlbWVudHM/KQorIFJlZ2lzdGVyIHZlY3RvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyggaWRlbnRfdCAqbG9jLCB2b2lkICpkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjOiBjYWxsZWRcbiIgKSApOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAvKiBjb3B5IGNvbnN0cnVjdG9yIG11c3QgYmUgemVybyBmb3IgY3VycmVudCBjb2RlIGdlbiAoTm92IDIwMDIgLSBqcGgpICovCisgICAgS01QX0FTU0VSVCggY2N0b3IgPT0gMCk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBkYXRhICk7ICAgICAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IGRhdGE7CisKKyAgICAgICAgZF90bi0+Y3QuY3RvcnYgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3J2ID0gY2N0b3I7CisgICAgICAgIGRfdG4tPmR0LmR0b3J2ID0gZHRvcjsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gVFJVRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IChzaXplX3QpIHZlY3Rvcl9sZW5ndGg7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdXRpbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjM5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIGttcF91dGlsaXR5LmMgLS0gVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIE9wZW5NUCBzdXBwb3J0IGxpYnJhcnkuCisgKiAkUmV2aXNpb246IDQyNTg4ICQKKyAqICREYXRlOiAyMDEzLTA4LTEzIDAxOjI2OjAwIC0wNTAwIChUdWUsIDEzIEF1ZyAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdW5rbm93biA9ICJ1bmtub3duIjsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogTk9URTogSWYgY2FsbGVkIGJlZm9yZSBzZXJpYWxfaW5pdGlhbGl6ZSAoaS5lLiBmcm9tIHJ1bnRpbWVfaW5pdGlhbGl6ZSksIHRoZW4gKi8KKy8qIHRoZSBkZWJ1Z2dpbmcgcGFja2FnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCBhbmQgb25seSAiMCIgd2lsbCBwcmludCAgICovCisvKiBkZWJ1Z2dpbmcgb3V0cHV0IHNpbmNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaGF2ZSBub3QgYmVlbiByZWFkLiAgICAgICAgICAqLworCitzdGF0aWMgaW50IHRyYWNlX2xldmVsID0gNTsKKworLyoKKyAqIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIFBIWV9JRCAgICAgICA9IEFQSUNfSUQgPj4gTE9HX0lEX0JJVFMKKyAqLworaW50CitfX2ttcF9nZXRfcGh5c2ljYWxfaWQoIGludCBsb2dfcGVyX3BoeSwgaW50IGFwaWNfaWQgKQoreworICAgaW50IGluZGV4X2xzYiwgaW5kZXhfbXNiLCB0ZW1wOworCisgICBpZiAobG9nX3Blcl9waHkgPiAxKSB7CisJaW5kZXhfbHNiID0gMDsKKwlpbmRleF9tc2IgPSAzMTsKKworCXRlbXAgPSBsb2dfcGVyX3BoeTsKKyAgICAgICAgd2hpbGUgKCAodGVtcCAmIDEpID09IDAgKSB7CisJICAgIHRlbXAgID4+PSAxOworCSAgICBpbmRleF9sc2IrKzsKKwl9CisKKwl0ZW1wID0gbG9nX3Blcl9waHk7CisJd2hpbGUgKCAodGVtcCAmIDB4ODAwMDAwMDApPT0wICkgeworCSAgICB0ZW1wIDw8PSAxOworCSAgICBpbmRleF9tc2ItLTsKKwl9CisKKwkvKiBJZiA+MSBiaXRzIHdlcmUgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBoaWdoZXIgcG93ZXIgb2YgMiAqLworCWlmIChpbmRleF9sc2IgIT0gaW5kZXhfbXNiKSBpbmRleF9tc2IrKzsKKworCXJldHVybiAoIChpbnQpIChhcGljX2lkID4+IGluZGV4X21zYikgKTsKKyAgIH0KKworICAgcmV0dXJuIGFwaWNfaWQ7Cit9CisKKworLyoKKyAqIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIExPR19JRCAgICAgICA9IEFQSUNfSUQgJiAoKCAxIDw8IExPR19JRF9CSVRTICkgLSAxICkKKyAqLworaW50CitfX2ttcF9nZXRfbG9naWNhbF9pZCggaW50IGxvZ19wZXJfcGh5LCBpbnQgYXBpY19pZCApCit7CisgICB1bnNpZ25lZCBjdXJyZW50X2JpdDsKKyAgIGludCBiaXRzX3NlZW47CisgICB1bnNpZ25lZCBtYXNrOworCisgICBpZiAobG9nX3Blcl9waHkgPD0gMSkgcmV0dXJuICggMCApOworCisgICBiaXRzX3NlZW4gPSAwOworCisgICBmb3IgKGN1cnJlbnRfYml0ID0gMTsgbG9nX3Blcl9waHkgIT0gMDsgY3VycmVudF9iaXQgPDw9IDEpIHsKKwlpZiAoIGxvZ19wZXJfcGh5ICYgY3VycmVudF9iaXQgKSB7CisJICAgIGxvZ19wZXJfcGh5ICY9IH5jdXJyZW50X2JpdDsKKwkgICAgYml0c19zZWVuKys7CisJfQorICAgfQorCisgICAvKiBJZiBleGFjdGx5IDEgYml0IHdhcyBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGxvd2VyIHBvd2VyIG9mIDIgKi8KKyAgIGlmIChiaXRzX3NlZW4gPT0gMSkgeworCWN1cnJlbnRfYml0ID4+PSAxOworICAgfQorCisgICByZXR1cm4gKCAoaW50KSAoKGN1cnJlbnRfYml0IC0gMSkgJiBhcGljX2lkKSApOworfQorCisKK3N0YXRpYwora21wX3VpbnQ2NAorX19rbXBfcGFyc2VfZnJlcXVlbmN5KCAgICAgICAgLy8gUjogRnJlcXVlbmN5IGluIEh6LgorICAgIGNoYXIgY29uc3QgKiBmcmVxdWVuY3kgICAgLy8gSTogRmxvYXQgbnVtYmVyIGFuZCB1bml0OiBNSHosIEdIeiwgb3IgVEd6LgorKSB7CisKKyAgICBkb3VibGUgICAgICAgdmFsdWUgID0gMC4wOworICAgIGNoYXIgY29uc3QgKiB1bml0ICAgPSBOVUxMOworICAgIGttcF91aW50NjQgICByZXN1bHQgPSB+IDA7CisKKyAgICBpZiAoIGZyZXF1ZW5jeSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07IC8vIGlmCisgICAgdmFsdWUgPSBzdHJ0b2QoIGZyZXF1ZW5jeSwgKGNoYXIgKiAqKSAmIHVuaXQgKTsgLy8gc3RydG9kKCkgZG9lcyBub3QgbGlrZSAiY2hhciBjb250cyAqIi4KKyAgICBpZiAoIDAgPCB2YWx1ZSAmJiB2YWx1ZSA8PSBEQkxfTUFYICkgeyAgICAgICAgICAvLyBHb29kIHZhbHVlIChub3Qgb3ZlcmZsb3csIHVuZGVyZmxvdywgZXRjKS4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHVuaXQsICJNSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzY7CisgICAgICAgIH0gZWxzZSBpZiAoIHN0cmNtcCggdW5pdCwgIkdIeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrOTsKKyAgICAgICAgfSBlbHNlIGlmICggc3RyY21wKCB1bml0LCAiVEh6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSsxMjsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLy8gV3JvbmcgdW5pdC4KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHJlc3VsdDsKKworfTsgLy8gZnVuYyBfX2ttcF9wYXJzZV9jcHVfZnJlcXVlbmN5CisKK3ZvaWQKK19fa21wX3F1ZXJ5X2NwdWlkKCBrbXBfY3B1aW5mb190ICpwICkKK3sKKyAgICBzdHJ1Y3Qga21wX2NwdWlkIGJ1ZjsKKyAgICBpbnQgbWF4X2FyZzsKKyAgICBpbnQgbG9nX3Blcl9waHk7CisgICAgaW50IGNmbHVzaF9zaXplOworCisgICAgcC0+aW5pdGlhbGl6ZWQgPSAxOworCisgICAgcC0+c3NlMiA9IDE7IC8vIEFzc3VtZSBTU0UyIGJ5IGRlZmF1bHQuCisKKyAgICBfX2ttcF94ODZfY3B1aWQoIDAsIDAsICZidWYgKTsKKworICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgMCwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisKKyAgICBtYXhfYXJnID0gYnVmLmVheDsKKworICAgIHAtPmFwaWNfaWQgPSAtMTsKKworICAgIGlmIChtYXhfYXJnID49IDEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGttcF91aW50MzIgdCwgZGF0YVsgNCBdOworCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggMSwgMCwgJmJ1ZiApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworCisgICAgICAgIHsKKyNkZWZpbmUgZ2V0X3ZhbHVlKHJlZyxsbyxtYXNrKSAoICggKCByZWcgKSA+PiAoIGxvICkgKSAmICggbWFzayAgKSApCisKKyAgICAgICAgICAgIHAtPnNpZ25hdHVyZSA9IGJ1Zi5lYXg7CisgICAgICAgICAgICBwLT5mYW1pbHkgICAgPSAgIGdldF92YWx1ZSggYnVmLmVheCwgMjAsIDB4ZmYgKSAgICAgICAgKyBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDgsIDB4MGYgKTsKKyAgICAgICAgICAgIHAtPm1vZGVsICAgICA9ICggZ2V0X3ZhbHVlKCBidWYuZWF4LCAxNiwgMHgwZiApIDw8IDQgKSArIGdldF92YWx1ZSggYnVmLmVheCwgNCwgMHgwZiApOworICAgICAgICAgICAgcC0+c3RlcHBpbmcgID0gICBnZXRfdmFsdWUoIGJ1Zi5lYXgsICAwLCAweDBmICk7CisKKyN1bmRlZiBnZXRfdmFsdWUKKworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBmYW1pbHkgPSAlZCwgbW9kZWwgPSAlZCwgc3RlcHBpbmcgPSAlZFxuIiwgcC0+ZmFtaWx5LCBwLT5tb2RlbCwgcC0+c3RlcHBpbmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgZm9yICggdCA9IGJ1Zi5lYngsIGkgPSAwOyBpIDwgNDsgdCA+Pj0gOCwgKytpICkgeworICAgICAgICAgICAgZGF0YVsgaSBdID0gKHQgJiAweGZmKTsKKyAgICAgICAgfTsgLy8gZm9yCisKKyAgICAgICAgcC0+c3NlMiA9ICggYnVmLmVkeCA+PiAyNiApICYgMTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gNCkgJiAxICkgeworICAgICAgICAgICAgLyogVFNDIC0gVGltZXN0YW1wIENvdW50ZXIgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFRTQyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gOCkgJiAxICkgeworICAgICAgICAgICAgLyogQ1g4IC0gQ01QWENIRzhCIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDWDgiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFQSUMgLSBMb2NhbCBBUElDIFByZXNlbnQgKG11bHRpLXByb2Nlc3NvciBvcGVyYXRpb24gc3VwcG9ydCAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBUElDIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxNSkgJiAxICkgeworICAgICAgICAgICAgLyogQ01PViAtIENvbmRpdGlvbmFsIE1PVmUgSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENNT1YiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBQU04gLSBQcm9jZXNzb3IgU2VyaWFsIE51bWJlciBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgUFNOIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxOSkgJiAxICkgeworICAgICAgICAgICAgLyogQ0xGVUxTSCAtIENhY2hlIEZsdXNoIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgY2ZsdXNoX3NpemUgPSBkYXRhWyAxIF0gKiA4OyAgICAvKiBCaXRzIDE1LTA4OiBDTEZMVVNIIGxpbmUgc2l6ZSA9IDggKDY0IGJ5dGVzKSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDTEZMVVNIKCVkYikiLCBjZmx1c2hfc2l6ZSApICk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIxKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBEVEVTIC0gRGVidWcgVHJhY2UgJiBFTU9OIFN0b3JlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIERURVMiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIyKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBQ1BJIC0gQUNQSSBTdXBwb3J0IEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBQ1BJIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMykgJiAxICkgeworICAgICAgICAgICAgLyogTU1YIC0gTXVsdGltZWRpYSBFeHRlbnNpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIE1NWCIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjUpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNTRSAtIFNTRSBJbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU1NFIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNikgJiAxICkgeworICAgICAgICAgICAgLyogU1NFMiAtIFNTRTIgSW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNTRTIiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI3KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTTEZTTlAgLSBTZWxmLVNub29waW5nIENhY2hlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNMRlNOUCIgKSApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAgICAgX19rbXBfaHRfY2FwYWJsZSA9IEZBTFNFOworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI4KSAmIDEgKSB7CisKKyAgICAgICAgICAgIC8qIEhUIC0gUHJvY2Vzc29yIGlzIEhUIEVuYWJsZWQgKGZvcm1lcmx5IEpUKSAqLworICAgICAgICAgICAgX19rbXBfaHRfY2FwYWJsZSA9IFRSVUU7CisKKyAgICAgICAgICAgIC8qIEJpdHMgMjMtMTY6IExvZ2ljYWwgUHJvY2Vzc29ycyBwZXIgUGh5c2ljYWwgUHJvY2Vzc29yICgxIGZvciBQNCkgKi8KKyAgICAgICAgICAgIGxvZ19wZXJfcGh5ID0gZGF0YVsgMiBdOworICAgICAgICAgICAgX19rbXBfaHRfbG9nX3Blcl9waHkgPSBsb2dfcGVyX3BoeTsKKworICAgICAgICAgICAgcC0+YXBpY19pZCAgICAgPSBkYXRhWyAzIF07IC8qIEJpdHMgMzEtMjQ6IFByb2Nlc3NvciBJbml0aWFsIEFQSUMgSUQgKFgpICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEhUKCVkIFRQVXMpIiwgbG9nX3Blcl9waHkgKSApOworCisgICAgICAgICAgICBpZiggbG9nX3Blcl9waHkgPiAxICkgeworICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgdG8gMWsgRk9SIEpULWVuYWJsZWQgcHJvY2Vzc29ycyAoNGsgb24gT1MgWCopICovCisjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgIHAtPmNwdV9zdGFja29mZnNldCA9IDQgKiAxMDI0OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwLT5jcHVfc3RhY2tvZmZzZXQgPSAxICogMTAyNDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwLT5waHlzaWNhbF9pZCA9IF9fa21wX2dldF9waHlzaWNhbF9pZCggbG9nX3Blcl9waHksIHAtPmFwaWNfaWQgKTsKKyAgICAgICAgICAgIHAtPmxvZ2ljYWxfaWQgID0gX19rbXBfZ2V0X2xvZ2ljYWxfaWQoIGxvZ19wZXJfcGh5LCBwLT5hcGljX2lkICk7CisgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyOSkgJiAxICkgeworICAgICAgICAgICAgLyogQVRIUk9UTCAtIEF1dG9tYXRpYyBUaHJvdHRsZSBDb250cm9sICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFUSFJPVEwiICkgKTsKKyAgICAgICAgfQorICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIF1cbiIgKSApOworCisgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gbWF4X2FyZzsgKytpKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoIGksIDAsICZidWYgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoICJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworICAgICAgICB9CisjZW5kaWYKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIHAtPnJ0bSA9IDA7CisgICAgICAgIGlmIChtYXhfYXJnID4gNykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUlRNIGJpdCBDUFVJRC4wNzpFQlgsIGJpdCAxMSAqLworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDcsIDAsICZidWYpOworICAgICAgICAgICAgcC0+cnRtID0gKGJ1Zi5lYnggPj4gMTEpICYgMTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgUlRNIiApICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH07IC8vIGlmCisKKyAgICB7IC8vIFBhcnNlIENQVSBicmFuZCBzdHJpbmcgZm9yIGZyZXF1ZW5jeS4KKworICAgICAgICB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZyB7CisgICAgICAgICAgICBzdHJ1Y3Qga21wX2NwdWlkIGJ1ZlsgMyBdOworICAgICAgICAgICAgY2hhciAgICAgICAgICAgICBzdHJpbmdbIHNpemVvZiggc3RydWN0IGttcF9jcHVpZCApICogMyArIDEgXTsKKyAgICAgICAgfTsgLy8gdW5pb24ga21wX2NwdV9icmFuZF9zdHJpbmcKKyAgICAgICAgdW5pb24ga21wX2NwdV9icmFuZF9zdHJpbmcgYnJhbmQ7CisgICAgICAgIGludCBpOworCisgICAgICAgIHAtPmZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgLy8gR2V0IENQVSBicmFuZCBzdHJpbmcuCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgKysgaSApIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggMHg4MDAwMDAwMiArIGksIDAsICZicmFuZC5idWZbIGkgXSApOworICAgICAgICB9OyAvLyBmb3IKKyAgICAgICAgYnJhbmQuc3RyaW5nWyBzaXplb2YoIGJyYW5kLnN0cmluZyApIC0gMSBdID0gMDsgLy8gSnVzdCBpbiBjYXNlLiA7LSkKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoICJjcHUgYnJhbmQgc3RyaW5nOiBcIiVzXCJcbiIsIGJyYW5kLnN0cmluZyApICk7CisKKyAgICAgICAgLy8gUGFyc2UgZnJlcXVlbmN5LgorICAgICAgICBwLT5mcmVxdWVuY3kgPSBfX2ttcF9wYXJzZV9mcmVxdWVuY3koIHN0cnJjaHIoIGJyYW5kLnN0cmluZywgJyAnICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoICJjcHUgZnJlcXVlbmN5IGZyb20gYnJhbmQgc3RyaW5nOiAlIiBLTVBfVUlOVDY0X1NQRUMgIlxuIiwgcC0+ZnJlcXVlbmN5ICkgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9ob3N0X25hbWUoIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoc2l6ZSA+PSBzaXplb2YodW5rbm93bikpOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgeworCURXT1JECXMgPSBzaXplOworCisJaWYgKCEgR2V0Q29tcHV0ZXJOYW1lQSggYnVmZmVyLCAmIHMgKSkKKwkgICAgc3RyY3B5KCBidWZmZXIsIHVua25vd24gKTsKKyAgICB9CisjZWxzZQorICAgIGJ1ZmZlcltzaXplIC0gMl0gPSAwOworICAgIGlmIChnZXRob3N0bmFtZSggYnVmZmVyLCBzaXplICkgfHwgYnVmZmVyW3NpemUgLSAyXSAhPSAwKQorCXN0cmNweSggYnVmZmVyLCB1bmtub3duICk7CisjZW5kaWYKK30KKworLyogRXhwYW5kIHRoZSBtZXRhIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGVuYW1lOgorICoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIGNoYXJhY3RlcnMgYXJlOgorICoKKyAqICVIIHRoZSBob3N0bmFtZQorICogJVAgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQuCisgKiAlSSB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcnVuLgorICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9maWxlX25hbWUoIGNoYXIgKnJlc3VsdCwgc2l6ZV90IHJsZW4sIGNoYXIgKnBhdHRlcm4gKQoreworICAgIGNoYXIJKnBvcyA9IHJlc3VsdCwgKmVuZCA9IHJlc3VsdCArIHJsZW4gLSAxOworICAgIGNoYXIJIGJ1ZmZlclsyNTZdOworICAgIGludAkJIGRlZmF1bHRfY3B1X3dpZHRoID0gMTsKKyAgICBpbnQgICAgICAgICAgc25wX3Jlc3VsdDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQocmxlbiA+IDApOworICAgICplbmQgPSAwOworICAgIHsKKwlpbnQgaTsKKwlmb3IoaSA9IF9fa21wX3hwcm9jOyBpID49IDEwOyBpIC89IDEwLCArK2RlZmF1bHRfY3B1X3dpZHRoKTsKKyAgICB9CisKKyAgICBpZiAocGF0dGVybiAhPSBOVUxMKSB7CisJd2hpbGUgKCpwYXR0ZXJuICE9ICdcMCcgJiYgcG9zIDwgZW5kKSB7CisJICAgIGlmICgqcGF0dGVybiAhPSAnJScpIHsKKwkJKnBvcysrID0gKnBhdHRlcm4rKzsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciAqb2xkX3BhdHRlcm4gPSBwYXR0ZXJuOworCQlpbnQgd2lkdGggPSAxOworCQlpbnQgY3B1X3dpZHRoID0gZGVmYXVsdF9jcHVfd2lkdGg7CisKKwkJKytwYXR0ZXJuOworCisJCWlmICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKSB7CisJCSAgICB3aWR0aCA9IDA7CisJCSAgICBkbyB7CisJCQl3aWR0aCA9ICh3aWR0aCAqIDEwKSArICpwYXR0ZXJuKysgLSAnMCc7CisJCSAgICB9IHdoaWxlICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKTsKKwkJICAgIGlmICh3aWR0aCA8IDAgfHwgd2lkdGggPiAxMDI0KQorCQkJd2lkdGggPSAxOworCisJCSAgICBjcHVfd2lkdGggPSB3aWR0aDsKKwkJfQorCisJCXN3aXRjaCAoKnBhdHRlcm4pIHsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQkgICAgeworCQkJX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisJCQlzdHJuY3B5KCBwb3MsICBidWZmZXIsIGVuZCAtIHBvcyArIDEpOworCQkJaWYoKmVuZCA9PSAwKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ3AnOgorCQkgICAgeworCQkJc25wX3Jlc3VsdCA9IHNucHJpbnRmKCBwb3MsIGVuZCAtIHBvcyArIDEsICIlMCpkIiwgY3B1X3dpZHRoLCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisJCQlpZihzbnBfcmVzdWx0ID49IDAgJiYgc25wX3Jlc3VsdCA8PSBlbmQgLSBwb3MpIHsKKwkJCSAgICB3aGlsZSAoICpwb3MgKQorCQkJCSsrcG9zOworCQkJICAgICsrcGF0dGVybjsKKwkJCX0gZWxzZQorCQkJICAgIHBvcyA9IGVuZDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlICdJJzoKKwkJY2FzZSAnaSc6CisJCSAgICB7CisJCQlwaWRfdCBpZCA9IGdldHBpZCgpOworCQkJc25wX3Jlc3VsdCA9IHNucHJpbnRmKCBwb3MsIGVuZCAtIHBvcyArIDEsICIlMCpkIiwgd2lkdGgsIGlkICk7CisJCQlpZihzbnBfcmVzdWx0ID49IDAgJiYgc25wX3Jlc3VsdCA8PSBlbmQgLSBwb3MpIHsKKwkJCSAgICB3aGlsZSAoICpwb3MgKQorCQkJCSsrcG9zOworCQkJICAgICsrcGF0dGVybjsKKwkJCX0gZWxzZQorCQkJICAgIHBvcyA9IGVuZDsKKwkJCWJyZWFrOworCQkgICAgfQorCQljYXNlICclJzoKKwkJICAgIHsKKwkJCSpwb3MrKyA9ICclJzsKKwkJCSsrcGF0dGVybjsKKwkJCWJyZWFrOworCQkgICAgfQorCQlkZWZhdWx0OgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJcGF0dGVybiA9IG9sZF9wYXR0ZXJuICsgMTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJLyogVE9ETzogSG93IGRvIHdlIGdldCByaWQgb2YgdGhpcz8gKi8KKwlpZigqcGF0dGVybiAhPSAnXDAnKQorCSAgICBLTVBfRkFUQUwoIEZpbGVOYW1lVG9vTG9uZyApOworICAgIH0KKworICAgICpwb3MgPSAnXDAnOworfQorCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmMKKyAqICRSZXZpc2lvbjogNDI4MDYgJAorICogJERhdGU6IDIwMTMtMTEtMDUgMTY6MTY6NDUgLTA2MDAgKFR1ZSwgMDUgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisKKy8vIFJlcGxhY2Ugd2l0aCBzbmFwc2hvdCBkYXRlIFlZWVlNTUREIGZvciBwcm9tb3Rpb24gYnVpbGQuCisjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIDAwMDAwMDAwCisKKy8vIEhlbHBlciBtYWNyb3MgdG8gY29udmVydCB2YWx1ZSBvZiBtYWNybyB0byBzdHJpbmcgbGl0ZXJhbC4KKyNkZWZpbmUgX3N0cmluZ2VyKCB4ICkgI3gKKyNkZWZpbmUgc3RyaW5nZXIoIHggKSAgX3N0cmluZ2VyKCB4ICkKKworLy8gRGV0ZWN0IGNvbXBpbGVyLgorI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAjaWYgICBfX0lOVEVMX0NPTVBJTEVSID09IDEwMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMC4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTEwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEyMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMzAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTQwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDk5OTkKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyAgICAjZW5kaWYKKyNlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJDbGFuZyAiIHN0cmluZ2VyKCBfX2NsYW5nX21ham9yX18gKSAiLiIgc3RyaW5nZXIoIF9fY2xhbmdfbWlub3JfXyApCisjZWxpZiBLTVBfQ09NUElMRVJfR0NDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkdDQyAiIHN0cmluZ2VyKCBfX0dOVUNfXyApICIuIiBzdHJpbmdlciggX19HTlVDX01JTk9SX18gKQorI2VuZGlmCisjaWZuZGVmIEtNUF9DT01QSUxFUgorICAgICN3YXJuaW5nICJVbmtub3duIGNvbXBpbGVyIgorICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJ1bmtub3duIGNvbXBpbGVyIgorI2VuZGlmCisKKy8vIERldGVjdCBsaWJycmF5IHR5cGUgKHBlcmYsIHN0dWIpLgorI2lmZGVmIEtNUF9TVFVCCisgICAgI2RlZmluZSBLTVBfTElCX1RZUEUgInN0dWIiCisjZWxzZQorICAgICNkZWZpbmUgS01QX0xJQl9UWVBFICJwZXJmb3JtYW5jZSIKKyNlbmRpZiAvLyBLTVBfTElCX1RZUEUKKworLy8gRGV0ZWN0IGxpbmsgdHlwZSAoc3RhdGljLCBkeW5hbWljKS4KKyNpZmRlZiBHVUlERURMTF9FWFBPUlRTCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJkeW5hbWljIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSU5LX1RZUEUgInN0YXRpYyIKKyNlbmRpZiAvLyBLTVBfTElOS19UWVBFCisKKy8vIEZpbmFsbHksIGRlZmluZSBzdHJpbmdzLgorI2RlZmluZSBLTVBfTElCUkFSWSAgIEtNUF9MSUJfVFlQRSAiIGxpYnJhcnkgKCIgS01QX0xJTktfVFlQRSAiKSIKKyNkZWZpbmUgS01QX0NPUFlSSUdIVCAiQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3IgPSBLTVBfVkVSU0lPTl9NQUpPUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yID0gS01QX1ZFUlNJT05fTUlOT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZCA9IEtNUF9WRVJTSU9OX0JVSUxEOworaW50IGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uID0KKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgMjAxMzA3OworICAgICNlbGlmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIDIwMTEwNzsKKyAgICAjZWxzZQorICAgICAgICAyMDA1MDU7CisgICAgI2VuZGlmCisKKy8qIERvIE5PVCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyEgIEludGVsKFIpIFRocmVhZCBQcm9maWxlciBjaGVja3MgZm9yIGEKKyAgIHNwZWNpZmljIGZvcm1hdCBzb21lIGNoYW5nZXMgaW4gdGhlIHJlY29nbml0aW9uIHJvdXRpbmUgdGhlcmUgbmVlZCB0bworICAgYmUgbWFkZSBiZWZvcmUgdGhpcyBpcyBjaGFuZ2VkLgorKi8KK2NoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfTElCUkFSWQorICAgICIgdmVyLiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKQorICAgICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKSAiICIKKyAgICBLTVBfQ09QWVJJR0hUOworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W10gICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfQ09QWVJJR0hUOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXSAgICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggInZlcnNpb246ICIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01BSk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NSU5PUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaWJyYXJ5IHR5cGU6ICIgS01QX0xJQl9UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImxpbmsgdHlwZTogIiBLTVBfTElOS19UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXSAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIHRpbWU6ICIgX0tNUF9CVUlMRF9USU1FOworI2lmIEtNUF9NSUMyCisgICAgY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIGNvbXBpbGVyOiAiIEtNUF9DT01QSUxFUjsKKworLy8KKy8vIENhbGxlZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBUUlVFOworCisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAvLyBQcmludCB2ZXJzaW9uIHN0cmluZ3Mgc2tpcHBpbmcgaW5pdGlhbCBtYWdpYy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjaWYgS01QX01JQworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9hbHRfY29tcFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fb21wX2FwaVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc2R5bmFtaWMgZXJyb3IgY2hlY2tpbmc6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPyAieWVzIiA6ICJubyIgKSAgKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9sb2NrWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX3BlcmZfdjE5WyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX3BlcmZfdjEwNlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAmIGJ1ZmZlciwKKyAgICAgICAgICAgICIlc3RocmVhZCBhZmZpbml0eSBzdXBwb3J0OiAlc1xuIiwKKyAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkKKyAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgdXNlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJLTVBfVkVSU0lPTiBpcyB0cnVlXG4iICkgKTsKKyAgICAjZW5kaWYgLy8gS01QX1NUVUIKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8xCisKKy8vCisvLyBDYWxsZWQgYXQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMiggdm9pZCApIHsKKyAgICBpZiAoIF9fa21wX3ZlcnNpb25fMl9wcmludGVkICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF92ZXJzaW9uXzJfcHJpbnRlZCA9IFRSVUU7CisKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgI2VuZGlmIC8vIEtNUF9TVFVCCit9IC8vIF9fa21wX3ByaW50X3ZlcnNpb25fMgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmggYi9yYzEvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQyYzQyCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmggLS0gdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVsZWFzZQorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9WRVJTSU9OX0gKKyNkZWZpbmUgS01QX1ZFUlNJT05fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWZuZGVmIEtNUF9WRVJTSU9OX01BSk9SCisgICAgI2Vycm9yIEtNUF9WRVJTSU9OX01BSk9SIG1hY3JvIGlzIG5vdCBkZWZpbmVkLgorI2VuZGlmCisjZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICAgIDAKKy8qCisgICAgVXNpbmcgIm1hZ2ljIiBwcmVmaXggaW4gYWxsIHRoZSB2ZXJzaW9uIHN0cmluZ3MgaXMgcmF0aGVyIGNvbnZlbmllbnQgdG8gZ2V0IHN0YXRpYyB2ZXJzaW9uIGluZm8KKyAgICBmcm9tIGJpbmFyaWVzIGJ5IHVzaW5nIHN0YW5kYXJkIHV0aWxpdGllcyAic3RyaW5ncyIgYW5kICJncmVwIiwgZS4gZy46CisgICAgICAgICQgc3RyaW5ncyBsaWJpb21wNS5zbyB8IGdyZXAgIkAoIykiCisgICAgZ2l2ZXMgY2xlYW4gbGlzdCBvZiBhbGwgdmVyc2lvbiBzdHJpbmdzIGluIHRoZSBsaWJyYXJ5LiBMZWFkaW5nIHplcm8gaGVscHMgdG8ga2VlcCB2ZXJzaW9uCisgICAgc3RyaW5nIHNlcGFyYXRlIGZyb20gcHJpbnRhYmxlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG9jY3VycyBqdXN0IGJlZm9yZSB2ZXJzaW9uIHN0cmluZy4KKyovCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX1NUUiAgICJceDAwQCgjKSAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX0xFTiAgIDYgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIEtNUF9WRVJTSU9OX01BR0lDX1NUUi4KKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRl9TVFIgICAgIkludGVsKFIpIE9NUCAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX1BSRUZJWCAgICAgIEtNUF9WRVJTSU9OX01BR0lDX1NUUiBLTVBfVkVSU0lPTl9QUkVGX1NUUgorCisvKiBkZWNsYXJlIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmcgY29uc3RhbnRzIGZvciBLTVBfVkVSU0lPTiBlbnYuIHZhcmlhYmxlICovCitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vcjsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQ7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbjsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdOyAgICAvLyBPbGQgdmFyaWFibGUsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJVEMgYW5kIElUUC4KK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGlua190eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW107CisvLyA/Pz8gZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9kZWJ1Z1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjE5W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjEwNltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9uZXN0ZWRfc3RhdHNfcmVwb3J0aW5nW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXTsKKwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzEoIHZvaWQgKTsKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMva21wX3dyYXBwZXJfZ2V0cGlkLmggYi9yYzEvcnVudGltZS9zcmMva21wX3dyYXBwZXJfZ2V0cGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkYzE2OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICoga21wX3dyYXBwZXJfZ2V0cGlkLmggLS0gZ2V0cGlkKCkgZGVjbGFyYXRpb24uCisgKiAkUmV2aXNpb246IDQyMTgxICQKKyAqICREYXRlOiAyMDEzLTAzLTI2IDE1OjA0OjQ1IC0wNTAwIChUdWUsIDI2IE1hciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dSQVBQRVJfR0VUUElEX0gKKyNkZWZpbmUgS01QX1dSQVBQRVJfR0VUUElEX0gKKworI2lmIEtNUF9PU19VTklYCisKKyAgICAvLyBPbiBVbml4LWxpa2Ugc3lzdGVtcyAoTGludXgqIE9TIGFuZCBPUyBYKikgZ2V0cGlkKCkgaXMgZGVjbGFyZWQgaW4gc3RhbmRhcmQgaGVhZGVycy4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZWxpZiBLTVBfT1NfV0lORE9XUworCisgICAgLy8gT24gV2luZG93cyogT1MgX2dldHBpZCgpIHJldHVybnMgaW50IChub3QgcGlkX3QpIGFuZCBpcyBkZWNsYXJlZCBpbiAicHJvY2Vzcy5oIi4KKyAgICAjaW5jbHVkZSA8cHJvY2Vzcy5oPgorICAgIC8vIExldCB1cyBzaW11bGF0ZSBVbml4LgorICAgIHR5cGVkZWYgaW50IHBpZF90OworICAgICNkZWZpbmUgZ2V0cGlkIF9nZXRwaWQKKworI2Vsc2UKKworICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorCisjZW5kaWYKKworLyoKKyAgICBUT0RPOiBBbGwgdGhlIGxpYm9tcCBzb3VyY2UgY29kZSB1c2VzIHBpZF90IHR5cGUgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBvZiBnZXRwaWQoKSwgaXQgaXMgZ29vZC4KKyAgICBCdXQgb2Z0ZW4gaXQgcHJpbnRlZCBhcyAiJWQiLCB0aGF0IGlzIG5vdCBnb29kLCBiZWNhdXNlIGl0IGlnbm9yZXMgcGlkX3QgZGVmaW5pdGlvbiAobWF5IHBpZF90CisgICAgYmUgbG9uZ2VyIHRoYXQgaW50PykuIEl0IHNlZW1zIGFsbCBwaWQgcHJpbnRzIHNob3VsZCBiZSByZXdyaXR0ZW4gYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDY0X1NQRUMsIChrbXBfdWludDY0KSBwaWQgKTsKKworICAgIG9yIChhdCBsZWFzdCkgYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDMyX1NQRUMsIChrbXBfdWludDMyKSBwaWQgKTsKKworICAgIChrbXBfdWludDMyLCBrbXBfdWludDY0LCBLTVBfVUlOVDY0X1NQRUMsIGFuZCBLTVBfVU5JVDMyX1NQRUMgYXJlIGRlZmluZWQgaW4gImttcF9vcy5oIi4pCisKKyovCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX21hbGxvYy5oIGIvcmMxL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9tYWxsb2MuaCAtLSBXcmFwcGVycyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChtYWxsb2MoKSwgZnJlZSgpLCBhbmQgb3RoZXJzKS4KKyAqICRSZXZpc2lvbjogNDIxODEgJAorICogJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9NQUxMT0NfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvKgorICAgIFRoaXMgaGVhZGVyIHNlcnZlcyBmb3IgMyBwdXJwb3NlczoKKworICAgICAgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgICAgICAyLiBQYXNzaW5nIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMuCisgICAgICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKworCisgICAgMS4gRGVjbGFyaW5nIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXJpbmVzIGluIE9TLWluZGVwZW5kZW50IHdheS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgT24gTGludXgqIE9TLCBhbGxvY2EoKSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiA8YWxsb2NhLmg+IGhlYWRlciwgd2hpbGUgb24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8KKyAgICA8YWxsb2NhLmg+IGhlYWRlciwgZnVuY3Rpb24gX2FsbG9jYSgpIChub3RlIHVuZGVyc2NvcmUhKSBpcyBkZWNsYXJlZCBpbiA8bWFsbG9jLmg+LiBUaGlzIGhlYWRlcgorICAgIGVsaW1pbmF0ZXMgdGhlc2UgZGlmZmVyZW5jZXMsIHNvIGNsaWVudCBjb2RlIGluY2x1aWRpbmcgImttcF93cmFwcGVyX21hbGxvYy5oIiBjYW4gcmVseSBvbgorICAgIGZvbGxvd2luZyByb3V0aW5lczoKKworICAgICAgICBtYWxsb2MKKyAgICAgICAgY2FsbG9jCisgICAgICAgIHJlYWxsb2MKKyAgICAgICAgZnJlZQorICAgICAgICBhbGxvY2EKKworICAgIGluIE9TLWluZGVwZW5kZW50IHdheS4gSXQgYWxzbyBlbmFibGVzIG1lbW9yeSB0cmFja2luZyBjYXBhYmlsaXRpZXMgaW4gZGVidWcgYnVpbGQuIChDdXJyZW50bHkKKyAgICBpdCBpcyBhdmFpbGFibGUgb25seSBvbiBXaW5kb3dzKiBPUy4pCisKKworICAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHRvb2xzIG1heSBoZWxwIGRlYnVnZ2luZyBtZW1vcnkgZXJyb3JzLCBmb3IgZXhhbXBsZSwgcmVwb3J0IG1lbW9yeSBsZWFrcy4gSG93ZXZlciwgbWVtb3J5CisgICAgYWxsb2NhdGlvbiB3cmFwcGVycyBtYXkgaGluZGVyIHNvdXJjZSBsb2NhdGlvbi4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jKCBzaXplICk7IC8vIEFsbCB0aGUgbWVtb3J5IGxlYWtzIHdpbGwgYmUgcmVwb3J0ZWQgYXQgdGhpcyBsaW5lLgorICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKworICAgICAgICBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAgICAvLyBNZW1vcnkgbGVhayB3aWxsICpub3QqIGJlIGRldGVjdGVkIGhlcmUuIDotKAorCisgICAgVG8gb3ZlcmNvbWUgdGhlIHByb2JsZW0sIGluZm9ybWF0aW9uIGFib3V0IG9yaWdpbmFsIHNvdXJjZSBsb2NhdGlvbiBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggYWxsCisgICAgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLCBmb3IgZXhhbXBsZToKKworICAgICAgICB2b2lkICogYWxpZ25lZF9tYWxsb2MoIGludCBzaXplLCBjaGFyIGNvbnN0ICogZmlsZSwgaW50IGxpbmUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gX21hbGxvY19kYmcoIHNpemUsIGZpbGUsIGxpbmUgKTsKKyAgICAgICAgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplLCBfX0ZJTEVfXywgX19MSU5FX18gKTsKKworICAgIFRoaXMgaXMgYSBnb29kIGlkZWEgZm9yIGRlYnVnLCBidXQgcGFzc2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBpbXBhY3RzIHBlcmZvcm1hbmNlLiBEaXNhYmxpbmcKKyAgICBleHRyYSBhcmd1bWVudHMgaW4gcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBpbnRyb2R1Y2VzIHRvbyBtYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLAorICAgIHdoaWNoIG1ha2VzIGNvZGUgdW5yZWFkYWJsZS4gVGhpcyBoZWFkZXIgZGVmaW5lcyBmZXcgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZmFjaWxpdGF0aW5nIGl0OgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24uCisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplICk7ICAvLyBCaW5nbyEgTWVtb3J5IGxlYWsgd2lsbCBiZSByZXBvcnRlZCBhdCB0aGlzIGxpbmUuCisKKworICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHBsYXRmb3JtcyBtYXkgb2ZmZXIgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEZvciBleGFtcGxlLCBkZWJ1ZyB2ZXJzaW9uIG9mIE1pY3Jvc29mdAorICAgIFJUTCB0cmFja3MgYWxsIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgY2FuIHJlcG9ydCBtZW1vcnkgbGVha3MuIFRoaXMgaGVhZGVyIGVuYWJsZXMgdGhpcywgYW5kCisgICAgbWFrZXMgcmVwb3J0IG1vcmUgdXNlZnVsIChzZWUgIlBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbgorICAgIHdyYXBwZXJzIikuCisKKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisvLyBJbmNsdWRlIGFsbG9jYSgpIGRlY2xhcmF0aW9uLgorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPG1hbGxvYy5oPiAgICAgICAgLy8gV2luZG93cyogT1M6IF9hbGxvY2EoKSBkZWNsYXJlZCBpbiAibWFsbG9jLmgiLgorICAgICNkZWZpbmUgYWxsb2NhIF9hbGxvY2EgICAgIC8vIEFsbG93IHRvIHVzZSBhbGxvY2EoKSB3aXRoIG5vIHVuZGVyc2NvcmUuCisjZWxpZiBLTVBfT1NfRlJFRUJTRAorICAgIC8vIERlY2xhcmVkIGluICJzdGRsaWIuaCIuCisjZWxpZiBLTVBfT1NfVU5JWAorICAgICNpbmNsdWRlIDxhbGxvY2EuaD4gICAgICAgIC8vIExpbnV4KiBPUyBhbmQgT1MgWCo6IGFsbG9jKCkgZGVjbGFyZWQgaW4gImFsbG9jYSIuCisjZWxzZQorICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKy8qCisgICAgS01QX1NSQ19MT0NfREVDTCAtLSBEZWNsYXJpbmcgc291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgIEtNUF9TUkNfTE9DX1BBUk0gLS0gU291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byB1bmRlcmx5aW5nCisgICAgICAgIGxldmVscy4KKyAgICBLTVBfU1JDX0xPQ19DVVJSIC0tIFNvdXJjZSBsb2NhdGlvbiBhcmd1bWVudHMgZGVzY3JpYmluZyBjdXJyZW50IGxvY2F0aW9uLCB0byBiZSB1c2VkIGF0CisgICAgICAgIHRvcC1sZXZlbC4KKworICAgIFR5cGljYWwgdXNhZ2U6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IENvbW1hIGlzIG1pc3NlZCBiZWZvcmUgS01QX1NSQ19MT0NfREVDTC4KKyAgICAgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiY2FsbGVkIGZyb20gJXM6JWRcbiIsIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24gLS0gbWFjcm8gcGFzc2VzIGluZm8gYWJvdXQgY3VycmVudAorICAgICAgICAgICAgLy8gc291cmNlIGxvY2F0aW9uIHRvIHRoZSBmdW5jLgorKi8KKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0RFQ0wgICAgLCBjaGFyIGNvbnN0ICogX2ZpbGVfLCBpbnQgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNICAgICwgX2ZpbGVfLCBfbGluZV8KKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0NVUlIgICAgLCBfX0ZJTEVfXywgX19MSU5FX18KKyNlbHNlCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qCisgICAgbWFsbG9jX3NyY19sb2MoKSBhbmQgZnJlZV9zcmNfbG9jKCkgYXJlIHBzZXVkby1mdW5jdGlvbnMgKHJlYWxseSBtYWNyb3MpIHdpdGggYWNjZXB0cyBleHRyYQorICAgIGFyZ3VtZW50cyAoc291cmNlIGxvY2F0aW9uIGluZm8pIGluIGRlYnVnIG1vZGUuIFRoZXkgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFsbG9jKCkgYW5kCisgICAgZnJlZSgpLCB0aGlzIGFsbG93cyBlbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgKGlmIGFueSkuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgICAgIC8vIEluc2lkZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLCBvcgorICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19DVVJSICk7CisgICAgICAgICAgICAvLyBPdXRzaWRlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXIuCisKKworKi8KKyNkZWZpbmUgbWFsbG9jX3NyY19sb2MoIGFyZ3MgKSAgICBfbWFsbG9jX3NyY19sb2MoIGFyZ3MgKQorI2RlZmluZSBmcmVlX3NyY19sb2MoICAgYXJncyApICAgIF9mcmVlX3NyY19sb2MoICAgYXJncyApCisgICAgLyoKKyAgICAgICAgRGVwZW5kaW5nIG9uIGJ1aWxkIG1vZGUgKGRlYnVnIG9yIHJlbGVhc2UpLCBtYWxsb2Nfc3JjX2xvYyBpcyBkZWNsYXJlZCB3aXRoIDEgb3IgMworICAgICAgICBwYXJhbWV0ZXJzLCBidXQgY2FsbHMgdG8gbWFsbG9jX3NyY19sb2MoKSBhcmUgYWx3YXlzIHRoZSBzYW1lOgorCisgICAgICAgICAgICAuLi4gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOyAvLyBvciBLTVBfU1JDX0xPQ19DVVJSCisKKyAgICAgICAgQ29tcGlsZXIgaXNzdWVzIHdhcm5pbmcvZXJyb3IgInRvbyBmZXcgYXJndW1lbnRzIGluIG1hY3JvIGludm9jYXRpb24iLiBEZWNsYXJpbmcgdHdvCisgICAgICAgIG1hY3Jvc2VzLCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBfbWFsbG9jX3NyY19sb2MoKSBvdmVyY29tZXMgdGhlIHByb2JsZW0uCisgICAgKi8KKworI2lmIEtNUF9ERUJVRworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIF9ERUJVRworICAgICAgICAvLyBLTVBfREVCVUcgIT0gX0RFQlVHLiBNUyBkZWJ1ZyBSVEwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0RFQlVHIGlzIGRlZmluZWQuCisKKyAgICAgICAgLy8gV2luZG93cyogT1MgaGFzIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRW5hYmxlIHRoZW0uCisKKyAgICAgICAgI2luY2x1ZGUgPGNydGRiZy5oPgorCisgICAgICAgICNkZWZpbmUgS01QX01FTV9CTE9DSyAgICAgICAgICAgX0NMSUVOVF9CTE9DSworICAgICAgICAjZGVmaW5lIG1hbGxvYyggc2l6ZSApICAgICAgICAgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgY2FsbG9jKCBudW0sIHNpemUgKSAgICAgX2NhbGxvY19kYmcoIChudW0pLCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgcmVhbGxvYyggcHRyLCBzaXplICkgICAgX3JlYWxsb2NfZGJnKCAocHRyKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGZyZWUoIHB0ciApICAgICAgICAgICAgIF9mcmVlX2RiZyggKHB0ciksIEtNUF9NRU1fQkxPQ0sgKQorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIChmaWxlKSwgKGxpbmUpICkKKyAgICAgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCAgICBwdHIsIGZpbGUsIGxpbmUgKSAgX2ZyZWVfZGJnKCAgIChwdHIpLCAgS01QX01FTV9CTE9DSyAgICAgICAgICAgICAgICAgKQorCisgICAgI2Vsc2UKKworICAgICAgICAvLyBMaW51eCogT1MsIE9TIFgqLCBvciBub24tZGVidWcgV2luZG93cyogT1MuCisKKyAgICAgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUsIGZpbGUsIGxpbmUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyLCBmaWxlLCBsaW5lICkgICAgICAgZnJlZSggKHB0cikgKQorCisgICAgI2VuZGlmCisKKyNlbHNlCisKKyAgICAvLyBJbiByZWxlYXNlIGJ1aWxkIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGRvIG5vdCBoYXZlIGV4dHJhIHBhcmFtZXRlcnMuCisgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCBwdHIgKSAgICAgICBmcmVlKCAocHRyKSApCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvbGliaW9tcC5yYy52YXIgYi9yYzEvcnVudGltZS9zcmMvbGliaW9tcC5yYy52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5Zjk5YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy9saWJpb21wLnJjLnZhcgpAQCAtMCwwICsxLDc0IEBACisvLyBsaWJpb21wLnJjLnZhcgorLy8gJFJldmlzaW9uOiA0MjIxOSAkCisvLyAkRGF0ZTogMjAxMy0wMy0yOSAxMzozNjowNSAtMDUwMCAoRnJpLCAyOSBNYXIgMjAxMykgJAorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgICAgLy8gUGFydHMgb2YgRklMRVZFUlNJT04gYW5kIFBST0RVQ1RWRVJTSU9OIGFyZSAxNi1iaXQgZmllbGRzLCBlbnRpcmUgYnVpbGQgZGF0ZSB5eXl5bW1kZAorICAgIC8vIGRvZXMgbm90IGZpdCBpbnRvIG9uZSB2ZXJzaW9uIHBhcnQsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQgaW50byB5eXl5IGFuZCBtbWRkOgorICAgIEZJTEVWRVJTSU9OICAgICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIFBST0RVQ1RWRVJTSU9OICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorICAgICNpZiAkS01QX0RJQUcgfHwgJEtNUF9ERUJVR19JTkZPCisgICAgICAgIHwgVlNfRkZfREVCVUcKKyAgICAjZW5kaWYKKyAgICAjaWYgJEtNUF9WRVJTSU9OX0JVSUxEID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisgICAgI2VuZGlmCisgICAgRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIgICAgLy8gV2luZG93cyogU2VydmVyKiAyMDAzLCBYUCosIDIwMDAsIG9yIE5UKgorICAgIEZJTEVUWVBFICAgICAgICBWRlRfRExMCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIiAgICAgICAgICAgIC8vIFUuUy4gRW5nbGlzaCwgVW5pY29kZSAoMHgwNGIwID09IDEyMDApCisgICAgICAgICAgICBCRUdJTgorCisgICAgICAgICAgICAgICAgLy8gRmlsZURlc2NyaXB0aW9uIGFuZCBMZWdhbENvcHlyaWdodCBzaG91bGQgYmUgc2hvcnQuCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICAiSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkke3sgb3VyICRNRVNTQUdFX0NBVEFMT0c7ICRNRVNTQUdFX0NBVEFMT0cgPyAiIE1lc3NhZ2UgQ2F0YWxvZyIgOiAiIiB9fVwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMTk5Ny0yMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cMCIKKworICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJJbnRlbCBDb3Jwb3JhdGlvblwwIgorICAgICAgICAgICAgICAgIC8vIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAgIlwwIiAgLy8gTm90IHVzZWQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgICJJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgIiRLTVBfVkVSU0lPTl9NQUpPUi4kS01QX1ZFUlNJT05fTUlOT1JcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICIkS01QX1ZFUlNJT05fQlVJTERcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiSW50ZWwoUikgT3Blbk1QKiAke3sgb3VyICggJE1FU1NBR0VfQ0FUQUxPRywgJEtNUF9UWVBFICk7ICRNRVNTQUdFX0NBVEFMT0cgPyAiUnVudGltZSBMaWJyYXJ5IE1lc3NhZ2UgQ2F0YWxvZyIgOiAiJEtNUF9UWVBFIExpYnJhcnkiIH19ICIKKyAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gJEtNUF9WRVJTSU9OX01BSk9SLiRLTVBfVkVSU0lPTl9NSU5PUi4kS01QX1ZFUlNJT05fQlVJTEQgIgorICAgICAgICAgICAgICAgICAgICAiZm9yICRLTVBfQVJDSCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gJEtNUF9CVUlMRF9EQVRFLlwwIgorICAgICAgICAgICAgICAgICNpZiAkS01QX1ZFUlNJT05fQlVJTEQgPT0gMAorICAgICAgICAgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgZm9yIGludGVybmFsIHRlc3RpbmcgcHVycG9zZXMgb25seS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkRvIG5vdCBkaXN0cmlidXRlIGl0IG91dHNpZGUgb2YgSW50ZWwuXDAiCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgJHt7IG91ciAoICRNRVNTQUdFX0NBVEFMT0csICRMQU5HVUFHRSApOyAkTUVTU0FHRV9DQVRBTE9HID8gJExBTkdVQUdFIDogMTAzMyB9fSwgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy9tYWtlZmlsZS5tayBiL3JjMS9ydW50aW1lL3NyYy9tYWtlZmlsZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU4Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL21ha2VmaWxlLm1rCkBAIC0wLDAgKzEsMTUwMSBAQAorIyBtYWtlZmlsZS5tayAjCisjICRSZXZpc2lvbjogNDI4MjAgJAorIyAkRGF0ZTogMjAxMy0xMS0xMyAxNjo1Mzo0NCAtMDYwMCAoV2VkLCAxMyBOb3YgMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2sgYW5kIG5vcm1hbGl6ZSBMSUJPTVBfV09SSy4KKyMgVGhpcyBwaWVjZSBvZiBjb2RlIGlzIGNvbW1vbiwgYnV0IGl0IGNhbm5vdCBiZSBtb3ZlZCB0byBjb21tb24gZmlsZS4KK2lmZXEgIiQoTElCT01QX1dPUkspIiAiIgorICAgICQoZXJyb3IgTElCT01QX1dPUksgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQpCitlbmRpZgoraWZuZXEgIiQod29yZHMgJChMSUJPTVBfV09SSykpIiAiMSIKKyAgICAkKGVycm9yIExJQk9NUF9XT1JLIG11c3Qgbm90IGNvbnRhaW4gc3BhY2VzKQorZW5kaWYKK292ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoc3Vic3QgXCwvLCQoTElCT01QX1dPUkspKQoraWZlcSAiJChmaWx0ZXIgJS8sJChMSUJPTVBfV09SSykpIiAiIgorICAgIG92ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoTElCT01QX1dPUkspLworZW5kaWYKKworIyBJbmNsdWRlIGRlZmluaXRpb25zIGNvbW1vbiBmb3IgUlRMIGFuZCBEU0wuCitpbmNsdWRlICQoTElCT01QX1dPUkspc3JjL2RlZnMubWsKKworc3JjX2RpciAgICAgID0gJChMSUJPTVBfV09SSylzcmMvCitpbmNfZGlyICAgICAgPSAkKExJQk9NUF9XT1JLKXNyYy9pbmNsdWRlLyQoT01QX1ZFUlNJT04pLworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBCdWlsZCBjb21waWxlcgorQlVJTERfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLEJVSUxEX0NPTVBJTEVSLGljYyBnY2MgY2xhbmcgaWNsIGljbC5leGUpCisjIERpc3RyaWJ1dGlvbiB0eXBlOiBjb20gKGNvbW1lcmNpYWwpIG9yIG9zcyAob3Blbi1zb3VyY2UpCitESVNUUklCVVRJT04gIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxESVNUUklCVVRJT04sY29tIG9zcykKKworaWZlcSAiJChjKSIgIiIKKyAgICBjID0gJChCVUlMRF9DT01QSUxFUikKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYyA9IGljbC5leGUKKyAgICBlbmRpZgorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9ICQoRElTVFJJQlVUSU9OKQorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9IGNvbQorZW5kaWYKKworIyBDb21waWxlIGFsbCBDIGZpbGVzIGFzIEMrKyBzb3VyY2UuCitDUExVU1BMVVMgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENQTFVTUExVUyxvbikKKyMgVHVybiBvbiBpbnN0cnVtZW50YXRpb24gZm9yIGNvZGUgY292ZXJhZ2UuCitDT1ZFUkFHRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENPVkVSQUdFLG9mZiBvbikKKyMgSW5zdHJ1Y3QgY29tcGlsZXIgdG8gZW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbi4KK0RFQlVHX0lORk8gICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsREVCVUdfSU5GTyxvbiBvZmYpCisjIFR1cm4gb24gZGVidWcgc3VwcG9ydCBpbiBsaWJyYXJ5IGNvZGUsIGFzc2VydGlvbnMgYW5kIHRyYWNlcy4KK0RJQUcgICAgICAgICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsRElBRyxvbiBvZmYpCitMSUJfVFlQRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJQl9UWVBFLG5vcm0gcHJvZiBzdHViKQorIyBUeXBlIG9mIGxpYnJhcnk6IGR5bmFtaWMgb3Igc3RhdGljIGxpbmtpbmcuCitMSU5LX1RZUEUgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJTktfVFlQRSxkeW5hIHN0YXQpCisjIFN1cHBvcnRlZCBPcGVuTVAgdmVyc2lvbiwgMi41IG9yIDMuMC4KK09NUF9WRVJTSU9OICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsT01QX1ZFUlNJT04sNDAgMzAgMjUpCisjIEdlbmVyYXRlIG9wdGltaXplZCBjb2RlLgorT1BUSU1JWkFUSU9OIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxPUFRJTUlaQVRJT04sb2ZmIG9uKQorIyBUYXJnZXQgY29tcGlsZXIuCitUQVJHRVRfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRBUkdFVF9DT01QSUxFUiwxMiAxMSkKKyMgTGlicmFyeSB2ZXJzaW9uOiA0IC0tIGxlZ2FjeSwgNSAtLSBjb21wYXQuCitWRVJTSU9OICAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFZFUlNJT04sNSA0KQorCitWUEFUSCArPSAkKHNyY19kaXIpCitWUEFUSCArPSAkKHNyY19kaXIpaTE4bi8KK1ZQQVRIICs9ICQoaW5jX2RpcikKK1ZQQVRIICs9ICQoc3JjX2Rpcil0aGlyZHBhcnR5L2l0dG5vdGlmeS8KKworCisjIERlZmluZSBjb25maWcuCitkZWZpbmUgY3Vycl9jb25maWcKKyAgICBDUExVU1BMVVM9JChDUExVU1BMVVMpCisgICAgQ09WRVJBR0U9JChDT1ZFUkFHRSkKKyAgICBERUJVR19JTkZPPSQoREVCVUdfSU5GTykKKyAgICBESUFHPSQoRElBRykKKyAgICBMSUJfVFlQRT0kKExJQl9UWVBFKQorICAgIExJTktfVFlQRT0kKExJTktfVFlQRSkKKyAgICBPTVBfVkVSU0lPTj0kKE9NUF9WRVJTSU9OKQorICAgIE9QVElNSVpBVElPTj0kKE9QVElNSVpBVElPTikKKyAgICBUQVJHRVRfQ09NUElMRVI9JChUQVJHRVRfQ09NUElMRVIpCisgICAgVkVSU0lPTj0kKFZFUlNJT04pCisgICAgQ1BQRkxBR1M9JChzdWJzdCAkKHNwYWNlKSxfLCQoQ1BQRkxBR1MpKQorICAgIENGTEFHUz0kKHN1YnN0ICQoc3BhY2UpLF8sJChDRkxBR1MpKQorICAgIENYWEZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKENYWEZMQUdTKSkKKyAgICBGRkxBR1M9JChzdWJzdCAkKHNwYWNlKSxfLCQoRkZMQUdTKSkKKyAgICBMREZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKExERkxBR1MpKQorZW5kZWYKKyMgQW5kIGNoZWNrIGl0LgoraW5jbHVkZSAkKHRvb2xzX2RpcilzcmMvY29tbW9uLWNoZWNrcy5taworCisjIEZ1bmN0aW9uIHRvIGNvbnZlcnQgTElCX1RZUEUgdG8gcHJpbnRhYmxlIG9uZS4KK2xlZ2FsX3R5cGUgPSAkKGlmICQoZmlsdGVyIG5vcm0sJChMSUJfVFlQRSkpLFBlcmZvcm1hbmNlLCQoaWYgJChmaWx0ZXIgcHJvZiwkKExJQl9UWVBFKSksUHJvZmlsaW5nLFN0dWIpKQorCisjIENoZWNrIHRoZSBPUyBYIHZlcnNpb24gKHdlIG5lZWQgaXQgdG8gZGVjaWRlIHdoaWNoIHRvb2wgdXNlIGZvciBvYmplY3RzIGFjY3VtdWxhdGlvbikKK2lmZXEgIiQob3MpIiAibWFjIgorICAgIG1hY19vc19uZXcgOj0gJChzaGVsbCAvYmluL3NoIC1jICdpZiBbWyBgc3dfdmVycyAtcHJvZHVjdFZlcnNpb25gID4gMTAuNiBdXTsgdGhlbiBlY2hvICIxIjsgZWxzZSBlY2hvICIwIjsgZmknKQorZW5kaWYKKworIyBGb3JtIHRhcmdldCBkaXJlY3RvcnkgbmFtZSBmb3IgTUlDIHBsYXRmb3JtcworaWZlcSAiJChNSUNfQVJDSCkiICJrbmMiCisgICAgbWljLXBvc3RmMSAgPSAua25jCitlbmRpZgoraWZlcSAiJChNSUNfT1MpIiAibGluIgorICAgIG1pYy1wb3N0Zml4ID0gJChtaWMtcG9zdGYxKS5saW4KK2Vsc2UKKyAgICBtaWMtcG9zdGZpeCA9ICQobWljLXBvc3RmMSkKK2VuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXYgdG9vbHMgYW5kIGdlbmVyYWwgb3B0aW9ucyAobGlrZSAtZnBpYywgLU8yIG9yIC1nKS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUgJCh0b29sc19kaXIpc3JjL2NvbW1vbi10b29scy5taworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3Qtc3BlY2lmaWMgdG9vbHMgb3B0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0gQXNzZW1ibGVyIG9wdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYXMtZmxhZ3MgKz0gLWNvZmYKKyAgICAgICAgYXMtZmxhZ3MgKz0gLURfTV9JQTMyCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICBhcy1mbGFncyAgKz0gLURfTV9BTUQ2NAorICAgIGVuZGlmCisgICAgaWZlcSAiJChhcmNoKSIgIjY0IgorICAgIGVuZGlmCitlbmRpZgorCisjIC0tLSBDL0MrKyBvcHRpb25zIC0tLQorCisjIEVuYWJsZSBfUXVhZCB0eXBlLgoraWZuZXEgIiQoZmlsdGVyIGljYyBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKyAgICBjLWZsYWdzICAgKz0gLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMKKyAgICBjeHgtZmxhZ3MgKz0gLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMKK2VuZGlmCisKK2lmZXEgIiQoYykiICJnY2MiCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBjLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgY3h4LWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgZm9ydC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGxkLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgYXMtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKGMpIiAiY2xhbmciCisgICAgYy1mbGFncyArPSAtV25vLXVudXNlZC12YWx1ZSAtV25vLXN3aXRjaCAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIKKyAgICBjeHgtZmxhZ3MgKz0gLVduby11bnVzZWQtdmFsdWUgLVduby1zd2l0Y2ggLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBjLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgY3h4LWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgZm9ydC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGxkLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICAgICAgYXMtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorIyBkZWJ1Zy1pbmZvCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGMtZmxhZ3MgICAgKz0gLVppCisgICAgICAgIGN4eC1mbGFncyAgKz0gLVppCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLVppCisgICAgZWxzZQorICAgICAgaWZuZXEgIiQob3MpIiAibWFjIgorICAgICAgICBjLWZsYWdzICAgICs9IC1nCisgICAgICAgIGN4eC1mbGFncyAgKz0gLWcKKyAgICAgICAgZm9ydC1mbGFncyArPSAtZworICAgICAgICBsZC1mbGFncyAgICs9IC1nCisgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCisjIEVuYWJsZSA4MC1iaXQgImxvbmcgZG91YmxlIi4KKyMgPz8/IEluIG9yaWdpbmFsIG1ha2VmaWxlLCBpdCB3YXMgZW5hYmxlZCBmb3IgYWxsIGZpbGVzIG9uIHdpbl8zMiBhbmQgd2luXzY0LCBhbmQgb25seSBmb3Igb25lCisjIGZpbGUga21wX2F0b21pYy5jIG9uIHdpbl8zMmUuCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBjLWZsYWdzICAgKz0gLVFsb25nX2RvdWJsZQorICAgIGN4eC1mbGFncyArPSAtUWxvbmdfZG91YmxlCitlbmRpZgorCisjIEVuYWJsZSBzYXZpbmcgY29tcGlsZXIgb3B0aW9ucyBhbmQgdmVyc2lvbiBpbiBvYmplY3QgZmlsZXMgYW5kIGxpYnJhcmllcy4KK2lmZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgIyBOZXdlciBNUyBsaW5rZXIgaXNzdWVzIHdhcm5pbmdzIGlmIC1Rc294IGlzIHVzZWQ6CisgICAgICAgICMgIndhcm5pbmcgTE5LNDIyNDogL0NPTU1FTlQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsgIGlnbm9yZWQiCisgICAgICAgICMgc28gbGV0IHVzIGNvbW1lbnQgaXQgb3V0IChhbmQgZGVsZXRlIGxhdGVyKS4KKyAgICAgICAgIyBpZm5lcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgIyAgICAgYy1mbGFncyAgICs9IC1Rc294CisgICAgICAgICMgICAgIGN4eC1mbGFncyArPSAtUXNveAorICAgICAgICAjIGVuZGlmCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLVFzb3gKKyAgICBlbHNlCisgICAgICAgICMgRm9yIHVua25vd24gcmVhc29uLCBpY2MgYW5kIGlmb3J0IG9uIG1hYyBkb2VzIG5vdCBhY2NlcHQgdGhpcyBvcHRpb24uCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBsaW4gbHJiLCQob3MpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICAgKz0gLXNveAorICAgICAgICAgICAgY3h4LWZsYWdzICArPSAtc294CisgICAgICAgICAgICBmb3J0LWZsYWdzICs9IC1zb3gKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChvcykiICJscmIiCisgICAgYy1mbGFncyAgICArPSAtbW1pYworICAgIGN4eC1mbGFncyAgKz0gLW1taWMKKyAgICBmb3J0LWZsYWdzICs9IC1tbWljCisgICAgbGQtZmxhZ3MgICArPSAtbW1pYworICAgIGFzLWZsYWdzICAgKz0gLW1taWMKKyAgICBjcHAtZmxhZ3MgICs9IC1tbWljCitlbmRpZgorCisjIEV4Y2VwdGlvbiBoYW5kbGluZy4KK2lmZXEgIiQob3MpIiAid2luIgorICAgICMgPz8/IEVuYWJsZSBleGNlcHRpb24gaGFuZGxpbmc/CisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgYy1mbGFncyAgICs9IC1FSHNjCisgICAgICAgIGN4eC1mbGFncyArPSAtRUhzYworICAgIGVuZGlmCitlbHNlCisgICAgIyBEaXNhYmxlIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICBjLWZsYWdzICAgKz0gLWZuby1leGNlcHRpb25zCisgICAgY3h4LWZsYWdzICs9IC1mbm8tZXhjZXB0aW9ucworZW5kaWYKKworIyBEaXNhYmxlIHVzZSBvZiBFQlAgYXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBjLWZsYWdzICAgKz0gLU95LQorICAgICAgICBjeHgtZmxhZ3MgKz0gLU95LQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgImxpbiIKKyAgICBjLWZsYWdzICAgKz0gLVdzaWduLWNvbXBhcmUKKyAgICBjeHgtZmxhZ3MgKz0gLVdzaWduLWNvbXBhcmUKKyAgICBsZC1mbGFncyAgKz0gLVdzaWduLWNvbXBhcmUKKyAgICBpZmVxICIkKGZpbHRlciBnY2MgY2xhbmcsJChjKSkiICIiCisgICAgICAgIGMtZmxhZ3MgICArPSAtV2Vycm9yCisgICAgICAgIGN4eC1mbGFncyArPSAtV2Vycm9yCisgICAgICAgIGxkLWZsYWdzICArPSAtV2Vycm9yCisgICAgZW5kaWYKK2VuZGlmCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBjLWZsYWdzICAgKz0gLVdYCisgICAgY3h4LWZsYWdzICs9IC1XWAorICAgIGxkLWZsYWdzICArPSAtV1g6Tk8KK2VuZGlmCisKK2lmZXEgIiQob3MpIiAibHJiIgorICAgICMgV2l0aCAiLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjIiB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGZhc3RlciBjb2RlIGZvciBzdGF0aWMgVExTCisgICAgIyBhY2Nlc3NlcywgaXQgZ2VuZXJhdGVzIHNsb3dlciBjYWxscyB0byBnbGliYyBvdGhlcndpc2UuIFdlIGRvbid0IHVzZSB0aGlzCisgICAgIyBmZWF0dXJlIG9uIExpbnV4IGJlY2F1c2UgaXQgcHJldmVudHMgZHluYW1pYyBsb2FkaW5nICh1c2Ugb2YgZGxvcGVuKSBvZiB0aGUgbGlicmFyeS4KKyAgICAjIFJlbGlhYmxlIGR5bmFtaWMgbG9hZGluZyBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHNsaWdodGx5IGZhc3RlciBhY2Nlc3MgdG8gVExTLgorICAgICMgT24gSW50ZWwoUikgWGVvbiBQaGkoVE0pIGNvcHJvY2Vzc29yIHdlIGhhdmVuJ3QgZW5jb3VudGVyZWQgZHluYW1pYyBsb2FkaW5nIHByb2JsZW0geWV0LCBzbyB1c2UgZmFzdGVyCisgICAgIyBhY2Nlc3MgdG8gc3RhdGljIFRMUy4KKyAgICBjLWZsYWdzICAgKz0gLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjCisgICAgY3h4LWZsYWdzICs9IC1mdGxzLW1vZGVsPWluaXRpYWwtZXhlYworICAgICMgZGlzYWJsZSBzdHJlYW1pbmcgc3RvcmVzIGluIG9yZGVyIHRvIHdvcmsgb24gQTAgU2kKKyAgICBjLWZsYWdzICAgKz0gLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyCisgICAgY3h4LWZsYWdzICs9IC1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlcgorZW5kaWYKKworIyBTZWxlY3QgQyBydW50aW1lLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgIyBSZWdhcmRsZXNzIG9mIGZvbGxvd2luZyAtWmwgb3B0aW9uLCB3ZSBzaG91bGQgc3BlY2lmeSAtTVQgb3IgLU1UZCwgb3RoZXJ3aXNlIHRlc3QtdG91Y2gKKyAgICAjIHdpbCBmYWlscyBkdWUgdG8gdW5yZXNvbHZlZCByZWZlcmVuY2UgIl9lcnJubyIuCisgICAgaWZlcSAiJChPUFRJTUlaQVRJT04pIiAib24iCisgICAgICAgIGMtZmxhZ3MgICArPSAtTVQKKyAgICAgICAgY3h4LWZsYWdzICs9IC1NVAorICAgIGVsc2UKKyAgICAgICAgYy1mbGFncyAgICs9IC1NVGQKKyAgICAgICAgY3h4LWZsYWdzICs9IC1NVGQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoTElOS19UWVBFKSIgInN0YXQiCisgICAgICAgICMgRG8gbm90IGVtaXQgQyBydW50aW1lIGxpYnJhcnkgdG8gb2JqZWN0IGZpbGUuIEl0IHdpbGwgYWxsb3dzIGxpbmsgT3Blbk1QIFJUTCB3aXRoIGVpdGhlciBzdGF0aWMKKyAgICAgICAgIyBvciBkeW5hbWljIEMgcnVudGltZS4gV2luZG93cyogT1Mgc3BlY2lmaWMsIGFwcGxpY2FibGUgb25seSB0byBzdGF0aWMgUlRMLgorICAgICAgICBjLWZsYWdzICAgKz0gLVpsCisgICAgICAgIGN4eC1mbGFncyArPSAtWmwKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChvcykiICJ3aW4iCisgICAgYy1mbGFncyAgICs9IC1XMworICAgIGN4eC1mbGFncyArPSAtVzMKKyAgICAjIERpc2FibGUgd2FybmluZzogIi4uLiBkZWNsYXJlZCBidXQgbmV2ZXIgcmVmZXJlbmNlZCIKKyAgICAjIERpc2FibGUgcmVtYXJrICM1MDgyOiBEaXJlY3RpdmUgaWdub3JlZCAtIFN5bnRheCBlcnJvciwgZm91bmQgSURFTlRJRklFUiAnTFJCJy4uLgorICAgIGZvcnQtZmxhZ3MgICArPSAtUWRpYWctZGlzYWJsZToxNzcsNTA4MgorICAgIGMtZmxhZ3MgICAgICArPSAtUWRpYWctZGlzYWJsZToxNzcKKyAgICBjeHgtZmxhZ3MgICAgKz0gLVFkaWFnLWRpc2FibGU6MTc3CitlbmRpZgorCitpZmVxICIkKENQTFVTUExVUykiICJvbiIKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1UUAorICAgIGVsc2UKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAteCBjKysgLXN0ZD1jKysweAorICAgICAgICBlbHNlCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLUtjKysKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gTGlua2VyIG9wdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIGlmZXEgIiQobGQpIiAibGQiCisgICAgICAgICAgICAjIFdhcm4gYWJvdXQgbm9uLVBJQyBjb2RlIHByZXNlbmNlCisgICAgICAgICAgICBsZC1mbGFncyArPSAtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pCisgICAgICAgICAgICBsZC1mbGFncyArPSAtbHB0aHJlYWQKKyAgICAgICAgZWxzZSAjICQoYykgb3IgJChjeHgpCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1wdGhyZWFkCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgIGxkLWZsYWdzICs9IC1mUElDCisgICAgICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1nCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoT1BUSU1JWkFUSU9OKSIgIm9mZiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1PMAorICAgICAgICBlbmRpZgorICAgICAgICBsZC1mbGFncyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgICBlbHNlCisgICAgICAgIGxkLWZsYWdzICs9IC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNfZGlyKWV4cG9ydHNfc28udHh0CisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgICMgdG8gcmVtb3ZlIGRlcGVuZGVuY3kgb24gbGliaW1mLCBsaWJzdm1sLCBsaWJpbnRsYzoKKyAgICAgICAgaWZlcSAiJChjKSIgImljYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWludGVsCisgICAgICAgIGVuZGlmCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtV2wsLS1hcy1uZWVkZWQKKyAgICAgICAgIyB0byByZW1vdmUgZGVwZW5kZW5jeSBvbiBsaWJnY2NfczoKKyAgICAgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWxpYmdjYworICAgICAgICAgICAgaWZuZXEgIiQob21wX29zKSIgImZyZWVic2QiCisgICAgICAgICAgICAgICAgbGQtZmxhZ3MtZXh0cmEgKz0gLVdsLC1sZGwKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYykiICJjbGFuZyIKKyAgICAgICAgICAgIGlmbmVxICIkKG9tcF9vcykiICJmcmVlYnNkIgorICAgICAgICAgICAgICAgIGxkLWZsYWdzLWV4dHJhICs9IC1XbCwtbGRsCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICBpZmVxICIkKGZpbHRlciBnY2MgY2xhbmcsJChjKSkiICIiCisgICAgICAgICAgICAjIHRvIHdvcmthcm91bmQgQ1EyMTUyMjkgbGluayBsaWJpcmNfcGljIG1hbnVhbGx5CisgICAgICAgICAgICBsZC1mbGFncy1leHRyYSArPSAtbGlyY19waWMKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoZmlsdGVyIDMyIDMyZSA2NCwkKGFyY2gpKSIgIiIKKyAgICAgICAgICAgIGxkLWZsYWdzLWV4dHJhICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWxpYnMgbGliZmZpKQorICAgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgICMgPz8/CisgICAgICAgICAgICBsZC1mbGFncyArPSAtQnN0YXRpYyAtTC91c3IvbGliNjQgLWxjX25vbnNoYXJlZCAtQmR5bmFtaWMKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChvcykiICJscmIiCisgIGlmZXEgIiQobGQpIiAibGQiCisgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLWx0aHIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdAorICAgICAgICAjIFdhcm4gYWJvdXQgbm9uLVBJQyBjb2RlIHByZXNlbmNlCisgICAgICAgIGxkLWZsYWdzICs9IC0td2Fybi1zaGFyZWQtdGV4dHJlbAorICAgIGVuZGlmCisgICAgbGQtZmxhZ3MgKz0gLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgZW5kaWYKKyAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgIGxkLWZsYWdzICs9IC1XbCwtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICBsZC1mbGFncyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgICBsZC1mbGFncyArPSAtc3RhdGljLWludGVsCisgICAgIyBEb24ndCBsaW5rIGxpYmNpbGsqLgorICAgIGxkLWZsYWdzICs9IC1uby1pbnRlbC1leHRlbnNpb25zCisgICAgIyBEaXNjYXJkIHVubmVlZGVkIGRlcGVuZGVuY2llcy4KKyAgICBsZC1mbGFncyArPSAtV2wsLS1hcy1uZWVkZWQKKyMgICAgbGQtZmxhZ3MgKz0gLW5vZGVmYXVsdGxpYnMKKyAgICAjIFRvIGNoZWNrIHdoaWNoIGxpYnJhcmllcyB0aGUgY29tcGlsZXIgbGlua3MgY29tbWVudCBhYm92ZSBsaW5lIGFuZCB1bmNvbW1lbnQgYmVsb3cgbGluZQorIyAgICBsZC1mbGFncyArPSAtXCMKKyAgICAjIGxpbmsgbGlicmFyaWVzIGluIHRoZSBvcmRlciB0aGUgaWNjIGNvbXBpbGVyIHVzZXMgKG9idGFpbmVkIHVzaW5nICJpY2MgLXNoYXJlZCAtIyIgY29tbWFuZCBsaW5lKQorICAgICMgQ29tcGlsZXIgMjAxMDEwMTcgdXNlcyAiLWxpbnRsYyAtbHRociAtbGMgLWxpbnRsYyAtbGlyY19zIiBzZXF1ZW5jZSwgd2UgZm9sbG93IGl0OgorIyAgICBsZC1mbGFncyArPSAtbGludGxjCisgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLXB0aHJlYWQKKyAgICAgICAgaWZlcSAiJChNSUNfT1MpIiAibGluIgorICAgICAgICAgICAgbGQtZmxhZ3MgKz0gLWxkbAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBsZC1mbGFncyArPSAtbm8taW50ZWwtZXh0ZW5zaW9ucworICAgIGVuZGlmCisgICAgbGQtZmxhZ3MgKz0gLXNpbmdsZV9tb2R1bGUKKyAgICBsZC1mbGFncyArPSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTikuMCAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoVkVSU0lPTikuMAorZW5kaWYKKworaWZlcSAiJChvcykiICJ3aW4iCisgICAgbGQtZmxhZ3MgKz0gLWluY3JlbWVudGFsOm5vCisgICAgbGQtZmxhZ3MgKz0gLXZlcnNpb246JChWRVJTSU9OKS4wCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3Qtc3BlY2lmaWMgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjcHAtZmxhZ3MgKz0gLUQgS01QX0FSQ0hfU1RSPSJcIiQoY2FsbCBsZWdhbF9hcmNoLCQoYXJjaCkpXCIiCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBfV0lORE9XUyAtRCBfV0lOTlQgLUQgX1dJTjMyX1dJTk5UPTB4MDUwMQorICAgICMgMHgwNTAxIG1lYW5zIFdpbmRvd3MqIFhQKiBPUyBvciBXaW5kb3dzKiBTZXJ2ZXIgMjAwMyogT1Mgb3IgbGF0ZXIuCisgICAgIyBXZSBuZWVkIHRoaXMgZm9yIEdldE1vZHVsZUhhbmxlRXggZnVuY3Rpb24uCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIF9VU1JETEwKKyAgICBlbmRpZgorZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgIGNwcC1mbGFncyArPSAtRCBfR05VX1NPVVJDRQorICAgIGNwcC1mbGFncyArPSAtRCBfUkVFTlRSQU5UCitlbmRpZgorCisjIFRPRE86IERJQUcgbGVhZHMgdG8gREVCVUcuIENvbmZ1c2luZyBhIGJpdC4gUmFuYW1lIEtNUF9ERUJVRyB0byBLTVBfRElBRz8KK2lmZXEgIiQoRElBRykiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX0RFQlVHCitlbmRpZgoraWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgQ09WRVIKK2VuZGlmCisjIEFzc2VydGlvbnMgaW4gT01QIFJUTCBjb2RlIGFyZSBjb250cm9sbGVkIGJ5IHR3byBtYWNyb3M6IEtNUF9ERUJVRyBlbmFibGVzIG9yIGRpc2FibGVzIGFzc2VydGlvbnMKKyMgaWZmIEtNUF9VU0VfQVNTRVJUIGlzIGRlZmluZWQuIElmIEtNUF9VU0VfQVNTRVJUIGlzIG5vdCBkZWZpbmVkLCBhc3NlcnRpb25zIGRpc2FibGVkIHJlZ2FyZGxlc3Mgb2YKKyMgS01QX0RFQlVHLiBJdCB3YXMgaW1wbGVtZW50ZWQgZm9yIGNvZGUgY292ZXJhZ2UgLS0gdG8gaGF2ZSBkZWJ1ZyBidWlsZCB3aXRoIG5vIGFzc2VydGlvbiwgYnV0IGl0CisjIGRvZXMgbm90IGhhdmUgbXVjaCBlZmZlY3QuIFRPRE86IFJlbW92ZSBtYWNyby4KK2lmZXEgIiQoQ09WRVJBR0UpIiAib2ZmIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfVVNFX0FTU0VSVAorZW5kaWYKKworY3BwLWZsYWdzICs9IC1EIEJVSUxEX0k4CitpZm5lcSAiJChvcykiICJ3aW4iCisgICAgY3BwLWZsYWdzICs9IC1EIEJVSUxEX1RWCitlbmRpZgorY3BwLWZsYWdzICs9IC1EIEtNUF9MSUJSQVJZX0ZJTEU9XCIkKGxpYl9maWxlKVwiCitjcHAtZmxhZ3MgKz0gLUQgS01QX1ZFUlNJT05fTUFKT1I9JChWRVJTSU9OKQorY3BwLWZsYWdzICs9IC1EIENBQ0hFX0xJTkU9NjQKK2NwcC1mbGFncyArPSAtRCBLTVBfQURKVVNUX0JMT0NLVElNRT0xCitjcHAtZmxhZ3MgKz0gLUQgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorY3BwLWZsYWdzICs9IC1EIEtNUF9BU01fSU5UUklOUworaWZuZXEgIiQob3MpIiAibHJiIgorICAgIGNwcC1mbGFncyArPSAtRCBVU0VfTE9BRF9CQUxBTkNFCitlbmRpZgoraWZuZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBVU0VfQ0JMS0RBVEEKKyAgICAjID8/PyBXaW5kb3dzKiBPUzogVVNFX0NCTEtEQVRBIGRlZmluZWQgaW4ga21wLmguCitlbmRpZgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9XSU5fQ0RFQ0wKK2VuZGlmCitpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgIGNwcC1mbGFncyArPSAtRCBHVUlERURMTF9FWFBPUlRTCitlbmRpZgoraWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfU1RVQgorZW5kaWYKK2lmZXEgIiQoVkVSU0lPTikiICI0IgorZWxzZSAjIDUKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICBlbHNlCisgICAgICAgIGNwcC1mbGFncyArPSAtRCBLTVBfR09NUF9DT01QQVQKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgIiQoZmlsdGVyIDMyIDMyZSwkKGFyY2gpKSIgIiIKK2NwcC1mbGFncyArPSAtRCBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTPTEgLUQgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTPTAKK2VuZGlmCisKKyMgZGVmaW5lIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQgT3Blbk1QIHZlcnNpb25zCitoYXZlX29tcF81MD0wCitoYXZlX29tcF80MT0wCitoYXZlX29tcF80MD0wCitoYXZlX29tcF8zMD0wCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjUwIgorCWhhdmVfb21wXzUwPTEKKwloYXZlX29tcF80MT0xCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjQxIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0xCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjQwIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0wCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjMwIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0wCisJaGF2ZV9vbXBfNDA9MAorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitjcHAtZmxhZ3MgKz0gLUQgT01QXzUwX0VOQUJMRUQ9JChoYXZlX29tcF81MCkgLUQgT01QXzQxX0VOQUJMRUQ9JChoYXZlX29tcF80MSkKK2NwcC1mbGFncyArPSAtRCBPTVBfNDBfRU5BQkxFRD0kKGhhdmVfb21wXzQwKSAtRCBPTVBfMzBfRU5BQkxFRD0kKGhhdmVfb21wXzMwKQorCisKKyMgVXNpbmcgaXR0bm90aWZ5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KK1VTRV9JVFRfTk9USUZZID0gMQoraWZlcSAiJChvcyktJChhcmNoKSIgIndpbi02NCIKKyAgICBVU0VfSVRUX05PVElGWSA9IDAKK2VuZGlmCitpZmVxICIkKExJTktfVFlQRSkiICJzdGF0IgorICAgIFVTRV9JVFRfTk9USUZZID0gMAorZW5kaWYKK2NwcC1mbGFncyArPSAtRCBVU0VfSVRUX05PVElGWT0kKFVTRV9JVFRfTk9USUZZKQoraWZlcSAiJChVU0VfSVRUX05PVElGWSkiICIwIgorICAgICMgRGlzYWJsZSBhbGwgaXR0bm90aWZ5IGNhbGxzLgorICAgIGNwcC1mbGFncyArPSAtRCBJTlRFTF9OT19JVFROT1RJRllfQVBJCitlbHNlCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGl0dG5vdGlmeV9zdGF0aWMkKG9iaikgOiBjcHAtZmxhZ3MgKz0gLUQgVU5JQ09ERQorICAgIGVuZGlmCitlbmRpZgorIyBTcGVjaWZ5IHByZWZpeCB0byBiZSB1c2VkIGZvciBleHRlcm5hbCBzeW1ib2xzLiBQcmVmaXggaXMgcmVxdWlyZWQgZXZlbiBpZiBJVFQgTm9maXR5IHR1cm5lZCBvZmYKKyMgYmVjYXVzZSB3ZSBoYXZlIHNvbWUgZnVuY3Rpb25zIHdpdGggX19pdHRfIHByZWZpeCAoX19pdHRfZXJyb3JfaGFuZGxlcikgYW5kIHdhbnQgcHJlZml4IHRvIGJlCisjIGNoYW5nZWQgdG8gX19rbXBfaXR0Xy4KK2NwcC1mbGFncyArPSAtRCBJTlRFTF9JVFROT1RJRllfUFJFRklYPV9fa21wX2l0dF8KKworCisjIExpbnV4KiBPUzogX19kZWNsc3BlYyh0aHJlYWQpIFRMUyBpcyBzdGlsbCBidWdneSBvbiBzdGF0aWMgYnVpbGRzLgorIyBXaW5kb3dzKiBPUzogVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkgKyBkZWNsc3BlYyh0aHJlYWQpIG9uIFdpbmRvd3MqIE9TLiBTZWUgQ1E1MDU2NCwKKyMgICAgIHRlc3RzIGttcF9sb2FkX2xpYnJhcnlfbGliKi5jLCBhbmQgdGhlIGZvbGxvd2luZyBNU0ROIHJlZmVyZW5jZToKKyMgICAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2CitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiwkKG9zKSkiICIiCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9UREFUQV9HVElECisgICAgZWxzZQorICAgICAgICAjIEFDOiBhbGxvdyBfX3RocmVhZCBpbiBzdGF0aWMgYnVpbGQgZm9yIEludGVsKFIpIDY0LCBsb29rcyBsaWtlIGl0IGlzCisgICAgICAgICMgd29ya2luZyB0aGVyZS4gSXQgaXMgYnJva2VuIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBmb3IgUkhFTDQgYW5kIFNMRVM5LgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9UREFUQV9HVElECisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgSW50ZWwgY29tcGlsZXIgaGFzIGEgYnVnOiBpbiBjYXNlIG9mIGNyb3NzLWJ1aWxkIGlmIHVzZWQgd2l0aAorIyAteCBhc3NlbWJsZXItd2l0aC1jcHAgb3B0aW9uLCBpdCBkZWZpbmVzIG1hY3JvcyBmb3IgYm90aCBhcmNoaXRlY3R1cmVzLAorIyBob3N0IGFuZCB0YXJ0Z2V0LiBGb3IgZXhhbXBsZSwgaWYgY29tcGlsZXIgZm9yIElBLTMyIGFyY2hpdGVjdHVyZQorIyBydW5zIG9uIEludGVsKFIpIDY0LCBpdCBkZWZpbmVzIGJvdGggX19pMzg2IGFuZCBfX3g4Nl82NC4gKE5vdGUgaXQgaXMgYSBidWcKKyMgb25seSBpZiAteCBhc3NlbWJsZXItd2l0aC1jcHAgaXMgc3BlY2lmaWVkLCBpbiBjYXNlIG9mIEMgZmlsZXMgaWNjIGRlZmluZXMKKyMgb25seSBvbmUsIHRhcmdldCBhcmNoaXRlY3R1cmUpLiBTbyB3ZSBjYW5ub3QgYXV0b2RldGVjdCB0YXJnZXQgYXJjaGl0ZWN0dXJlCisjIHdpdGhpbiB0aGUgZmlsZSwgYW5kIGhhdmUgdG8gcGFzcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIGZyb20gY29tbWFuZCBsaW5lLgoraWZuZXEgIiQob3MpIiAid2luIgorICAgIGlmZXEgIiQoYXJjaCkiICJhcm0iCisgICAgICAgIHpfTGludXhfYXNtJChvYmopIDogXAorCQkgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX0FSTQorICAgIGVsc2UKKyAgICAgICAgel9MaW51eF9hc20kKG9iaikgOiBcCisgICAgICAgICAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX0FSQ0hfWDg2JChpZiAkKGZpbHRlciAzMmUsJChhcmNoKSksXzY0KQorICAgIGVuZGlmCitlbmRpZgorCisjIERlZmluaW5nIEtNUF9CVUlMRF9EQVRFIGZvciBhbGwgZmlsZXMgbGVhZHMgdG8gd2FybmluZyAiaW5jb21wYXRpYmxlIHJlZGVmaW5pdGlvbiIsIGJlY2F1c2UgdGhlCisjIHNhbWUgbWFjcm8gaXMgYWxzbyBkZWZpbmVkIGluIG9tcC5oLiBUbyBhdm9pZCBjb25mbGljdCwgbGV0IHVzIGRlZmluZSBtYWNybyB3aXRoIGRpZmZlcmVudCBuYW1lLAorIyBfS01QX0JVSUxEX1RJTUUuCitrbXBfdmVyc2lvbiQob2JqKSA6IGNwcC1mbGFncyArPSAtRCBfS01QX0JVSUxEX1RJTUU9IlwiJChkYXRlKVwiIgorCisjIC0tLSBNYWNyb3MgZm9yIGdlbmVyYXRlLWRlZi5wbCAtLS0KKworZ2QtZmxhZ3MgKz0gLUQgYXJjaF8kKGFyY2gpCitnZC1mbGFncyArPSAtRCAkKExJQl9UWVBFKQoraWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKyAgICBnZC1mbGFncyArPSAtRCBPTVBfNDAgLUQgT01QXzMwCitlbHNlCisgICAgaWZlcSAiJChPTVBfVkVSU0lPTikiICIzMCIKKyAgICAgICAgZ2QtZmxhZ3MgKz0gLUQgT01QXzMwCisgICAgZW5kaWYKK2VuZGlmCitpZm5lcSAiJChWRVJTSU9OKSIgIjQiCisgICAgZ2QtZmxhZ3MgKz0gLUQgbXN2Y19jb21wYXQKK2VuZGlmCitpZmVxICIkKERJQUcpIiAib24iCisgICAgZ2QtZmxhZ3MgKz0gLUQgS01QX0RFQlVHCitlbmRpZgorCisjIC0tLSBNYWNybyBmb3IgZXhwYW5kLXZhcnMucGwgLS0tCisKKyMgJFJldmlzaW9uIGFuZCAkRGF0ZSBvZnRlbiBvY2N1ciBpbiBmaWxlIGhlYWRlciwgc28gZGVmaW5lIHRoZXNlIHZhcmlhYmxlcyB0byBzYXRpc2Z5IGV4cGFuZC12YXJzLnBsLgorZXYtZmxhZ3MgKz0gLUQgUmV2aXNpb249IlwkJFJldmlzaW9uIiAtRCBEYXRlPSJcJCREYXRlIgorCisjIFZhcmlvdXMgdmFyaWFibGVzLgorZXYtZmxhZ3MgKz0gLUQgS01QX1RZUEU9IiQoY2FsbCBsZWdhbF90eXBlLCQoTElCX1RZUEUpKSIgLUQgS01QX0FSQ0g9IiQoY2FsbCBsZWdhbF9hcmNoLCQoYXJjaCkpIgorZXYtZmxhZ3MgKz0gLUQgS01QX1ZFUlNJT05fTUFKT1I9JChWRVJTSU9OKSAtRCBLTVBfVkVSU0lPTl9NSU5PUj0wIC1EIEtNUF9WRVJTSU9OX0JVSUxEPSQoYnVpbGQpCitldi1mbGFncyArPSAtRCBLTVBfQlVJTERfREFURT0iJChkYXRlKSIKK2V2LWZsYWdzICs9IC1EIEtNUF9UQVJHRVRfQ09NUElMRVI9JChUQVJHRVRfQ09NUElMRVIpCitldi1mbGFncyArPSAtRCBLTVBfRElBRz0kKGlmICQoZmlsdGVyIG9uLCQoRElBRykpLDEsMCkKK2V2LWZsYWdzICs9IC1EIEtNUF9ERUJVR19JTkZPPSQoaWYgJChmaWx0ZXIgb24sJChERUJVR19JTkZPKSksMSwwKQoraWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKyAgICBldi1mbGFncyArPSAtRCBPTVBfVkVSU0lPTj0yMDEzMDcKK2Vsc2UKKyAgICBpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjMwIgorICAgICAgICBldi1mbGFncyArPSAtRCBPTVBfVkVSU0lPTj0yMDExMDcKKyAgICBlbHNlCisgICAgICAgIGV2LWZsYWdzICs9IC1EIE9NUF9WRVJTSU9OPTIwMDUwNQorICAgIGVuZGlmCitlbmRpZgorCisjIC0tIE9wdGlvbnMgc3BlY2lmaWVkIGluIGNvbW1hbmQgbGluZSAtLS0KKworY3BwLWZsYWdzICArPSAkKENQUEZMQUdTKQorYy1mbGFncyAgICArPSAkKENGTEFHUykKK2N4eC1mbGFncyAgKz0gJChDWFhGTEFHUykKK2ZvcnQtZmxhZ3MgKz0gJChGRkxBR1MpCitsZC1mbGFncyAgICs9ICQoTERGTEFHUykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBMaWJyYXJ5IGZpbGVzLiBUaGVzZSBmaWxlcyBwYXJ0aWNpcGF0ZSBpbiBhbGwga2luZHMgb2YgbGlicmFyeS4KK2xpYl9jX2l0ZW1zIDo9ICAgICAgXAorICAgIGttcF9mdG5fY2RlY2wgICBcCisgICAga21wX2Z0bl9leHRyYSAgIFwKKyAgICBrbXBfdmVyc2lvbiAgICAgXAorICAgICQoZW1wdHkpCitsaWJfY3BwX2l0ZW1zIDo9CitsaWJfYXNtX2l0ZW1zIDo9CisKKyMgRmlsZXMgdG8gYmUgbGlua2VkIGludG8gaW1wb3J0IGxpYnJhcnkuCitpbXBfY19pdGVtcyA6PQorCitkb190ZXN0X3RvdWNoX210IDo9IDEKKworaWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgIGxpYl9jX2l0ZW1zICs9IGttcF9zdHViCitlbHNlICMgbm9ybSBvciBwcm9mCisgICAgbGliX2NfaXRlbXMgKz0gICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfYWxsb2MgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2F0b21pYyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9jc3VwcG9ydCAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZGVidWcgICAgICAgICAgICAgICAgICAgIFwKKwlrbXBfaXR0ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJChlbXB0eSkKKyAgICBpZmVxICIkKFVTRV9JVFRfTk9USUZZKSIgIjEiCisgICAgICAgIGxpYl9jX2l0ZW1zICs9ICBpdHRub3RpZnlfc3RhdGljCisgICAgZW5kaWYKKworCisgICAgbGliX2NwcF9pdGVtcyArPSAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZW52aXJvbm1lbnQgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2Vycm9yICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9nbG9iYWwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfaTE4biAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2lvICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9ydW50aW1lICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfc2V0dGluZ3MgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3N0ciAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF90YXNraW5nICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfdGFza3EgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3RocmVhZHByaXZhdGUgICAgICAgICAgICBcCisgICAgICAgIGttcF91dGlsaXR5ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfYWZmaW5pdHkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2Rpc3BhdGNoICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9sb2NrICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfc2NoZWQgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJChlbXB0eSkKKworaWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKyAgICBsaWJfY3BwX2l0ZW1zICs9IGttcF90YXNrZGVwcworICAgIGxpYl9jcHBfaXRlbXMgKz0ga21wX2NhbmNlbAorZW5kaWYKKworICAgICMgT1Mtc3BlY2lmaWMgZmlsZXMuCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGxpYl9jX2l0ZW1zICs9IHpfV2luZG93c19OVF91dGlsCisgICAgICAgICMgQXJjaC1zcGVjaWZpYyBmaWxlcy4KKyAgICAgICAgbGliX2NfaXRlbXMgICArPSB6X1dpbmRvd3NfTlQtNTg2X3V0aWwKKyAgICAgICAgbGliX2FzbV9pdGVtcyArPSB6X1dpbmRvd3NfTlQtNTg2X2FzbQorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICAgICAgaW1wX2NfaXRlbXMgKz0ga21wX2ltcG9ydAorICAgICAgICAgICAgIyBmb3Igd2luXzMyL3dpbl8zMmUgZHluYW1pYyBsaWJndWlkZTQwLmRsbCwKKyAgICAgICAgICAgICMgYnVpbGQgdGhlIHNoaW0gbGliIGluc3RlYWQKKyAgICAgICAgICAgIGlmZXEgIiQoVkVSU0lPTikiICI0IgorICAgICAgICAgICAgICAgIGlmbmVxICIkKGFyY2gpIiAiNjQiCisgICAgICAgICAgICAgICAgICAgIGlmZXEgIiQoTElCX1RZUEUpIiAibm9ybSIKKyAgICAgICAgICAgICAgICAgICAgbGliX2NfaXRlbXMgICA9IGttcF9zaGltCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJfY3BwX2l0ZW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYl9hc21faXRlbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2QtZmxhZ3MgKz0gLUQgc2hpbQorICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3Igc29tZSByZWFzb24sIHRlc3QtdG91Y2gtbWQgaXMgYWJsZSB0byB3b3JrIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGJ1aWxkIGNvbXBpbGVyJ3MgdmVyc2lvbiBvZiBsaWJpb21wNW1kLmRsbCwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3QtdG91Y2gtbXQgY2FuJ3QgbG9hZCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX3Rlc3RfdG91Y2hfbXQgOj0gMAorICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgIGVsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICAgICAgbGliX2NfaXRlbXMgKz0gel9MaW51eF91dGlsCisgICAgICAgICMgR0NDIENvbXBhdGliaWxpdHkgZmlsZXMKKyAgICAgICAgaWZlcSAiJChWRVJTSU9OKSIgIjQiCisgICAgICAgIGVsc2UgIyA1CisgICAgICAgICAgICBsaWJfY19pdGVtcyArPSBrbXBfZ3N1cHBvcnQKKyAgICAgICAgZW5kaWYKKyAgICAgICAgbGliX2FzbV9pdGVtcyArPSB6X0xpbnV4X2FzbQorICAgIGVuZGlmCitlbmRpZgorCitsaWJfb2JqX2ZpbGVzIDo9ICQoc29ydCAkKGFkZHN1ZmZpeCAkKG9iaiksJChsaWJfY19pdGVtcykgJChsaWJfY3BwX2l0ZW1zKSAkKGxpYl9hc21faXRlbXMpKSkKK2ltcF9vYmpfZmlsZXMgOj0gJChzb3J0ICQoYWRkc3VmZml4ICQob2JqKSwkKGltcF9jX2l0ZW1zKSAkKGltcF9jcHBfaXRlbXMpICQoaW1wX2FzbV9pdGVtcykpKQorZGVwX2ZpbGVzICAgICA6PSAkKHNvcnQgJChhZGRzdWZmaXggLmQsJChsaWJfY19pdGVtcykgJChsaWJfY3BwX2l0ZW1zKSAkKGltcF9jX2l0ZW1zKSAkKGltcF9jcHBfaXRlbXMpKSkKK2lfZmlsZXMgICAgICAgOj0gJChzb3J0ICQoYWRkc3VmZml4IC5pLCQobGliX2NfaXRlbXMpICQobGliX2NwcF9pdGVtcykgJChpbXBfY19pdGVtcykgJChpbXBfY3BwX2l0ZW1zKSkpCisKKworIyAtLS0gQ29uc3RydWN0IGxpYnJhcnkgZmlsZSBuYW1lIC0tLQorCitpZmVxICIkKFZFUlNJT04pIiAiNCIKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIF9saWJfaXRlbSA9IGxpYm9tcHN0dWIKKyAgICBlbHNlICMgbm9ybSBvciBwcm9mCisgICAgICAgIF9saWJfaXRlbSA9IGxpYmd1aWRlCisgICAgZW5kaWYKKyAgICBpZmVxICIkKG9zKS0kKExJTktfVFlQRSkiICJ3aW4tZHluYSIKKyAgICAgICAgX2xpYl9pdGVtICs9IDQwCisgICAgZW5kaWYKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInByb2YiCisgICAgICAgIF9saWJfaXRlbSArPSBfc3RhdHMKKyAgICBlbmRpZgorZWxzZQorICAgIF9saWJfaXRlbSA9IGxpYmlvbXAKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInByb2YiCisgICAgICAgIF9saWJfaXRlbSArPSBwcm9mCisgICAgZW5kaWYKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIF9saWJfaXRlbSArPSBzdHVicworICAgIGVuZGlmCisgICAgX2xpYl9pdGVtICs9ICQoVkVSU0lPTikKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgICAgIF9saWJfaXRlbSArPSBtZAorICAgICAgICBlbHNlCisgICAgICAgICAgICBfbGliX2l0ZW0gKz0gbXQKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKyMgX2xpYl9pdGVtIGlzIGEgbGlzdCBvZiBzcGFjZSBzZXBhcmF0ZWQgbmFtZSBwYXJ0cy4gUmVtb3ZlIHNwYWNlcyB0byBmb3JtIGZpbmFsIG5hbWUuCitsaWJfaXRlbSA9ICQoc3Vic3QgJChzcGFjZSksLCQoX2xpYl9pdGVtKSkKK2lmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgbGliX2V4dCA9ICQoZGxsKQorZWxzZQorICAgIGxpYl9leHQgPSAkKGxpYikKK2VuZGlmCitsaWJfZmlsZSAgPSAkKGxpYl9pdGVtKSQobGliX2V4dCkKK2lmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgIndpbi1keW5hIgorICAgIGltcF9maWxlICA9ICQobGliX2l0ZW0pJChsaWIpCisgICAgZGVmX2ZpbGUgID0gJChsaWJfaXRlbSkuZGVmCisgICAgcmVzX2ZpbGUgID0gJChsaWJfaXRlbSkucmVzCisgICAgcmNfZmlsZSAgID0gJChsaWJfaXRlbSkucmMKKyAgICAjIFBEQiBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQgaWY6ICggREVCSUdfSU5GTyBpcyBvbiApIE9SICggd2UgYXJlIGJ1aWxkaW5nIDMyLWJpdCBub3JtYWwKKyAgICAjIGxpYnJhcnkgQU5EIHZlcnNpb24gaXMgNSApLgorICAgIGlmbmVxICIkKGZpbHRlciBvbiwkKERFQlVHX0lORk8pKSQoZmlsdGVyIG5vcm0tNSwkKExJQl9UWVBFKS0kKFZFUlNJT04pKSIgIiIKKyAgICAgICAgcGRiX2ZpbGUgPSAkKGxpYl9pdGVtKS5wZGIKKyAgICBlbmRpZgorZW5kaWYKK2lmbmVxICIkKGZpbHRlciBsaW4gbHJiLCQob3MpKSIgIiIKKyAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgaWZuZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgZGJnX2ZpbGUgPSAkKGxpYl9pdGVtKS5kYmcKKyAgICAgIGVuZGlmCisgICAgZWxzZQorICAgICAgICBkYmdfc3RyaXAgPSAib24iCisgICAgZW5kaWYKK2VuZGlmCisKKyMgLS0tIE91dHB1dCBmaWxlcyAtLS0KKworb3V0X2xpYl9maWxlcyAgPSAkKGFkZHByZWZpeCAkKG91dF9saWJfZGlyKSwkKGxpYl9maWxlKSAkKGltcF9maWxlKSAkKHBkYl9maWxlKSAkKGRiZ19maWxlKSkKK291dF9pbmNfZmlsZXMgID0gJChhZGRwcmVmaXggJChvdXRfcHRmX2RpcilpbmNsdWRlX2NvbXBhdC8saW9tcF9saWIuaCkKK291dF9tb2RfZmlsZXMgID0gXAorICAgICQoYWRkcHJlZml4ICQob3V0X3B0Zl9kaXIpaW5jbHVkZS8sb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QpCitvdXRfY21uX2ZpbGVzICA9IFwKKyAgICAkKGFkZHByZWZpeCAkKG91dF9jbW5fZGlyKWluY2x1ZGUvLG9tcC5oIG9tcF9saWIuaCBvbXBfbGliLmYgb21wX2xpYi5mOTApIFwKKyAgICAkKGFkZHByZWZpeCAkKG91dF9jbW5fZGlyKWluY2x1ZGVfY29tcGF0Lyxpb21wLmgpCitpZm5lcSAiJChvdXRfbGliX2ZhdF9kaXIpIiAiIgorICAgIG91dF9saWJfZmF0X2ZpbGVzICA9ICQoYWRkcHJlZml4ICQob3V0X2xpYl9mYXRfZGlyKSwkKGxpYl9maWxlKSAkKGltcF9maWxlKSkKK2VuZGlmCisKKyMgLS0tIFNwZWNpYWwgZGVwZW5kZW5jaWVzIC0tLQorCisjIFdlIGhhdmUgdG8gZW5jb2RlIGRlcGVuZGVuY2llcyBvbiBvbXAuaCBtYW51YWxseSwgYmVjYXVzZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBnZW5lcmF0aW9uCisjIGJ5IGNvbXBpbGVyIHByb2R1Y2VzIGRlcGVkZW5jeSBvbiBvbXAuaCBmaWxlIGxvY2F0ZWQgaW4gY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkuCitrbXBfY3N1cHBvcnQkKG9iaikgOiBvbXAuaAora21wX3N0dWIkKG9iaikgICAgIDogb21wLmgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRlcm5hbCBsaWJyYXJpZXMgdG8gbGluayBpbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBXZSAoYWN0dWFsbHksIG91ciBjdXN0b21lcnMpIGRvIG5vIHdhbnQgT3Blbk1QIFJUTCBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcywgc28gd2UgaGF2ZSB0bworIyBwaWNrIHVwIHNvbWUgb2JqZWN0IGZpbGVzIGZyb20gbGliaXJjIGxpYnJhcnkgKEludGVsIGNvbXBpbGVyIGdlbmVyYXRlIGNvZGUgd2l0aCBjYWxscyB0byBsaWJpcmMpCisjIGFuZCBsaW5rIHRoZW0gaW50byBPTVAgUlRMLgorIyBsaWJpcGdvIGlzIHJlcXVpcmVkIG9ubHkgZm9yIGNvbGxlY3RpbmcgY29kZSBjb3ZlcmFnZSBkYXRhLCBidXQgaXMgaXMgY29udmVuaWVudCB0byBsaW5rIGluIGludG8KKyMgT01QIFJUTCBhcyB3ZWxsLCBub3QgdG8gZGVwZW5kIG9uIGV4dHJhIGxpYnMgYW5kIHBhdGhzLgorCisjIGxpYmlyYyBkb2VzIG1hdHRlciBvbmx5IGlmIEludGVsIGNvbXBpbGVyIGlzIHVzZWQuCitpZm5lcSAiJChmaWx0ZXIgaWNjIGljbCBpY2wuZXhlLCQoYykpIiAiIgorCisgICAgaWZuZXEgIiQoSUNDX0xJQl9ESVIpIiAiIgorICAgICAgICBpY2NfbGliX2RpciA6PSAkKElDQ19MSUJfRElSKQorICAgIGVsc2UKKyAgICAgICAgIworICAgICAgICAjIExldCB1cyBmaW5kIHBhdGggdG8gSW50ZWwgbGlicmFyaWVzIGZpcnN0LiAoZG9uJ3QgdXNlIHRhYnMgaW4gdGhlc2UgbGluZXMhKQorICAgICAgICAjCisgICAgICAgIGljY19wYXRoIDo9ICQoc2hlbGwgd2hpY2ggJChjKSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoKQorICAgICAgICBpZmVxICIkKHdvcmRzICQoaWNjX3BhdGgpKSIgIjAiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gIiQoYykiIG5vdCBmb3VuZCwgcmVwb3J0ZWQgcGF0aDogJChpY2NfcGF0aCkpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICIkKHdvcmRzICQoaWNjX3BhdGgpKSIgIjEiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gIiQoYykiIGNvbnRhaW5zIHNwYWNlczogIiQoaWNjX3BhdGgpIikKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChvcykiICJ3aW4iICAjIFdpbmRvd3MqIE9TIHNwZWNpZmljLgorICAgICAgICAgICAgIyBgd2hpY2gnIGNhbiByZXR1cm4gcGF0aCB3aXRoIGJhY2tzbGFzaGVzLiBDb252ZXJ0IHRoZW0uCisgICAgICAgICAgICBpY2NfcGF0aCA6PSAkKHN1YnN0IFwsLywkKGljY19wYXRoKSkKKyAgICAgICAgICAgICMgaWNjJ3MgImJpbi8iIGRpcmVjdG9yeSBtYXkgYmUgbmFtZWQgYXMgIkJpbi8iIG9yIGV2ZW4gIkJJTi8iLiBDb252ZXJ0IGl0IHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAgICBpY2NfcGF0aCA6PSAkKHN1YnN0IEIsYiwkKGljY19wYXRoKSkKKyAgICAgICAgICAgIGljY19wYXRoIDo9ICQoc3Vic3QgSSxpLCQoaWNjX3BhdGgpKQorICAgICAgICAgICAgaWNjX3BhdGggOj0gJChzdWJzdCBOLG4sJChpY2NfcGF0aCkpCisgICAgICAgICAgICAkKGNhbGwgZGVidWcsaWNjX3BhdGgpCisgICAgICAgIGVuZGlmCisgICAgICAgICMgaWNjIDEwLnggZGlyZWN0b3J5IGxheW91dDoKKyAgICAgICAgIyAgICAgICAgIGJpbi8KKyAgICAgICAgIyAgICAgICAgIGxpYi8KKyAgICAgICAgIyBpY2MgMTEueCBkaXJlY3RvcnkgbGF5b3V0OgorICAgICAgICAjICAgICAgICAgYmluL3tpYTMyLGludGVsNjR9LworICAgICAgICAjICAgICAgICAgbGliL3tpYTMyLGludGVsNjR9LworICAgICAgICAjIGljYyAxMi54IGRpcmVjdG9yeSBsYXlvdXQ6CisgICAgICAgICMgICAgICAgICBiaW4ve2lhMzIsaW50ZWw2NH0vCisgICAgICAgICMgICAgICAgICBjb21waWxlci9saWIve2lhMzIsaW50ZWw2NH0vCisgICAgICAgICMgTm90ZTogT24gT1MgWCogZmF0IGxpYnJhcmllcyByZXNpZGUgaW4gbGliLyBkaXJlY3RvcnkuIE9uIG90aGVyIHN5c3RlbXMgbGlicmFyaWVzIGFyZSBpbgorICAgICAgICAjIGxpYi88YXJjaD4vLgorICAgICAgICBpY2NfcGF0aF91cDEgOj0gJChkaXIgJChpY2NfcGF0aCkpCisgICAgICAgIGljY19wYXRoX3VwMiA6PSAkKGRpciAkKHBhdHN1YnN0ICUvLCUsJChpY2NfcGF0aF91cDEpKSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoX3VwMSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoX3VwMikKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyICUvYmluLywkKGljY19wYXRoX3VwMSkpIiAiIgorICAgICAgICAgICAgIyBMb29rIGxpa2UgMTAueCBjb21waWxlci4KKyAgICAgICAgICAgIGljY19saWJfZGlyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvbGliLywkKGljY19wYXRoX3VwMSkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmbmVxICIkKGZpbHRlciAlL2Jpbi8sJChpY2NfcGF0aF91cDIpKSIgIiIKKyAgICAgICAgICAgICAgICAjIEl0IGxvb2tzIGxpa2UgMTEueCBvciBsYXRlciBjb21waWxlci4KKyAgICAgICAgICAgICAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgICAgICAgICAgICAgaWNjX2xpYjEyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvY29tcGlsZXIvbGliLywkKGljY19wYXRoX3VwMikpCisgICAgICAgICAgICAgICAgICAgIGlmbmVxICIkKHdpbGRjYXJkICQoaWNjX2xpYjEyKWxpYmlyYyokKGxpYikpIiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgIyAxMi54CisgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGliX2RpciA6PSAkKGljY19saWIxMikKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAxMS54CisgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGliX2RpciA6PSAkKHBhdHN1YnN0ICUvYmluLywlL2xpYi8sJChpY2NfcGF0aF91cDIpKQorICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWNjX2xpYjEyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvY29tcGlsZXIvbGliLywkKGljY19wYXRoX3VwMikpJChub3RkaXIgJChwYXRzdWJzdCAlLywlLCQoaWNjX3BhdGhfdXAxKSkpLworICAgICAgICAgICAgICAgICAgICBpZm5lcSAiJCh3aWxkY2FyZCAkKGljY19saWIxMilsaWJpcmMqJChsaWIpKSIgIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTIueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChpY2NfbGliMTIpCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTEueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChwYXRzdWJzdCAlL2Jpbi8sJS9saWIvLCQoaWNjX3BhdGhfdXAyKSkkKG5vdGRpciAkKHBhdHN1YnN0ICUvLCUsJChpY2NfcGF0aF91cDEpKSkvCisgICAgICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgICQoY2FsbCBkZWJ1ZyxpY2NfbGliX2RpcikKKyAgICAgICAgaWZlcSAiJChpY2NfbGliX2RpcikiICIiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gJChjKSBsaWIvIGRpciBub3QgZm91bmQpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgICMKKyAgICAjIFRoZW4gc2VsZWN0IHByb3BlciBsaWJyYXJpZXMuCisgICAgIworICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBsaWJpcmMgID0gJChpY2NfbGliX2RpcilcbGliaXJjbXQkKGxpYikKKyAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpXGxpYmlwZ28kKGxpYikKKyAgICBlbHNlICMgbGluLCBscmIgb3IgbWFjCisgICAgICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgICAgICAjIEluIGNhc2Ugb2YgZHluYW1pYyBsaW5raW5nLCBwcmVmZXIgbGliaSpfcGljLmEgbGlicmFyaWVzLCB0aGV5IGNvbnRhaW5zCisgICAgICAgICAgICAjIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUuCisgICAgICAgICAgICBsaWJpcmMgID0gJChpY2NfbGliX2RpcilsaWJpcmNfcGljJChsaWIpCisgICAgICAgICAgICBsaWJpcGdvID0gJChpY2NfbGliX2RpcilsaWJpcGdvX3BpYyQobGliKQorICAgICAgICAgICAgIyBJZiBsaWJpKl9waWMuYSBpcyBub3QgZm91bmQgKGl0IGlzIG1pc3NlZCBpbiBvbGRlciBjb21waWxlcnMpLCB1c2UgbGliaSouYS4KKyAgICAgICAgICAgIGlmZXEgIiQod2lsZGNhcmQgJChsaWJpcmMpKSIgIiIKKyAgICAgICAgICAgICAgICBsaWJpcmMgPSAkKGljY19saWJfZGlyKWxpYmlyYyQobGliKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGlmZXEgIiQod2lsZGNhcmQgJChsaWJpcGdvKSkiICIiCisgICAgICAgICAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpbGliaXBnbyQobGliKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGliaXJjICA9ICQoaWNjX2xpYl9kaXIpbGliaXJjJChsaWIpCisgICAgICAgICAgICBsaWJpcGdvID0gJChpY2NfbGliX2RpcilsaWJpcGdvJChsaWIpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgICMgT2ssIG5vdyBsZXQgdXMgZGVjaWRlIHdoZW4gbGlua2VkCisgICAgIyBMaW51eCogT1M6CisgICAgIyBXZSBsaW5rIGluIGxpYnJhcmllcyB0byBzdGF0aWMgbGlicmFyeSBvbmx5LgorICAgIGlmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgImxpbi1zdGF0IgorICAgICAgICBsaW5rZWRfaW5fbGlicyArPSBsaWJpcmMKKyAgICBlbmRpZgorICAgICMgT1MgWCo6CisgICAgIyBUaGUgdHJpY2sgaXMgbm90IHJlcXVpcmVkIGluIGNhc2Ugb2YgZHluYW1pYyBsaWJyYXJ5LCBidXQgb24gSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgYQorICAgICMgcHJvYmxlbTogbGliaXJjLmEgaXMgYSBmYXQsIHNvIGxpbmtlciAobGlidG9vbCkgcHJvZHVjZXMgZmF0IGxpYmd1aWRlLmR5bGliLi4uIDotKCAoT25seQorICAgICMgZnVuY3Rpb25zIGZyb20gbGliaXJjIGFyZSBwcmVzZW50ZWQgZm9yIGJvdGggYXJjaGl0ZWN0dXJlcywgbGliZ3VpZGUgZnVuY3Rpb25zIGFyZSBmb3IgSW50ZWwoUikgNjQKKyAgICAjIG9ubHkuKSBUbyBhdm9pZCB0aGlzIHVuZGVzaXJlZCBlZmZlY3QsIGxpYmlyYyB0cmljayBpcyBlbmFibGVkIGZvciBib3RoIHN0YXRpYyBhbmQgZHluYW1pYworICAgICMgYnVpbGRzLiBQcm9iYWJseSB3ZSBjYW4gaW5zdHJ1Y3QgbGlidG9vbCB0byBwcm9kdWNlICJ0aGluIiAobm90IGZhdCkgbGlicmFyeSBieSB1c2luZworICAgICMgLWFyY2hfb25seSBvcHRpb24uLi4KKyAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgbGlua2VkX2luX2xpYnMgKz0gbGliaXJjCisgICAgZW5kaWYKKyAgICAjIFdpbmRvd3MqIE9TOgorICAgICMgVGhlIHRyaWNrIGlzIHJlcXVpcmVkIG9ubHkgaW4gY2FzZSBvZiBzdGF0aWMgT01QIFJUTC4gSW4gY2FzZSBvZiBkeW5hbWljIE9NUCBSVEwgbGlua2VyIGRvZXMKKyAgICAjIHRoZSBqb2IuCisgICAgaWZlcSAiJChvcyktJChMSU5LX1RZUEUpIiAid2luLXN0YXQiCisgICAgICAgIGxpbmtlZF9pbl9saWJzICs9IGxpYmlyYworICAgIGVuZGlmCisKKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBsaW5rZWRfaW5fbGlicyArPSBsaWJpcGdvCisgICAgZW5kaWYKKworZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluIHRhcmdldHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbCAgICA6IGxpYiBpbmMgbW9kCitsaWIgICAgOiB0ZXN0cyAkKG91dF9saWJfZmlsZXMpCitpbmMgICAgOiAkKG91dF9pbmNfZmlsZXMpCittb2QgICAgOiAkKG91dF9tb2RfZmlsZXMpCitjbGVhbiAgOgorCSQocm0pICQob3V0X2xpYl9maWxlcykgJChvdXRfbGliX2ZhdF9maWxlcykKKwkkKHJtKSAkKG91dF9pbmNfZmlsZXMpICQob3V0X21vZF9maWxlcykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZGluZyBsaWJyYXJ5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiskKGxpYl9maWxlKSA6ICQoaWYgJChkYmdfZmlsZSksc3RyaXBwZWQsdW5zdHJpcHBlZCkvJChsaWJfZmlsZSkKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCitpZm5lcSAiJChkYmdfZmlsZSkiICIiCisgICAgJChkYmdfZmlsZSkgOiB1bnN0cmlwcGVkLyQoZGJnX2ZpbGUpCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKK2VuZGlmCisKK2lmbmVxICIkKGZpbHRlciBsaW4gbHJiLCQob3MpKSIgIiIKKyAgICBsaWJfZmlsZV9kZXBzID0gJChpZiAkKGxpbmtlZF9pbl9saWJzKSxyZXF1aXJlZC8ub2JqcywkKGxpYl9vYmpfZmlsZXMpKQorZW5kaWYKK2lmZXEgIiQob3MpIiAibWFjIgorICAgIGxpYl9maWxlX2RlcHMgPSBpb21wJChvYmopCitlbmRpZgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgbGliX2ZpbGVfZGVwcyA9ICQoaWYgJChsaW5rZWRfaW5fbGlicyksd2lwZWQvLm9ianMsJChsaWJfb2JqX2ZpbGVzKSkKK2VuZGlmCisKKyMgb2JqX2RlcF9maWxlcyAtLSBvYmplY3QgZmlsZXMsIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgbGlzdC4gT3RoZXIgZmlsZXMgKG5vbi1vYmplY3QpCisjIGFyZSBmaWx0ZXJlZCBvdXQuCitvYmpfZGVwc19maWxlcyA9ICQoZmlsdGVyICUkKG9iaiksJF4pCisjIG9ial9kZXBzX2ZsYWdzIC0tIG9iamVjdCBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIGZsYWdzLCBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBsaXN0LiBGbGFnIGlzIGEKKyMgc3BlY2lhbCBmaWxlIGxpa2UgInJlcXVpcmVkLy5vYmpzIi4gRmxhZyBmaWxlIGlzIHJlcGxhY2VkIHdpdGggYSBsaXN0IG9mIGFsbCBvYmplY3QgZmlsZXMgaW4gZmxhZworIyBkaXJlY3RvcnksIGZvciBleGFtcGxlLCAicmVxdWlyZWQvKi5vIgorb2JqX2RlcHNfZmxhZ3MgPSAkKGFkZHN1ZmZpeCAqJChvYmopLCQoZGlyICQoZmlsdGVyICUvLm9ianMsJF4pKSkKKyMgb2JqX2RlcHNfYWxsIC0tIGxpc3Qgb2YgYWxsIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBsaXN0LCBlaXRoZXIgZXhwbGljaXQgb3IgZm91bmQKKyMgaW4gZmxhZ2dlZCBkaXJlY3Rvcmllcy4KK29ial9kZXBzX2FsbCAgID0gJChvYmpfZGVwc19maWxlcykgJChvYmpfZGVwc19mbGFncykKKwordW5zdHJpcHBlZC8kKGxpYl9maWxlKS5sc3QgOiAkKGxpYl9maWxlX2RlcHMpIHVuc3RyaXBwZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCWVjaG8gJChvYmpfZGVwc19hbGwpID4gJEAKKworaWZlcSAiJChvcyktJChMSU5LX1RZUEUpIiAibGluLWR5bmEiCisgICAgJChsaWJfZmlsZSkgOiBleHBvcnRzX3NvLnR4dAorZW5kaWYKKworIyBDb3B5IG9iamVjdCBmaWxlcywgd2lwaW5nIG91dCByZWZlcmVuY2VzIHRvIGxpYmlyYyBsaWJyYXJ5LiBPYmplY3QgZmlsZXMgKG91cnMgYW5kIGV4dHJhY3RlZAorIyBmcm9tIGxpYmlyYy5saWIpIGhhdmUgIi1kZWZhdWx0bGliOmxpYmlyYy5saWIiIGxpbmtlciBkaXJlY3RpdmUsIHNvIGxpbmtlciB3aWxsIHJlcXVpcmUgbGliaXJjLmxpYgorIyByZWdhcmRsZXNzIG9mIGFic2VuY2Ugb2YgcmVhbCBkZXBlbmRlbmN5LiBBY3R1YWxseSwgdGhpcyBydWxlIGlzIHJlcXVpcmVkIG9ubHkgb24gV2luZG93cyogT1MsIGJ1dAorIyB0aGVyZSBpcyBubyBXaW5kb3dzKiBPUy1zcGVjaWZpYyBjb21tYW5kcywgc28gSSBvbWl0IGNvbmRpdGlvbnMgdG8ga2VlcCBjb2RlIHNob3J0ZXIgYW5kIGJlIGFibGUgdGVzdAorIyB0aGUgcnVsZSBvbiBMaW51eCogT1MuCisjIE5vdGU6IElmIHdlIGFyZSBub3QgZ29pbmcgdG8gcGljayB1cCBvYmplY3RzIGZyb20gbGliaXJjLCB0aGVyZSBpcyBubyBwb2ludCBpbiB3aXBpbmcgb3V0CisjIGxpYmlyYyByZWZlcmVuY2VzLgorIyBBZGRpdGlvbjogV2lwZSBhbHNvIHJlZmVyZW5jZXMgdG8gQysrIHJ1bnRpbWUgKGxpYmNwbXQubGliKSBmb3IgdGhlIHNhbWUgcmVhc29uOiBzb21ldGltZXMgQysrCisjIHJ1bnRpbWUgcm91dGluZXMgYXJlIG5vdCBhY3R1YWxseSB1c2VkLCBidXQgY29tcGlsZXIgcHV0cyAiLWRlZmF1bHRsaWI6bGliY3BtdC5saWIiIGRpcmVjdGl2ZSB0bworIyBvYmplY3QgZmlsZS4gV2lwZSBpdCBvdXQsIGlmIHdlIGhhdmUgcmVhbCBkZXBlbmRlbmN5IG9uIEMrKyBydW50aW1lLCB0ZXN0LXRvdWNoIHdpbGwgZmFpbC4KK3dpcGVkLy5vYmpzIDogcmVxdWlyZWQvLm9ianMgXAorICAgICQodG9vbHNfZGlyKXdpcGUtc3RyaW5nLnBsIHdpcGVkLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKHJtKSAkKGRpciAkQCkqJChvYmopCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisJJChwZXJsKSAkKHRvb2xzX2Rpcil3aXBlLXN0cmluZy5wbCAtLXF1aWV0IFwKKwkgICAgLS13aXBlLXJlZ2V4cD0iKC18LykoZGVmYXVsdGxpYnxERUZBVUxUTElCKTpcIihsaWJpcnxsaWJjfExJQkN8T0xETnxsaWJtbXxsaWJkZXxzdm1sKS4qP1wiIiBcCisJICAgIC0tdGFyZ2V0LWRpcmVjdG9yeT0kKGRpciAkQCkgJChvYmpfZGVwc19hbGwpCisgICAgZWxzZQorCSQocGVybCkgJCh0b29sc19kaXIpd2lwZS1zdHJpbmcucGwgLS1xdWlldCBcCisJICAgIC0td2lwZS1yZWdleHA9IigtfC8pKGRlZmF1bHRsaWJ8REVGQVVMVExJQik6XCIobGliaXJ8bGliY3xMSUJDfE9MRE4pLio/XCIiIFwKKwkgICAgLS10YXJnZXQtZGlyZWN0b3J5PSQoZGlyICRAKSAkKG9ial9kZXBzX2FsbCkKKyAgICBlbmRpZgorCSQodG91Y2gpICRACisKKyMgcmVxdWlyZWQtb2JqZWN0cy5wbCB1c2VzICJvYmpjb3B5IiB1dGlsaXR5IHRvIHJlbmFtZSBzeW1ib2xzIGluIG9iamVjdCBmaWxlcy4gT24gTGludXgqIE9TIHRoaXMgaXMgYQorIyBzdGFuZGFyZCB1dGlsaXR5IChmcm9tIGJpbnV0aWxzIHBhY2thZ2UpLiBPbiBXaW5kb3dzKiBPUyB3ZSBwcm92aWRlcyBob21lYnJldyBpbXBsZW1lbnRhdGlvbiAodmVyeQorIyBsaW1pdGVkLCBidXQgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMpLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgb2JqY29weSA9IG9iamNvcHkkKGV4ZSkKK2VuZGlmCisKKyMgcmVxdWlyZWQvIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgT01QIFJUTCBvYmplY3QgZmlsZXMgYW5kIHJlYWxseSByZXF1aXJlZCBmaWxlcyBmcm9tIGV4dGVybmFsCisjIGxpYnJhcmllcy4gcmVxdWlyZWQvLm9iaiBpcyBhIGZsYWcuIElmIHRoaXMgZmlsZSBwcmVzZW50LCBpdCBtZWFucyBhbGwgcmVxdWlyZWQgb2JqZWN0cyBhbHJlYWR5CisjIGluIHBsYWNlLiBOb3RlLCByZXF1aXJlZC1vYmplY3RzLnBsIGNvcGllcyBmaWxlcyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LiBJdCBpcyBuZWNlc3NhcnksIGJlY2F1c2UKKyMgb2JqZWN0IGZpbGVzIGFyZSBlZGl0ZWQgZHVyaW5nIGNvcHlpbmcgLS0gc3ltYm9scyBkZWZpbmVkIGluIGV4dGVybmFsIG9iamVjdCBmaWxlcyBhcmUgcmVuYW1lZC4KK3JlcXVpcmVkLy5vYmpzIDogJChsaWJfb2JqX2ZpbGVzKSAkKGFkZHN1ZmZpeCAvLm9ianMsJChsaW5rZWRfaW5fbGlicykpIFwKKyAgICAkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsICQob2JqY29weSkgcmVxdWlyZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocm0pICQoZGlyICRAKSokKG9iaikKKwkkKHBlcmwpICQodG9vbHNfZGlyKXJlcXVpcmVkLW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tcHJlZml4PV9fa21wX2V4dGVybmFsXyBcCisJICAgIC0tYmFzZSAkKG9ial9kZXBzX2ZpbGVzKSAtLWV4dHJhICQob2JqX2RlcHNfZmxhZ3MpIC0tY29weS1hbGw9JChkaXIgJEApCisJJCh0b3VjaCkgJEAKKworIyBFeHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIGxpYmlyYy4gRmlsZSAibGliaXJjLy5vYmoiIGlzIGEgZmxhZy4gSWYgdGhlIGZpbGUgcHJlc2VudCwgbWFrZQorIyB0aGlua3MgZmlsZXMgYXJlIGV4dHJhY3RlZC4KK2lmbmVxICIkKGxpYmlyYykiICIiCisgICAgbGliaXJjLy5vYmpzIDogJChsaWJpcmMpIFwKKwkkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgbGliaXJjLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQocm0pICQoZGlyICRAKSokKG9iaikKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tb3V0cHV0PSQoZGlyICRAKSAkPAorCSAgICAkKHRvdWNoKSAkQAorZW5kaWYKKworIyBFeHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIGxpYmlwZ28uIEZpbGUgIi9saWJpcGdvLy5vYmoiIGlzIGEgZmxhZy4gSWYgdGhlIGZpbGUgcHJlc2VudCwgbWFrZQorIyB0aGlua3Mgb2JqZWN0cyBhcmUgZXh0cmFjdGVkLgoraWZuZXEgIiQobGliaXBnbykiICIiCisgICAgbGliaXBnby8ub2JqcyA6ICQobGliaXBnbykgXAorCSQodG9vbHNfZGlyKWV4dHJhY3Qtb2JqZWN0cy5wbCBsaWJpcGdvLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQocm0pICQoZGlyICRAKSokKG9iaikKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tb3V0cHV0PSQoZGlyICRAKSAkPAorCSAgICAkKHRvdWNoKSAkQAorZW5kaWYKKworCitzdHJpcHBlZC8kKGxpYl9maWxlKSA6IHVuc3RyaXBwZWQvJChsaWJfZmlsZSkgJChkYmdfZmlsZSkgc3RyaXBwZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCW9iamNvcHkgLS1zdHJpcC1kZWJ1ZyAkPCAkQC50bXAKKwlvYmpjb3B5IC0tYWRkLWdudS1kZWJ1Z2xpbms9JChkYmdfZmlsZSkgJEAudG1wICRACisKK2lmZXEgIiQob3MpIiAibWFjIgorCisgICAgIyBUaGVzZSB0YXJnZXRzIGFyZSB1bmRlciBjb25kaXRpb24gYmVjYXVzZSBvZiBzb21lIE9TIFgqLXNwZWNpZmljIGxkIGFuZCBubSBvcHRpb25zLiBGb3IKKyAgICAjIGV4YW1wbGUsIEdOVSBubSBkb2VzIG5vdCBhY2NlcHQgLWosIEdOVSBsZCBkb2VzIG5vdCBrbm93IC1maWxlbGlzdC4KKworICAgICMgaW9tcC5vIGlzIGEgYmlnIG9iamVjdCBmaWxlIGluY2x1ZGluZyBhbGwgdGhlIE9NUCBSVEwgb2JqZWN0IGZpbGVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbQorICAgICMgZXh0ZXJuYWwgbGlicmFyaWVzIChsaWtlIGxpYmlyYykuIEl0IGlzIHBhcnRpYWxseSBsaW5rZWQsIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc3ltYm9scworICAgICMgKGUuIGcuIHJlZmVyZW5jZXMgdG8gbGliaXJjKSBhbHJlYWR5IHJlc29sdmVkLCBzeW1ib2xzIGRlZmluZWQgaW4gZXh0ZXJuYWwgbGlicmFyaWVzIGFyZQorICAgICMgaGlkZGVuIGJ5IHVzaW5nIC11bmV4cG9ydGVkLXN5bWJvbC1saXN0IGFuZCAtbm9uX2dsb2JhbF9zeW1ib2xzX3N0cmlwX2xpc3QgbGlua2VyIG9wdGlvbnMKKyAgICAjIChib3RoIG9wdGlvbnMgYXJlIHJlcXVpcmVkKS4KKyAgICAjIEFDOiAyMDEyLTA0LTEyOiBhZnRlciBNQUMgbWFjaGluZXMgdXBncmFkZSBjb21waWxlciBmYWlscyB0byBjcmVhdGUgb2JqZWN0LCBzbyB1c2UgbGlua2VyIGluc3RlYWQKK2lmZXEgIiQobWFjX29zX25ldykiICIxIgorICAgIGlvbXAkKG9iaikgOiAkKGxpYl9vYmpfZmlsZXMpIGV4dGVybmFsLXN5bWJvbHMubHN0IGV4dGVybmFsLW9iamVjdHMubHN0IC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICBsZCAtciAtdW5leHBvcnRlZF9zeW1ib2xzX2xpc3QgZXh0ZXJuYWwtc3ltYm9scy5sc3QgXAorCQktbm9uX2dsb2JhbF9zeW1ib2xzX3N0cmlwX2xpc3QgZXh0ZXJuYWwtc3ltYm9scy5sc3QgXAorCQktZmlsZWxpc3QgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgXAorCQktbyAkQCAkKG9ial9kZXBzX2ZpbGVzKQorZWxzZQorICAgIGlvbXAkKG9iaikgOiAkKGxpYl9vYmpfZmlsZXMpIGV4dGVybmFsLXN5bWJvbHMubHN0IGV4dGVybmFsLW9iamVjdHMubHN0IC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKGMpIC1yIC1ub3N0YXJ0ZmlsZXMgLXN0YXRpYy1pbnRlbCAgLW5vLWludGVsLWV4dGVuc2lvbnMgXAorCQktV2wsLXVuZXhwb3J0ZWRfc3ltYm9sc19saXN0LGV4dGVybmFsLXN5bWJvbHMubHN0IFwKKwkJLVdsLC1ub25fZ2xvYmFsX3N5bWJvbHNfc3RyaXBfbGlzdCxleHRlcm5hbC1zeW1ib2xzLmxzdCBcCisJCS1maWxlbGlzdCBleHRlcm5hbC1vYmplY3RzLmxzdCBcCisJCS1vICRAICQob2JqX2RlcHNfZmlsZXMpCitlbmRpZgorCisgICAgIyBleHRlcm5hbC1vYmplY3RzLmxzdCBpcyBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGV4dHJhY3RlZCBmcm9tIGV4dGVybmFsIGxpYnJhcmllcywgd2hpY2ggc2hvdWxkCisgICAgIyBiZSBsaW5rZWQgaW50byBpb21wLm8uIGttcF9kdW1teS5vIGlzIGFkZGVkIHRvIHRoZSBsaXN0IHRvIGF2b2lkIGVtcHR5IGxpc3QgLS0gT1MgWCogdXRpbGl0aWVzCisgICAgIyBubSBhbmQgbGQgZG8gbm90IGxpa2UgZW1wdHkgbGlzdHMuCisgICAgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgOiAkKGxpYl9vYmpfZmlsZXMpICQoYWRkc3VmZml4IC8ub2JqcywkKGxpbmtlZF9pbl9saWJzKSkga21wX2R1bW15JChvYmopIFwKKwkkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKXJlcXVpcmVkLW9iamVjdHMucGwgJChvYS1vcHRzKSBcCisJCS0tYmFzZSAkKG9ial9kZXBzX2ZpbGVzKSAtLWV4dHJhICQob2JqX2RlcHNfZmxhZ3MpIC0tcHJpbnQtZXh0cmEgPiAkQC50bXAKKwkgICAgZWNobyAia21wX2R1bW15JChvYmopIiA+PiAkQC50bXAKKwkgICAgbXYgJEAudG1wICRACisKKyAgICAjIFByZXBhcmUgbGlzdCBvZiBzeW1ib2xzIGluIGV4dGVybmFsIG9iamVjdCBmaWxlcy4gV2Ugd2lsbCBoaWRlIGFsbCB0aGVzZSBzeW1ib2xzLgorICAgICMgTm90ZTogLWogaXMgbm9uLUdOVSBvcHRpb24gd2hpY2ggbWVhbnMgIkp1c3QgZGlzcGxheSB0aGUgc3ltYm9sIG5hbWVzIChubyB2YWx1ZSBvciB0eXBlKS4iCisgICAgZXh0ZXJuYWwtc3ltYm9scy5sc3QgOiBleHRlcm5hbC1vYmplY3RzLmxzdCAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgbm0gLWdvaiAkJChjYXQgZXh0ZXJuYWwtb2JqZWN0cy5sc3QpID4gJEAuMC50bXAKKwkgICAgY3V0IC1mMiAtZCIgIiAkQC4wLnRtcCA+ICRALjEudG1wCisJICAgIG12ICRALjEudG1wICRACisKK2VuZGlmICMgbWFjCisKKyMgSW1wb3J0IGxpYnJhcnkgdHJpY2tzIGFyZSBXaW5kb3dzKiBPUy1zcGVjaWZpYy4KK2lmZXEgIiQob3MpIiAid2luIgorCisgICAgaW1wb3J0JChsaWIpIDogJChsaWJfaXRlbSkkKGRsbCkKKworICAgICMgQ2hhbmdlIHRoZSBuYW1lIG9mIGltcG9ydCBsaWJyYXJ5IHByb2R1Y2VkIGJ5IHRoZSBsaW5rZXIsIHdlIHdpbGwgY29tYmluZSBpdCB3aXRoIHNvbWUgbW9yZQorICAgICMgb2JqZWN0IGZpbGVzIHRvIHByb2R1Y2UgImV4dGVuZGVkIGltcG9ydCBsaWIiLgorICAgICQobGliX2l0ZW0pJChkbGwpIDogaW1wX2ZpbGUgOj0gaW1wb3J0JChsaWIpCisKKyAgICAjIERlZmF1bHQgcnVsZSAiYyB0byBvYmoiIHdpbGwgY29tcGlsZSBzb3VyY2VzIHdpdGggLU1UIG9wdGlvbiwgd2hpY2ggaXMgbm90IGRlc2lyZWQuCisgICAgIyBDYW5jZWwgZWZmZWN0IG9mIC1NVCB3aXRoIC1abC4KKyAgICAjIEFDOiBDdXJyZW50bHkgd2Ugb25seSBoYXZlIG9uZSBvYmplY3QgdGhhdCBkb2VzIG5vdCBuZWVkIGFueSBzcGVjaWFsCisgICAgIyAgICAgY29tcGlsZXIgb3B0aW9ucywgc28gdXNlIG1pbmltYWwgc2V0LiBXaXRoIHN0YW5kYXJkIHNldCBvZiBvcHRpb25zIHdlIHVzZWQKKyAgICAjICAgICB0aGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggZGVidWcgaW5mbyBsZWFrZWQgaW50byB0aGUgaW1wb3J0IGxpYnJhcnkKKyAgICAjICAgICB3aXRoIHRoaXMgb2JqZWN0IChidWcgcmVwb3J0ICMzMzQ1NjUpLgorICAgICQoaW1wX29ial9maWxlcykgOiBjLWZsYWdzIDo9IC1abCAtbm9sb2dvIC1jCisKKyAgICAkKGltcF9maWxlKS5sc3QgOiAkKGltcF9vYmpfZmlsZXMpIGltcG9ydCQobGliKSAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgZWNobyAkKGZpbHRlci1vdXQgLnJlYnVpbGQsJF4pID4gJEAKKworZW5kaWYKKwora21wX2kxOG5faWQuaW5jIDogZW5fVVMudHh0IFwKKyAgICAkKHRvb2xzX2RpciltZXNzYWdlLWNvbnZlcnRlci5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocGVybCkgJCh0b29sc19kaXIpbWVzc2FnZS1jb252ZXJ0ZXIucGwgJChvYS1vcHRzKSAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09JEAgJDwKKwora21wX2kxOG5fZGVmYXVsdC5pbmMgOiBlbl9VUy50eHQgXAorICAgICQodG9vbHNfZGlyKW1lc3NhZ2UtY29udmVydGVyLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChwZXJsKSAkKHRvb2xzX2RpciltZXNzYWdlLWNvbnZlcnRlci5wbCAkKG9hLW9wdHMpIC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD0kQCAkPAorCisjIFJlYnVpbHQga21wX3ZlcnNpb24ubyBvbiBhbnkgY2hhbmdlIHRvIGhhdmUgYWN0dWFsIGJ1aWxkIHRpbWUgc3RyaW5nIGFsd2F5cyB1cGRhdGVkLgora21wX3ZlcnNpb24kKG9iaik6ICQoZmlsdGVyLW91dCBrbXBfdmVyc2lvbiQob2JqKSwkKGxpYl9vYmpfZmlsZXMpICQoaW1wX29ial9maWxlcykpCisKKyQoZGVmX2ZpbGUpIDogZGxsZXhwb3J0cyBcCisgICAgJCh0b29sc19kaXIpZ2VuZXJhdGUtZGVmLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChwZXJsKSAkKHRvb2xzX2RpcilnZW5lcmF0ZS1kZWYucGwgJChnZC1mbGFncykgLW8gJEAgJDwKKworbGliaW9tcC5yYyA6IGxpYmlvbXAucmMudmFyIGttcF92ZXJzaW9uLmMKK2xpYmlvbXAucmMgOiBldi1mbGFncyArPSAtRCBLTVBfRklMRT0kKGxpYl9maWxlKQorCiskKHJjX2ZpbGUpIDogbGliaW9tcC5yYyAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKK2ttcF9kdW1teS5jIDogLnJlYnVpbGQKKwkkKHRhcmdldCkKKwllY2hvICJ2b2lkIF9fa21wX2R1bW15KCkge30iID4gJEAKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0gdGVzdC10b3VjaCAtLS0KKworIyB0ZXN0LXRvdWNoIGlzIG5vdCBhdmFpbGFibGUgZm9yIGxyYi4KK2lmbmVxICIkKG9zKSIgImxyYiIKKworICAgICMgQ29tcGlsZSBhIHNpbXBsZSBDIHRlc3QgYW5kIGxpbmsgaXQgd2l0aCB0aGUgbGlicmFyeS4gRG8gaXQgdHdvIHRpbWVzOiB0aGUgZmlyc3QgbGluayBnaXZlcyB1cworICAgICMgY2xlYXIgbWVzc2FnZSBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zLCB0aGUgc2Vjb25kIGxpbmsgcnVuIGluIHZlcmJvc2UgbW9kZSwgbGlua2VyIG91dHB1dAorICAgICMgc2VhcmNoZWQgZm9yICJsaWJpcmMiIHN0cmluZyAtLSBzaG91bGQgbm90IGJlIGFueSBsaWJpcmMgcmVmZXJlbmNlcy4gRmluYWxseSwgdGVzdCBleGVjdXRhYmxlCisgICAgIyBydW4gd2l0aCBLTVBfVkVSQk9TRT0xLgorCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGlmbmVxICIkKGRvX3Rlc3RfdG91Y2hfbXQpIiAiMCIKKyAgICAgICAgICAgIHRlc3RfdG91Y2hfaXRlbXMgKz0gdGVzdC10b3VjaC1tZCB0ZXN0LXRvdWNoLW10CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlc3RfdG91Y2hfaXRlbXMgKz0gdGVzdC10b3VjaC1tZAorICAgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgdGVzdF90b3VjaF9pdGVtcyArPSB0ZXN0LXRvdWNoLXJ0CisgICAgZW5kaWYKKworICAgIGZvcmNlLXRlc3QtdG91Y2ggOiAkKGFkZHN1ZmZpeCAvLmZvcmNlLCQodGVzdF90b3VjaF9pdGVtcykpICQoYWRkc3VmZml4IC8udGVzdCwkKHRlc3RfdG91Y2hfaXRlbXMpKQorICAgIHRlc3QtdG91Y2ggICAgICAgOiAkKGFkZHN1ZmZpeCAvLnRlc3QsJCh0ZXN0X3RvdWNoX2l0ZW1zKSkKKworICAgIHR0LWV4ZS1maWxlID0gJChkaXIgJEApdGVzdC10b3VjaCQoZXhlKQorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICAjIE9uIFdpbmRvd3MqIE9TIHRoZSB0ZXN0IHF1YWxpdHkgaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB1cCBmb3IKKyAgICAgICAgIyBJbnRlbCBjb21waWxlciBzbyBNaWNyb3NvZnQgY29tcGlsZXIgaXMgYWJsZSB0byBmaW5kIGxpYmlyYyBpZiBpdCBpcyBzcGVjaWZpZWQgaW4gZGVmYXVsdGxpYgorICAgICAgICAjIGRpcmVjdGl2ZSB3aXRoaW4gb2JqZWN0IGZpbGUuLi4gVGhpcyBkaXNhZHZhbnRhZ2UgaXMgY29tcGVuc2F0ZWQgYnkgZ3JlcHBpbmcgdmVyYm9zZSBsaW5rCisgICAgICAgICMgb3V0cHV0IGZvciAibGliaXJjIiBzdHJpbmcuCisgICAgICAgIHR0LWMgICAgICAgICAgICA9IGNsCisgICAgICAgIHR0LWMtZmxhZ3MgICAgICs9IC1ub2xvZ28KKyAgICAgICAgaWZlcSAiJChPUFRJTUlaQVRJT04pIiAib24iCisgICAgICAgICAgICB0dC1jLWZsYWdzLW10ID0gLU1UCisgICAgICAgICAgICB0dC1jLWZsYWdzLW1kID0gLU1ECisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR0LWMtZmxhZ3MtbXQgPSAtTVRkCisgICAgICAgICAgICB0dC1jLWZsYWdzLW1kID0gLU1EZAorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJzdGF0IgorICAgICAgICAgICAgdHQtbGlicyAgKz0gJChsaWJfZmlsZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHQtbGlicyAgKz0gJChpbXBfZmlsZSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgICMgVG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIHdpdGggVlMyMDA4CisgICAgICAgICAgICAjIHR0LWxpYnMgKz0gYnVmZmVyb3ZlcmZsb3d1LmxpYgorICAgICAgICAgICAgIyBQcmV2ZW50aW5nICJ1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbCBfX3NlY3VyaXR5X2Nvb2tpZSIgKGFuZAorICAgICAgICAgICAgIyAiLi4uIF9fc2VjdXJpdHlfY2hlY2tfY29va2llIikgbGlua2VyIGVycm9ycyBvbiB3aW5fMzJlIGFuZCB3aW5fNjQuCisgICAgICAgIGVuZGlmCisgICAgICAgIHR0LWMtZmxhZ3MgICs9IC1GbyQoZGlyICRAKXRlc3QtdG91Y2gkKG9iaikgLUZlJCh0dC1leGUtZmlsZSkKKyAgICAgICAgdHQtbGQtZmxhZ3MgKz0gLWxpbmsKKyAgICAgICAgIyBTb21lIFBvc2l4IGJ1dCBub24tSVNPIGZ1bmN0aW9ucyAobGlrZSBzdHJkdXApIGFyZSBkZWZpbmVkIGluIG9sZG5hbWVzLmxpYiwgd2hpY2ggaXMgdXNlZAorICAgICAgICAjIGltcGxpY2l0bHkuIERyb3Agb2xkbmFtZXMubGliIGxpYnJhcnksIHNvIHdlIGNhbiBjYXRjaAorICAgICAgICB0dC1sZC1mbGFncyArPSAtbm9kZWZhdWx0bGliOm9sZG5hbWVzCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgIHR0LWxkLWZsYWdzICs9IC1zYWZlc2VoCisgICAgICAgIGVuZGlmCisgICAgICAgIHR0LWxkLWZsYWdzLXYgKz0gLXZlcmJvc2UKKyAgICBlbHNlICMgbGluIG9yIG1hYworICAgICAgICAjIE9uIExpbnV4KiBPUyBhbmQgT1MgWCogdGhlIHRlc3QgaXMgZ29vZCBlbm91Z2ggYmVjYXVzZSBHTlUgY29tcGlsZXIga25vd3Mgbm90aGluZworICAgICAgICAjIGFib3V0IGxpYmlyYyBhbmQgSW50ZWwgY29tcGlsZXIgcHJpdmF0ZSBsaWIgZGlyZWN0b3JpZXMsIGJ1dCB3ZSB3aWxsIGdyZXAgdmVyYm9zZSBsaW5rZXIKKyAgICAgICAgIyBvdXRwdXQganVzdCBpbiBjYXNlLgorICAgICAgICB0dC1jICAgICAgICA9IGNjCisgICAgICAgIGlmZXEgIiQob3MpIiAibGluIiAgICAjIEdDQyBvbiBPUyBYKiBkb2VzIG5vdCByZWNvZ25pemUgLXB0aHJlYWQuCisgICAgICAgICAgICB0dC1jLWZsYWdzICArPSAtcHRocmVhZAorICAgICAgICBlbmRpZgorICAgICAgICB0dC1jLWZsYWdzICs9IC1vICQodHQtZXhlLWZpbGUpCisgICAgICAgIGlmbmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgICAgICAgICB0dC1jLWZsYWdzICs9ICQoaWYgJChmaWx0ZXIgNjQsJChhcmNoKSksLCQoaWYgJChmaWx0ZXIgMzIsJChhcmNoKSksLW0zMiwtbTY0KSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgdHQtbGlicyAgICArPSAkKGxpYl9maWxlKQorICAgICAgICBpZmVxICIkKG9zKS0kKENPVkVSQUdFKS0kKExJTktfVFlQRSkiICJsaW4tb24tc3RhdCIKKyAgICAgICAgICAgICMgU3RhdGljIGNvdmVyYWdlIGJ1aWxkIG9uIExpbnV4KiBPUyBmYWlscyBkdWUgdG8gdW5yZXNvbHZlZCBzeW1ib2xzIGRsb3BlbiwgZGxzeW0sIGRsY2xvc2UuCisgICAgICAgICAgICAjIEV4cGxpY2l0bHkgYWRkIGRsIGxpYnJhcnkgdG8gYXZvaWQgZmFpbHVyZS4KKyAgICAgICAgICAgIHR0LWxkLWZsYWdzICs9IC1sZGwKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChvcykiICJtYWMiCisgICAgICAgICAgICB0dC1sZC1mbGFncy12ICs9IC1XbCwtdAorICAgICAgICAgICAgdHQtZW52ICAgICAgICArPSBEWUxEX0xJQlJBUllfUEFUSD0iLjokKERZTERfTElCUkFSWV9QQVRIKSIKKyAgICAgICAgZWxzZSAjIGxpbgorICAgICAgICAgICAgdHQtbGQtZmxhZ3MtdiArPSAtV2wsLS12ZXJib3NlCisgICAgICAgICAgICB0dC1lbnYgICAgICAgICs9IExEX0xJQlJBUllfUEFUSD0iLjokKExEX0xJQlJBUllfUEFUSCkiCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICB0dC1jLWZsYWdzICs9ICQodHQtYy1mbGFncy1ydCkKKyAgICB0dC1lbnYgICAgICs9IEtNUF9WRVJTSU9OPTEKKyAgICB0dC1pICAgICAgICA9ICQoaWYgJChmaWx0ZXIgb2ZmLCQoVEVTVF9UT1VDSCkpLC0pCisKKyAgICBpZm5kZWYgdGVzdC10b3VjaC1jb21tYW5kcworICAgICAgICAjIFRoZSBmaXJzdCBidWlsZGluZyBnaXZlcyBzaG9ydCBhbmQgY2xlYXIgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGFueSBwcm9ibGVtLgorICAgICAgICAjIFRoZSBzZWNvbmQgYnVpbGRpbmcgcnVucyBsaW5rZXIgaW4gdmVyYm9zZSBtb2RlIGFuZCBzYXZlcyBsaW5rZXIgb3V0cHV0IGZvciBncmVwcGluZy4KKyAgICAgIGRlZmluZSB0ZXN0LXRvdWNoLWNvbW1hbmRzCisJICAgICQocm0pICQoZGlyICRAKSoKKwkgICAgJCh0dC1pKSQodHQtYykgJCh0dC1jLWZsYWdzKSAkPCAkKHR0LWxpYnMpICQodHQtbGQtZmxhZ3MpCisJICAgICQocm0pICQodHQtZXhlLWZpbGUpCisJICAgICQodHQtaSkkKHR0LWMpICQodHQtYy1mbGFncykgXAorCQkkPCAkKHR0LWxpYnMpIFwKKwkJJCh0dC1sZC1mbGFncykgJCh0dC1sZC1mbGFncy12KSBcCisJCT4gJChkaXIgJEApYnVpbGQubG9nIDI+JjEKKwkgICAgJCh0dC1pKSQodHQtZW52KSAkKHR0LWV4ZS1maWxlKQorCSAgICAkKHR0LWkpZ3JlcCAtaSAtZSAiW15fXWxpYmlyYyIgJChkaXIgJEApYnVpbGQubG9nID4gJChkaXIgJEApbGliaXJjLmxvZzsgXAorCQlbICQkPyAtZXEgMSBdCisgICAgICBlbmRlZgorICAgIGVuZGlmCisKKyAgICB0ZXN0LXRvdWNoLXJ0Ly50ZXN0IDogdHQtYy1mbGFncy1ydCA9CisgICAgdGVzdC10b3VjaC1tdC8udGVzdCA6IHR0LWMtZmxhZ3MtcnQgPSAkKHR0LWMtZmxhZ3MtbXQpCisgICAgdGVzdC10b3VjaC1tZC8udGVzdCA6IHR0LWMtZmxhZ3MtcnQgPSAkKHR0LWMtZmxhZ3MtbWQpCisKKyAgICB0ZXN0LXRvdWNoLXJ0Ly50ZXN0IDogdGVzdC10b3VjaC5jICQobGliX2ZpbGUpIHRlc3QtdG91Y2gtcnQvLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJCh0ZXN0LXRvdWNoLWNvbW1hbmRzKQorCSAgICAkKHRvdWNoKSAkQAorICAgIHRlc3QtdG91Y2gtbXQvLnRlc3QgOiB0ZXN0LXRvdWNoLmMgJChsaWJfZmlsZSkgJChpbXBfZmlsZSkgdGVzdC10b3VjaC1tdC8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHRlc3QtdG91Y2gtY29tbWFuZHMpCisJICAgICQodG91Y2gpICRACisgICAgdGVzdC10b3VjaC1tZC8udGVzdCA6IHRlc3QtdG91Y2guYyAkKGxpYl9maWxlKSAkKGltcF9maWxlKSB0ZXN0LXRvdWNoLW1kLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQodGVzdC10b3VjaC1jb21tYW5kcykKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyAtLS0gdGVzdC1yZWxvIC0tLQorCisjIEJ1dCB0ZXN0LXJlbG8gZG9lcyBhY3R1YWwgd29yayBvbmx5IG9uIExpbnV4KiBPUyBhbmQKKyMgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIGluIGNhc2Ugb2YgZHluYW1pYyBsaW5raW5nLgoraWZlcSAiJChpZiAkKGZpbHRlciBsaW4gbHJiLCQob3MpKSxvcyktJChMSU5LX1RZUEUpIiAib3MtZHluYSIKKworICAgICMgTWFrZSBzdXJlIGR5bmFtaWMgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlLgorICAgIGZvcmNlLXRlc3QtcmVsbyA6IHRlc3QtcmVsby8uZm9yY2UgdGVzdC1yZWxvLy50ZXN0CisgICAgdGVzdC1yZWxvICAgICAgIDogdGVzdC1yZWxvLy50ZXN0CisKKyAgICB0ZXN0LXJlbG8vLnRlc3QgOiAkKGxpYl9pdGVtKSQoZGxsKSB0ZXN0LXJlbG8vLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgcmVhZGVsZiAtZCAkPCA+ICQoZGlyICRAKXJlYWRlbGYubG9nCisJICAgIGdyZXAgLWUgVEVYVFJFTCAkKGRpciAkQClyZWFkZWxmLmxvZzsgWyAkJD8gLWVxIDEgXQorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWV4ZWNzdGFjayAtLS0KKworIyBCdXQgdGVzdC1leGVjc3RhY2sgZG9lcyBhY3R1YWwgd29yayBvbmx5IG9uIExpbnV4KiBPUyBpbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZy4KKyMgVE9ETzogRW5hYmxlIGl0IG9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBhcyB3ZWxsLgoraWZlcSAiJChpZiAkKGZpbHRlciBsaW4sJChvcykpLG9zKS0kKExJTktfVFlQRSkiICJvcy1keW5hIgorCisgICAgdGVzdHMgKz0gdGVzdC1leGVjc3RhY2sKKworICAgICMgTWFrZSBzdXJlIHN0YWNrIGlzIG5vdCBleGVjdXRhYmxlLgorICAgIGZvcmNlLXRlc3QtZXhlY3N0YWNrIDogdGVzdC1leGVjc3RhY2svLmZvcmNlIHRlc3QtZXhlY3N0YWNrLy50ZXN0CisgICAgdGVzdC1leGVjc3RhY2sgICAgICAgOiB0ZXN0LWV4ZWNzdGFjay8udGVzdAorCisgICAgdGVzdC1leGVjc3RhY2svLnRlc3QgOiAkKGxpYl9pdGVtKSQoZGxsKSB0ZXN0LWV4ZWNzdGFjay8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWV4ZWNzdGFjay5wbCAkPAorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWluc3RyIC0tLQorCisjIEJ1dCB0ZXN0LWluc3RyIGRvZXMgYWN0dWFsIHdvcmsgb25seSBvbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCitpZmVxICIkKG9zKSIgImxyYiIKKworICAgICMgTWFrZSBzdXJlIGR5bmFtaWMgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlLgorICAgIGZvcmNlLXRlc3QtaW5zdHIgOiB0ZXN0LWluc3RyLy5mb3JjZSB0ZXN0LWluc3RyLy50ZXN0CisgICAgdGVzdC1pbnN0ciAgICAgICA6IHRlc3QtaW5zdHIvLnRlc3QKKworICAgIHRlc3QtaW5zdHIvLnRlc3QgOiAkKGxpYl9maWxlKSAkKHRvb2xzX2RpciljaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgdGVzdC1pbnN0ci8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWluc3RydWN0aW9uLXNldC5wbCAkKG9hLW9wdHMpIC0tc2hvdyAtLW1pYy1hcmNoPSQoTUlDX0FSQ0gpIC0tbWljLW9zPSQoTUlDX09TKSAkPAorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWRlcHMgLS0tCisKKyMgdGVzdC1kZXBzIGRvZXMgYWN0dWFsIHdvcmsgZm9yIGR5bWFuaWMgbGlua2luZyAoYWxsIE9TZXMpLCBhbmQgV2luZG93cyogT1MgKGFsbCBsaW5raW5nIHR5cGVzKS4KK2lmbmVxICIkKGZpbHRlciAlLWR5bmEgd2luLSUsJChvcyktJChMSU5LX1RZUEUpKSIgIiIKKworICAgIGZvcmNlLXRlc3QtZGVwcyA6IHRlc3QtZGVwcy8uZm9yY2UgdGVzdC1kZXBzLy50ZXN0CisgICAgdGVzdC1kZXBzICAgICAgIDogdGVzdC1kZXBzLy50ZXN0CisKKyAgICB0ZF9leHAgPQorICAgIGlmZXEgIiQob3MpIiAibGluIgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICB0ZF9leHAgKz0gbGQtbGludXguc28uMgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkLWxpbnV4LXg4Ni02NC5zby4yCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICI2NCIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYuMQorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiYXJtIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkLWxpbnV4LWFybWhmLnNvLjMKKyAgICAgICAgZW5kaWYKKyAgICAgICAgdGRfZXhwICs9IGxpYmRsLnNvLjIKKyAgICAgICAgdGRfZXhwICs9IGxpYmdjY19zLnNvLjEKKyAgICAgICAgaWZlcSAiJChmaWx0ZXIgMzIgMzJlIDY0LCQoYXJjaCkpIiAiIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmZmaS5zby42CisgICAgICAgICAgICB0ZF9leHAgKz0gbGliZmZpLnNvLjUKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJwdGhyZWFkLnNvLjAKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgIGlmZXEgIiQob3MpIiAibHJiIgorICAgICAgICBpZmVxICIkKE1JQ19PUykiICJsaW4iCisgICAgICAgICAgICBpZmVxICIkKE1JQ19BUkNIKSIgImtuZiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gImxkLWxpbnV4LWwxb20uc28uMiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYnB0aHJlYWQuc28uMAorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJkbC5zby4yCisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYmdjY19zLnNvLjEKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBpZmVxICIkKE1JQ19BUkNIKSIgImtuYyIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gImxkLWxpbnV4LWsxb20uc28uMiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYmRsLnNvLjIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGlicHRocmVhZC5zby4wCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKE1JQ19PUykiICJic2QiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby43CisgICAgICAgICAgICB0ZF9leHAgKz0gbGlidGhyLnNvLjMKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJ1bndpbmQuc28uNQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChvcykiICJtYWMiCisjICAgICAgICB0ZF9leHAgKz0gL3Vzci9saWIvbGliZ2NjX3MuMS5keWxpYgorICAgICAgICB0ZF9leHAgKz0gL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICBlbmRpZgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICAgICAgdGRfZXhwICs9IGtlcm5lbDMyLmRsbAorICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZF9leHAgKz0gdXVpZAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChvbXBfb3MpIiAiZnJlZWJzZCIKKyAgICAgICAgdGRfZXhwID0KKyAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNworICAgICAgICB0ZF9leHAgKz0gbGlidGhyLnNvLjMKKyAgICAgICAgdGRfZXhwICs9IGxpYnVud2luZC5zby41CisgICAgZW5kaWYKKworICAgIHRlc3QtZGVwcy8udGVzdCA6ICQobGliX2ZpbGUpICQodG9vbHNfZGlyKWNoZWNrLWRlcGVuZHMucGwgdGVzdC1kZXBzLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQodGQtaSkkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWRlcGVuZHMucGwgJChvYS1vcHRzKSBcCisJCSQoaWYgJCh0ZF9leHApLC0tZXhwZWN0ZWQ9IiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJCh0ZF9leHApKSIpICQ8CisJICAgICQodG91Y2gpICRACisKK2VuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3J0cmFuIGZpbGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAiJChUQVJHRVRfQ09NUElMRVIpIiAiMTEiCisgICAgb21wX2xpYl9mID0gb21wX2xpYi5mCitlbmRpZgoraWZlcSAiJChUQVJHRVRfQ09NUElMRVIpIiAiMTIiCisgICAgb21wX2xpYl9mID0gb21wX2xpYi5mOTAKK2VuZGlmCitpZmVxICIkKG9tcF9saWJfZikiICIiCisgICAgJChlcnJvciBvbXBfbGliX2YgaXMgbm90IGRlZmluZWQpCitlbmRpZgorb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QgOiAkKG9tcF9saWJfZikgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGZvcnQpICQoZm9ydC1mbGFncykgJDwKKworb21wX2xpYi5oICA6IGV2LWZsYWdzICs9IC1EIEtNUF9JTlRfUFRSX0tJTkQ9ImludF9wdHJfa2luZCgpIgoraW9tcF9saWIuaCA6IGV2LWZsYWdzICs9IC1EIEtNUF9JTlRfUFRSX0tJTkQ9JChpZiAkKGZpbHRlciAzMiwkKGFyY2gpKSw0LDgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tbW9uIGZpbGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb21tb24gOiAkKG91dF9jbW5fZmlsZXMpCisKK2NsZWFuLWNvbW1vbiA6CisJJChybSkgJChvdXRfY21uX2ZpbGVzKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlcGVuZGVuY3kgZmlsZXMgYW5kIGNvbW1vbiBydWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZIDogZGVwCitkZXAgICAgOiAkKGRlcF9maWxlcykKKwkkKHRhcmdldCkKKworaW5jbHVkZSAkKExJQk9NUF9XT1JLKXNyYy9ydWxlcy5taworCisjIEluaXRpYXRlIHJlYnVpbGQgaWYgYW55IG9mIG1ha2VmaWxlcyBvciBidWlsZCBzcmlwdCBpcyBjaGFuZ2VkLgorIyBXaGVuIGRldmVsb3BpbmcgbWFrZWZpbGVzLCBpdCBpcyB1c2VmdWwgdG8gY29tbWVudCBpdCwgb3RoZXJ3aXNlIG1ha2Ugd2lsbCBwZXJmb3JtIGZ1bGwgcmVidWlsZAorIyBvbiBldmVyeSBjaGFuZ2Ugb2YgbWFrZWZpbGVzLgorLnJlYnVpbGQgOiAkKE1BS0VGSUxFX0xJU1QpICQodG9vbHNfZGlyKWJ1aWxkLnBsICQodG9vbHNfZGlyKWxpYi9CdWlsZC5wbQorCitpZmVxICIkKGNsZWFuKSIgIiIKKyAgICAjIERvIG5vdCBpbmNsdWRlIGRlcGVuZGVuY3kgZmlsZXMgaWYgImNsZWFuIiBnb2FsIGlzIHNwZWNpZmllZC4KKyAgICAtaW5jbHVkZSAkKGRlcF9maWxlcykKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL3J1bGVzLm1rIGIvcmMxL3J1bnRpbWUvc3JjL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDA3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvcnVsZXMubWsKQEAgLTAsMCArMSw5MyBAQAorIyBydWxlcy5tayAjCisjICRSZXZpc2lvbjogNDI0MjMgJAorIyAkRGF0ZTogMjAxMy0wNi0wNyAwOToyNToyMSAtMDUwMCAoRnJpLCAwNyBKdW4gMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tIENvcHkgZmlsZXMgdG8gb3V0IGRpcmVjdG9yaWVzIC0tLQorCiskKG91dF9jbW5fZGlyKWluY2x1ZGUvJSA6ICUgJChvdXRfY21uX2RpcilpbmNsdWRlLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCiskKG91dF9jbW5fZGlyKWluY2x1ZGVfY29tcGF0LyUgOiAlICQob3V0X2Ntbl9kaXIpaW5jbHVkZV9jb21wYXQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKKyMgRmF0OiB0b3VjaCAudG91Y2ggZmlsZSBvbiBldmVyeSB1cGRhdGUgaW4gJChvdXRfbGliX2RpciksIHNvIHdlIHdpbGwga25vdyBzaG91bGQgd2UgdXBkYXRlIGZhdAorIyBnb2FsIG9yIG5vdC4KKyQob3V0X2xpYl9kaXIpJSA6ICUgJChvdXRfbGliX2RpcikuZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKyAgICAgICAgaWZuZXEgIiQob3V0X2xpYl9mYXRfZGlyKSIgIiIKKwkgICAgJCh0b3VjaCkgJChkaXIgJEApLnRvdWNoCisgICAgICAgIGVuZGlmCisKKyQob3V0X3B0Zl9kaXIpaW5jbHVkZS8lIDogJSAkKG91dF9wdGZfZGlyKWluY2x1ZGUvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKKyQob3V0X3B0Zl9kaXIpaW5jbHVkZV9jb21wYXQvJSA6ICUgJChvdXRfcHRmX2RpcilpbmNsdWRlX2NvbXBhdC8uZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKworJChvdXRfbDEwbl9kaXIpJS8kKGNhdF9maWxlKSA6IGwxMG4vJS8kKGNhdF9maWxlKSAkKG91dF9sMTBuX2RpciklLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAkKG91dF9sMTBuX2ZhdF9kaXIpJS8kKGNhdF9maWxlKSA6IGwxMG4vJS8kKGNhdF9maWxlKSAkKG91dF9sMTBuX2ZhdF9kaXIpJS8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKGNwKSAkPCAkQAorZW5kaWYKKworIyAtLS0gSW5jbHVkZSByZWFsbHkgY29tbW9uIHJ1bGVzIC0tLQorCitpbmNsdWRlICQoTElCT01QX1dPUkspdG9vbHMvc3JjL2NvbW1vbi1ydWxlcy5taworCisjIC0tLSBCdWlsZGluZyBoZWxwZXIgdG9vbHMgZnJvbSBzb3VyY2VzIC0tLQorCisuUFJFQ0lPVVM6ICUkKGV4ZSkgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislJChleGUpIDogJCh0b29sc19kaXIpJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0tIEZhdCBsaWJyYXJpZXMgLS0tCisKKyMgRXZlcnkgdGltZSBuZXcgZmlsZSBpcyBjb3BpZWQgdG8gJChvdXRfbGliX2RpcikgZGlyZWN0b3J5IHdlIHVwZGF0ZSAkKG91dF9saWJfZGlyKS5yZWJ1aWxkIGZpbGUsCisjIHNvIHdlIGtub3cgc2hvdWxkIHdlIHJlYnVpbGQgZmF0IGxpYnJhcmllcyBvciBub3QuCisKKyMgTm90ZTogT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYnVpbHQgZmF0IGxpYnJhcmllcyBpbiBtYWNfMzIgZGlyZWN0b3J5LCB0aGVuIGNvcGllZCBhbGwgdGhlCisjIGxpYnJhcmllcyBmcm9tIG1hY18zMiB0byBtYWNfMzJlIGRpcmVjdG9yeS4gSG93ZXZlciwgdGhpcyBtYXkgd29yayB3cm9uZyBpZiBleHBvcnRzL21hY18qL2xpYi8KKyMgY29udGFpbnMgb3RoZXIgbGlicmFyaWVzLiBTbyBub3cgd2UgYnVpbGQgZmF0IGxpYnJhcmllcyB0d2ljZTogaW4gYm90aCBtYWNfMzIKKyMgYW5kIG1hY18zMmUgZGlyZWN0b3JpZXMuCisKK2lmZXEgIiQocGxhdGZvcm0pIiAibWFjXzMyZSIKKworICAgIC5QSE9OWSA6IGZhdAorICAgIGZhdCAgICA6ICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMikuZG9uZSAkKGNhbGwgX291dF9saWJfZmF0X2RpcixtYWNfMzJlKS5kb25lCisKKyAgICAkKGNhbGwgX291dF9saWJfZmF0X2RpcixtYWNfMzIpLmRvbmUgXAorICAgICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMmUpLmRvbmUgOiBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyKS50b3VjaCBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyZSkudG91Y2ggXAorICAgICAgICAkKHRvb2xzX2RpciltYWtlLWZhdC1iaW5hcmllcy5wbCBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMikuZGlyICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMmUpLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpciltYWtlLWZhdC1iaW5hcmllcy5wbCBcCisJICAgICAgICAtLW91dHB1dD0kKGRpciAkQCkgJChjYWxsIF9vdXRfbGliX2RpcixtYWNfMzIpICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyZSkKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jIGIvcmMxL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDcwZjdjCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYwpAQCAtMCwwICsxLDI1IEBACisvLyB0ZXN0LXRvdWNoLmMgLy8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2V4dGVybiBkb3VibGUgb21wX2dldF93dGltZSgpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X251bV90aHJlYWRzKCk7CitleHRlcm4gaW50ICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKworaW50IG1haW4oKSB7CisgICAgb21wX2dldF93dGltZSgpOworICAgIG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0MmZkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApAQCAtMCwwICsxLDI5IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA1OTMpICAgLyogcGFyYW1ldGVyICJYWFhYIiB3YXMgc2V0IGJ1dCBuZXZlciB1c2VkICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAzNDQpICAgLyogdHlwZWRlZiBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQgKHdpdGggc2FtZSB0eXBlKSAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNzQpICAgLyogZXhwcmVzc2lvbiBoYXMgbm8gZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MTI3KSAgLyogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MzA2KSAgLyogY29udmVyc2lvbiBmcm9tICc/JyB0byAnPycgb2YgZ3JlYXRlciBzaXplICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA4NjkpICAvKiBwYXJhbWV0ZXIgIlhYWFhYIiB3YXMgbmV2ZXIgcmVmZXJlbmNlZCAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE0MTgpIC8qIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbiAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOSkgLyogZXh0ZXJuYWwgZGVjbGFyYXRpb24gaW4gcHJpbWFyeSBzb3VyY2UgZmlsZSAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTg4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSwzODA1IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9JVFROT1RJRllfSF8KKworLyoqCitAZmlsZQorQGJyaWVmIFB1YmxpYyBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCitAbWFpbnBhZ2UKKworVGhlIElUVCBBUEkgaXMgdXNlZCB0byBhbm5vdGF0ZSBhIHVzZXIncyBwcm9ncmFtIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgordGhhdCBjYW4gYmUgdXNlZCBieSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgdG9vbHMuIFRoZSB1c2VyIGluc2VydHMKK2NhbGxzIGluIHRoZWlyIHByb2dyYW0uIFRob3NlIGNhbGxzIGdlbmVyYXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29sbGVjdGVkCithdCBydW50aW1lLCBhbmQgdXNlZCBieSBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMuCisKK0BzZWN0aW9uIEFQSSBDb25jZXB0cworVGhlIGZvbGxvd2luZyBnZW5lcmFsIGNvbmNlcHRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIEFQSS4KKworQHN1YnNlY3Rpb24gVW5pY29kZSBTdXBwb3J0CitNYW55IEFQSSBmdW5jdGlvbnMgdGFrZSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50cy4gT24gV2luZG93cywgdGhlcmUKK2FyZSB0d28gdmVyc2lvbnMgb2YgZWFjaCBzdWNoIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBzdWZmaXhlZAorYnkgVyBpZiBVbmljb2RlIHN1cHBvcnQgaXMgZW5hYmxlZCwgYW5kIGJ5IEEgb3RoZXJ3aXNlLiBBbnkgQVBJIGZ1bmN0aW9uCit0aGF0IHRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudCBhZGhlcmVzIHRvIHRoaXMgY29udmVudGlvbi4KKworQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KK01hbnkgdXNlcnMgcHJlZmVyIGhhdmluZyBhbiBvcHRpb24gdG8gbW9kaWZ5IElUVCBBUEkgY29kZSB3aGVuIGxpbmtpbmcgaXQKK2luc2lkZSB0aGVpciBydW50aW1lcy4gSVRUIEFQSSBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byByZXBsYWNlCitJVFQgQVBJIGZ1bmN0aW9uIG5hbWVzIGluc2lkZSB5b3VyIGNvZGUgd2l0aCBlbXB0eSBzdHJpbmdzLiBUbyBkbyB0aGlzLAorZGVmaW5lIHRoZSBtYWNyb3MgSU5URUxfTk9fSVRUTk9USUZZX0FQSSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJlbW92ZSB0aGUKK3N0YXRpYyBsaWJyYXJ5IGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCisKK0BzdWJzZWN0aW9uIERvbWFpbnMKK1tzZWUgZG9tYWluc10KK0RvbWFpbnMgcHJvdmlkZSBhIHdheSB0byBzZXBhcmF0ZSBub3RpZmljYXRpb24gZm9yIGRpZmZlcmVudCBtb2R1bGVzIG9yCitsaWJyYXJpZXMgaW4gYSBwcm9ncmFtLiBEb21haW5zIGFyZSBzcGVjaWZpZWQgYnkgZG90dGVkIGNoYXJhY3RlciBzdHJpbmdzLAorZS5nLiBUQkIuSW50ZXJuYWwuQ29udHJvbC4KKworQSBtZWNoYW5pc20gKHRvIGJlIHNwZWNpZmllZCkgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlCitkb21haW5zLiBCeSBkZWZhdWx0LCBhbGwgZG9tYWlucyBhcmUgZW5hYmxlZC4KK0BzdWJzZWN0aW9uIE5hbWVkIEVudGl0aWVzIGFuZCBJbnN0YW5jZXMKK05hbWVkIGVudGl0aWVzIChmcmFtZXMsIHJlZ2lvbnMsIHRhc2tzLCBhbmQgbWFya2VycykgY29tbXVuaWNhdGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIHRvIHRoZSBhbmFseXNpcyB0b29scy4gQSBuYW1lZCBlbnRpdHkgb2Z0ZW4KK3JlZmVycyB0byBhIHNlY3Rpb24gb2YgcHJvZ3JhbSBjb2RlLCBvciB0byBzb21lIHNldCBvZiBsb2dpY2FsIGNvbmNlcHRzCit0aGF0IHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdyb3VwIHRvZ2V0aGVyLgorCitOYW1lZCBlbnRpdGllcyByZWxhdGUgdG8gdGhlIHByb2dyYW1tZXIncyBzdGF0aWMgdmlldyBvZiB0aGUgcHJvZ3JhbS4gV2hlbgordGhlIHByb2dyYW0gYWN0dWFsbHkgZXhlY3V0ZXMsIG1hbnkgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbmFtZWQgZW50aXR5CittYXkgYmUgY3JlYXRlZC4KKworVGhlIEFQSSBhbm5vdGF0aW9ucyBkZW5vdGUgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBUaGUgYWN0dWFsCituYW1lZCBlbnRpdGllcyBhcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhbmFseXNpcyB0b29scy4gSW4gb3RoZXIgd29yZHMsCit0aGUgbmFtZWQgZW50aXRpZXMgY29tZSBpbnRvIGV4aXN0ZW5jZSB3aGVuIGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKworSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIG1heSBoYXZlIGluc3RhbmNlIGlkZW50aWZpZXJzIChJRHMpLiBTb21lCitBUEkgY2FsbHMgdXNlIGluc3RhbmNlIGlkZW50aWZpZXJzIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KK2RpZmZlcmVudCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIE90aGVyIEFQSSBjYWxscyBhc3NvY2lhdGUgZGF0YQord2l0aCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuCisKK1NvbWUgbmFtZWQgZW50aXRpZXMgbXVzdCBhbHdheXMgaGF2ZSBpbnN0YW5jZSBJRHMuIEluIHBhcnRpY3VsYXIsIHJlZ2lvbnMKK2FuZCBmcmFtZXMgYWx3YXlzIGhhdmUgSURzLiBUYXNrIGFuZCBtYXJrZXJzIG5lZWQgSURzIG9ubHkgaWYgdGhlIElEIGlzCituZWVkZWQgaW4gYW5vdGhlciBBUEkgY2FsbCAoc3VjaCBhcyBhZGRpbmcgYSByZWxhdGlvbiBvciBtZXRhZGF0YSkuCisKK1RoZSBsaWZldGltZSBvZiBpbnN0YW5jZSBJRHMgaXMgZGlzdGluY3QgZnJvbSB0aGUgbGlmZXRpbWUgb2YKK2luc3RhbmNlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyByZWxhdGlvbnNoaXBzIHRvIGJlIHNwZWNpZmllZCBzZXBhcmF0ZQorZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0YW5jZXMuIFRoaXMgZmxleGliaWxpdHkgY29tZXMgYXQgdGhlCitleHBlbnNlIG9mIGV4dHJhIEFQSSBjYWxscy4KKworVGhlIHNhbWUgSUQgbWF5IG5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMsIHVubGVzcyBhIHByZXZpb3VzCitbcmVmXSBfX2l0dF9pZF9kZXN0cm95IGNhbGwgZm9yIHRoYXQgSUQgaGFzIGJlZW4gaXNzdWVkLgorKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBwcmFnbWEgbWVzc2FnZSgiV0FSTklORyEhISBEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iKQorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgd2FybmluZyAiRGVwcmVjYXRlZCBBUEkgaXMgdXNlZC4gUGxlYXNlIHVuZGVmaW5lIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZIG1hY3JvIgorIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICBpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBwdWJsaWMgUHVibGljIEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY29udHJvbCBDb2xsZWN0aW9uIENvbnRyb2wKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IG5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBpcyBiZWluZyBjb2xsZWN0ZWQKKyAqCisgKiBQYXVzaW5nIG9jY3VycyBub3Qgb25seSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGJ1dCBmb3IgYWxsIHByb2Nlc3MgYXMgd2VsbCBhcyBzcGF3bmVkIHByb2Nlc3NlcworICogLSBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRToKKyAqICAgLSBEb2VzIG5vdCBhbmFseXplIG9yIHJlcG9ydCBlcnJvcnMgdGhhdCBpbnZvbHZlIG1lbW9yeSBhY2Nlc3MuCisgKiAgIC0gT3RoZXIgZXJyb3JzIGFyZSByZXBvcnRlZCBhcyB1c3VhbC4gUGF1c2luZyBkYXRhIGNvbGxlY3Rpb24gaW4KKyAqICAgICBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRQorICogICAgIG9ubHkgcGF1c2VzIHRyYWNpbmcgYW5kIGFuYWx5emluZyBtZW1vcnkgYWNjZXNzLgorICogICAgIEl0IGRvZXMgbm90IHBhdXNlIHRyYWNpbmcgb3IgYW5hbHl6aW5nIHRocmVhZGluZyBBUElzLgorICogICAuCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBhbmQgSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBYRToKKyAqICAgLSBEb2VzIGNvbnRpbnVlIHRvIHJlY29yZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBzdGFydGVkLgorICogICAuCisgKiAtIE90aGVyIGVmZmVjdHM6CisgKiAgIC0gUG9zc2libGUgcmVkdWN0aW9uIG9mIHJ1bnRpbWUgb3ZlcmhlYWQuCisgKiAgIC4KKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb250cm9sIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdpdmUgbmFtZXMgdG8gdGhyZWFkcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgU2V0cyB0aHJlYWQgbmFtZSBvZiBjYWxsaW5nIHRocmVhZAorICogQHBhcmFtW2luXSBuYW1lIC0gbmFtZSBvZiB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lQShjb25zdCBjaGFyICAgICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIF9faXR0X3RocmVhZF9zZXRfbmFtZUEKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUEgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgc3VwcHJlc3MgRXJyb3Igc3VwcHJlc3Npb24KKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IGVycm9ycyBhcmUgc3VwcHJlc3NlZAorICoKKyAqIEB7CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIHVzZWQgZm9yIGVycm9yIHN1cHByZXNzaW9uIGluIGNvcnJlY3RuZXNzIHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzaworICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2FsbF9lcnJvcnMgMHg3ZmZmZmZmZgorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzayAoc3VwcHJlc3NlcyBlcnJvcnMgZnJvbSB0aHJlYWRpbmcgYW5hbHlzaXMpCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfdGhyZWFkaW5nX2Vycm9ycyAweDAwMDAwMGZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIG1lbW9yeSBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzIDB4MDAwMGZmMDAKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgc3VwcHJlc3NpbmcgZXJyb3JzIGlkZW50aWZpZWQgaW4gbWFzayBvbiB0aGlzIHRocmVhZAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19wdXNoKHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgKHVuc2lnbmVkIGludCBtYXNrKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcHVzaCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcHVzaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2gobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0cyBvZiB0aGUgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19wdXNoCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX3BvcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcG9wLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcG9wKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wb3BfcHRyIElUVE5PVElGWV9OQU1FKHN1cHByZXNzX3BvcCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCgpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9zdXBwcmVzc19tb2RlIHsKKyAgICBfX2l0dF91bnN1cHByZXNzX3JhbmdlLAorICAgIF9faXR0X3N1cHByZXNzX3JhbmdlCit9IF9faXR0X3N1cHByZXNzX21vZGVfdDsKKworLyoqCisgKiBAYnJpZWYgTWFyayBhIHJhbmdlIG9mIG1lbW9yeSBmb3IgZXJyb3Igc3VwcHJlc3Npb24gb3IgdW5zdXBwcmVzc2lvbiBmb3IgZXJyb3IgdHlwZXMgaW5jbHVkZWQgaW4gbWFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0IG9mIGEgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlLiAgIElmIG5vdCBtYXRjaGluZworICogICAgICAgIGNhbGwgaXMgZm91bmQsIG5vdGhpbmcgaXMgY2hhbmdlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UgICAgIElUVE5PVElGWV9WT0lEKHN1cHByZXNzX2NsZWFyX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gKi8KKy8qKiBAfSBzdXBwcmVzcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgcHVibGljCisgKiBJbmRpY2F0ZSB1c2VyLXdyaXR0ZW4gc3luY2hyb25pemF0aW9uIGNvZGUKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorQGJyaWVmIE5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CitAcGFyYW1baW5dIGFkZHIgICAgICAgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4gWW91IHNob3VsZAordXNlIGEgcmVhbCBhZGRyZXNzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorQHBhcmFtW2luXSBvYmp0eXBlICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMKK3Bhc3NlZCwgdGhlIG5hbWUgd2lsbCBiZSAiVXNlciBTeW5jaHJvbml6YXRpb24iLgorQHBhcmFtW2luXSBvYmpuYW1lICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsCitubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIG9iamVjdC4KK0BwYXJhbVtpbl0gYXR0cmlidXRlICBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XQorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NyZWF0ZSAodm9pZCAqYWRkciwgY29uc3QgY2hhciAqb2JqdHlwZSwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyKiAgICBvYmp0eXBlLCBjb25zdCBjaGFyKiAgICBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKK0BicmllZiBSZW5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CisKK1lvdSBjYW4gdXNlIHRoZSByZW5hbWUgY2FsbCB0byBhc3NpZ24gb3IgcmVhc3NpZ24gYSBuYW1lIHRvIGEgZ2l2ZW4KK3N5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIGFkZHIgIGhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG5hbWUgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVXCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVuYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBKGFkZHIsIG5hbWUpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgQGJyaWVmIERlc3Ryb3kgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorIEBwYXJhbSBhZGRyIEhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfZGVzdHJveSh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19kZXN0cm95LCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcHJlcGFyZSh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19wcmVwYXJlKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NhbmNlbCkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKiogQH0gc3luYyBncm91cCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgY29ycmVjdG5lc3MgY2hlY2tpbmcgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfYWNxdWlyZWQsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBtb2RlbCBNb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRoaXMgaXMgdGhlIHN1YnNldCBvZiBpdHQgdXNlZCBmb3IgbW9kZWxpbmcgYnkgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvci4KKyAqIFRoaXMgQVBJIGlzIGNhbGxlZCBPTkxZIHVzaW5nIGFubm90YXRlLmgsIGJ5ICJBbm5vdGF0aW9uIiBtYWNyb3MKKyAqIHRoZSB1c2VyIHBsYWNlcyBpbiB0aGVpciBzb3VyY2VzIGR1cmluZyB0aGUgcGFyYWxsZWxpc20gbW9kZWxpbmcgc3RlcHMuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgYW5kIHRhc2tfYmVnaW4vZW5kIHRha2UgdGhlIGFkZHJlc3Mgb2YgaGFuZGxlIHZhcmlhYmxlcywKKyAqIHdoaWNoIGFyZSB3cml0ZWFibGUgYnkgdGhlIEFQSS4gIEhhbmRsZXMgbXVzdCBiZSAwIGluaXRpYWxpemVkIHByaW9yCisgKiB0byB0aGUgZmlyc3QgY2FsbCB0byBiZWdpbiwgb3IgbWF5IGNhdXNlIGEgcnVuLXRpbWUgZmFpbHVyZS4KKyAqIFRoZSBoYW5kbGVzIGFyZSBpbml0aWFsaXplZCBpbiBhIG11bHRpLXRocmVhZCBzYWZlIHdheSBieSB0aGUgQVBJIGlmCisgKiB0aGUgaGFuZGxlIGlzIDAuICBUaGUgY29tbW9ubHkgZXhwZWN0ZWQgaWRpb20gaXMgb25lIHN0YXRpYyBoYW5kbGUgdG8KKyAqIGlkZW50aWZ5IGEgc2l0ZSBvciB0YXNrLiAgSWYgYSBzaXRlIG9yIHRhc2sgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeQorICogYmVlbiBzdGFydGVkIGR1cmluZyB0aGlzIGNvbGxlY3Rpb24sIHRoZSBzYW1lIGhhbmRsZSBNQVkgYmUgcmV0dXJuZWQsCisgKiBidXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIC0gaXQgaXMgdW5zcGVjaWZpZWQgaWYgZGF0YSBtZXJnaW5nIGlzIGRvbmUKKyAqIGJhc2VkIG9uIG5hbWUuICBUaGVzZSByb3V0aW5lcyBhbHNvIHRha2UgYW4gaW5zdGFuY2UgdmFyaWFibGUuICBMaWtlCisgKiB0aGUgbGV4aWNhbCBpbnN0YW5jZSwgdGhlc2UgbXVzdCBiZSAwIGluaXRpYWxpemVkLiAgVW5saWtlIHRoZSBsZXhpY2FsCisgKiBpbnN0YW5jZSwgdGhpcyBpcyB1c2VkIHRvIHRyYWNrIGEgc2luZ2xlIGR5bmFtaWMgaW5zdGFuY2UuCisgKgorICogQVBJIHVzZWQgYnkgdGhlIEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IgdG8gZGVzY3JpYmUgcG90ZW50aWFsIGNvbmN1cnJlbmN5CisgKiBhbmQgcmVsYXRlZCBhY3Rpdml0aWVzLiBVc2VyLWFkZGVkIHNvdXJjZSBhbm5vdGF0aW9ucyBleHBhbmQgdG8gY2FsbHMKKyAqIHRvIHRoZXNlIHByb2NlZHVyZXMgdG8gZW5hYmxlIG1vZGVsaW5nIG9mIGEgaHlwb3RoZXRpY2FsIGNvbmN1cnJlbnQKKyAqIGV4ZWN1dGlvbiBzZXJpYWxseS4KKyAqIEB7CisgKi8KKyNpZiAhZGVmaW5lZChfQURWSVNPUl9BTk5PVEFURV9IXykgfHwgZGVmaW5lZChBTk5PVEFURV9FWFBBTkRfTlVMTCkKKwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlOyAgICAgICAgICAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGxleGljYWwgc2l0ZSAgICAgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZTsgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBkeW5hbWljIGluc3RhbmNlICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2s7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9tb2RlbF9kaXNhYmxlCisgKiBAYnJpZWYgRW51bWVyYXRvciBmb3IgdGhlIGRpc2FibGUgbWV0aG9kcworICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21vZGVsX2Rpc2FibGVfb2JzZXJ2YXRpb24sCisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9jb2xsZWN0aW9uCit9IF9faXR0X21vZGVsX2Rpc2FibGU7CisKKyNlbmRpZiAvKiAhX0FEVklTT1JfQU5OT1RBVEVfSF8gfHwgQU5OT1RBVEVfRVhQQU5EX05VTEwgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfU0lURV9CRUdJTi9BTk5PVEFURV9TSVRFX0VORCBzdXBwb3J0LgorICoKKyAqIHNpdGVfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIGNvbmN1cnJlbmN5IHNpdGUuCisgKiBzaXRlIGluc3RhbmNlcyBtYXkgYmUgcmVjdXJzaXZlbHkgbmVzdGVkIHdpdGggdGhlbXNlbHZlcy4KKyAqIHNpdGVfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgYnV0IHVuZW5kZWQgc2l0ZSBmb3IgdGhlIGN1cnJlbnQKKyAqIHRocmVhZC4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmUuCisgKiBJbnN0YW5jZXMgb2YgYSBzaXRlIGVuY291bnRlcmVkIG9uIGRpZmZlcmVudCB0aHJlYWRzIGNvbmN1cnJlbnRseQorICogYXJlIGNvbnNpZGVyZWQgY29tcGxldGVseSBkaXN0aW5jdC4gSWYgdGhlIHNpdGUgbmFtZSBmb3IgdHdvIGRpZmZlcmVudAorICogbGV4aWNhbCBzaXRlcyBtYXRjaCwgaXQgaXMgdW5zcGVjaWZpZWQgd2hldGhlciB0aGV5IGFyZSB0cmVhdGVkIGFzIHRoZQorICogc2FtZSBvciBkaWZmZXJlbnQgZm9yIGRhdGEgcHJlc2VudGF0aW9uLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9lbmQgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luLCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmQsICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpblcpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbihzaXRlLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZChzaXRlLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX1RBU0tfQkVHSU4vQU5OT1RBVEVfVEFTS19FTkQgc3VwcG9ydAorICoKKyAqIHRhc2tfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIHRhc2ssIHdoaWNoIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1vc3QKKyAqIGNsb3NlbHkgZW5jbG9zaW5nIGR5bmFtaWMgc2l0ZS4gIHRhc2tfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQKKyAqIGJ1dCB1bmVuZGVkIHRhc2suICBUaGUgaGFuZGxlIHBhc3NlZCB0byBlbmQgbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUKKyAqIHN0cnVjdHVyZS4gIEl0IGlzIHVuc3BlY2lmaWVkIGlmIGJhZCBkeW5hbWljIG5lc3RpbmcgaXMgZGV0ZWN0ZWQuICBJZiBpdAorICogaXMsIGl0IHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSByZXN1bHRpbmcgZGF0YSBjb2xsZWN0aW9uLiAgVGhlIGNvbGxlY3RvcgorICogc2hvdWxkIG5vdCBmYWlsIGR1ZSB0byBjb25zdHJ1Y3QgbmVzdGluZyBpc3N1ZXMsIG5vciBhdHRlbXB0IHRvIGRpcmVjdGx5CisgKiBpbmRpY2F0ZSB0aGUgcHJvYmxlbS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbihfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNlbmRpZgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbkEoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfZW5kICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmRfMih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbiwgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSkpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luVywgIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmQsICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1cgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza1cpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkEpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbih0YXNrLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0EobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZCh0YXNrLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfTE9DS19BQ1FVSVJFL0FOTk9UQVRFX0xPQ0tfUkVMRUFTRSBzdXBwb3J0CisgKgorICogbG9ja19hY3F1aXJlL3JlbGVhc2UgbW9kZWwgYSBwb3RlbnRpYWwgbG9jayBmb3IgYm90aCBsb2Nrc2V0IGFuZAorICogcGVyZm9ybWFuY2UgbW9kZWxpbmcuICBFYWNoIHVuaXF1ZSBhZGRyZXNzIGlzIG1vZGVsZWQgYXMgYSBzZXBhcmF0ZQorICogbG9jaywgd2l0aCBpbnZhbGlkIGFkZHJlc3NlcyBiZWluZyB2YWxpZCBsb2NrIElEcy4gIFNwZWNpZmljYWxseToKKyAqIG5vIHN0b3JhZ2UgaXMgYWNjZXNzZWQgYnkgdGhlIEFQSSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgLSBpdCBpcyBvbmx5CisgKiB1c2VkIGZvciBsb2NrIGlkZW50aWZpY2F0aW9uLiAgTG9jayBhY3F1aXJlcyBtYXkgYmUgc2VsZi1uZXN0ZWQgYW5kIGFyZQorICogdW5sb2NrZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiByZWxlYXNlcy4KKyAqIChUaGVzZSBjbG9zZWx5IGNvcnJlc3BvbmQgdG8gX19pdHRfc3luY19hY3F1aXJlZC9fX2l0dF9zeW5jX3JlbGVhc2luZywKKyAqIGJ1dCBtYXkgbm90IGhhdmUgaWRlbnRpY2FsIHNlbWFudGljcy4pCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZSh2b2lkICpsb2NrKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzIodm9pZCAqbG9jayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlXzIsICh2b2lkICpsb2NrKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlXzIsICh2b2lkICpsb2NrKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19hY3F1aXJlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19hY3F1aXJlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19yZWxlYXNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19yZWxlYXNlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZShsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVDT1JEX0FMTE9DQVRJT04vQU5OT1RBVEVfUkVDT1JEX0RFQUxMT0NBVElPTiBzdXBwb3J0CisgKgorICogcmVjb3JkX2FsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGRlc2NyaWJlIHVzZXItZGVmaW5lZCBtZW1vcnkgYWxsb2NhdG9yCisgKiBiZWhhdmlvciwgd2hpY2ggbWF5IGJlIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcyBtb2RlbGluZyB0byB1bmRlcnN0YW5kCisgKiB3aGVuIHN0b3JhZ2UgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGFjdHVhbGx5IHJldXNlZCBhY3Jvc3MgdGhyZWFkcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24gICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2FsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24gICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb25fcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbihhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24oYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9JTkRVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgaW5kdWN0aXZlIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pbmR1Y3Rpb25fdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVEVUNUSU9OX1VTRVMgc3VwcG9ydAorICoKKyAqIE5vdGUgcGFydGljdWxhciBzdG9yYWdlIGlzIHVzZWQgZm9yIHJlZHVjdGlvbiB0aHJvdWdoIHRoZSBlbmQKKyAqIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9PQlNFUlZFX1VTRVMgc3VwcG9ydAorICoKKyAqIEhhdmUgY29ycmVjdG5lc3MgbW9kZWxpbmcgcmVjb3JkIG9ic2VydmF0aW9ucyBhYm91dCB1c2VzIG9mIHN0b3JhZ2UKKyAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX29ic2VydmVfdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX29ic2VydmVfdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9vYnNlcnZlX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfb2JzZXJ2ZV91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfQ0xFQVJfVVNFUyBzdXBwb3J0CisgKgorICogQ2xlYXIgdGhlIHNwZWNpYWwgaGFuZGxpbmcgb2YgYSBwaWVjZSBvZiBzdG9yYWdlIHJlbGF0ZWQgdG8gaW5kdWN0aW9uLAorICogcmVkdWN0aW9uIG9yIG9ic2VydmVfdXNlcworICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9jbGVhcl91c2VzLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2NsZWFyX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2NsZWFyX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKGFkZHIpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0RJU0FCTEVfKl9QVVNIL0FOTk9UQVRFX0RJU0FCTEVfKl9QT1Agc3VwcG9ydAorICoKKyAqIGRpc2FibGVfcHVzaC9kaXNhYmxlX3BvcCBwdXNoIGFuZCBwb3AgZGlzYWJsaW5nIGJhc2VkIG9uIGEgcGFyYW1ldGVyLgorICogRGlzYWJsaW5nIG9ic2VydmF0aW9ucyBzdG9wcyBwcm9jZXNzaW5nIG9mIG1lbW9yeSByZWZlcmVuY2VzIGR1cmluZworICogY29ycmVjdG5lc3MgbW9kZWxpbmcsIGFuZCBhbGwgYW5ub3RhdGlvbnMgdGhhdCBvY2N1ciBpbiB0aGUgZGlzYWJsZWQKKyAqIHJlZ2lvbi4gIFRoaXMgYWxsb3dzIGRlc2NyaXB0aW9uIG9mIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBoYW5kbGVkCisgKiBzcGVjaWFsbHkgZHVyaW5nIGNvbnZlcnNpb24gdG8gcGFyYWxsZWxpc20gb3IgdGhhdCBpcyBub3QgcmVjb2duaXplZAorICogYnkgdG9vbHMgKGUuZy4gc29tZSBraW5kcyBvZiBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucy4pCisgKiBUaGlzIG1lY2hhbmlzbSBjYXVzZXMgYWxsIGFubm90YXRpb25zIGluIHRoZSBkaXNhYmxlZCByZWdpb24sIG90aGVyCisgKiB0aGFuIGRpc2FibGVfcHVzaCBhbmQgZGlzYWJsZV9wb3AsIHRvIGJlIGlnbm9yZWQuICAoRm9yIGV4YW1wbGUsIHRoaXMKKyAqIG1pZ2h0IHZhbGlkbHkgYmUgdXNlZCB0byBkaXNhYmxlIGFuIGVudGlyZSBwYXJhbGxlbCBzaXRlIGFuZCB0aGUgY29udGFpbmVkCisgKiB0YXNrcyBhbmQgbG9ja2luZyBpbiBpdCBmb3IgZGF0YSBjb2xsZWN0aW9uIHB1cnBvc2VzLikKKyAqIFRoZSBkaXNhYmxlIGZvciBjb2xsZWN0aW9uIGlzIGEgbW9yZSBleHBlbnNpdmUgb3BlcmF0aW9uLCBidXQgcmVkdWNlcworICogY29sbGVjdG9yIG92ZXJoZWFkIHNpZ25pZmljYW50bHkuICBUaGlzIGFwcGxpZXMgdG8gQk9USCBjb3JyZWN0bmVzcyBkYXRhCisgKiBjb2xsZWN0aW9uIGFuZCBwZXJmb3JtYW5jZSBkYXRhIGNvbGxlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBzaXRlCisgKiBjb250YWluaW5nIGEgdGFzayBtaWdodCBvbmx5IGVuYWJsZSBkYXRhIGNvbGxlY3Rpb24gZm9yIHRoZSBmaXJzdCAxMAorICogaXRlcmF0aW9ucy4gIEJvdGggcGVyZm9ybWFuY2UgYW5kIGNvcnJlY3RuZXNzIGRhdGEgc2hvdWxkIHJlZmxlY3QgdGhpcywKKyAqIGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgcnVuIGFzIGNsb3NlIHRvIGZ1bGwgc3BlZWQgYXMgcG9zc2libGUgd2hlbgorICogY29sbGVjdGlvbiBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKF9faXR0X21vZGVsX2Rpc2FibGUgeCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCh2b2lkKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHNpemVfdCB4KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wdXNoLCAoX19pdHRfbW9kZWxfZGlzYWJsZSB4KSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfYWdncmVnYXRlX3Rhc2ssIChzaXplX3QgeCkpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcHVzaCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3BfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2sgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2tfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1vZGVsIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGhlYXAgSGVhcAorICogQGluZ3JvdXAgcHVibGljCisgKiBIZWFwIGdyb3VwCisgKiBAeworICovCisKK3R5cGVkZWYgdm9pZCogX19pdHRfaGVhcF9mdW5jdGlvbjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGlkZW50aWZpY2F0aW9uIGZvciBoZWFwIGZ1bmN0aW9uCisgKiBAcmV0dXJuIG5vbi16ZXJvIGlkZW50aWZpZXIgb3IgTlVMTAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEoY29uc3QgY2hhciogICAgbmFtZSwgY29uc3QgY2hhciogICAgZG9tYWluKTsKK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyhjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUgICAgIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShuYW1lLCBkb21haW4pICAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2JlZ2luLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW4oaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoaCwgYWRkciwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGJlZ2luIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfZnJlZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfZnJlZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4oaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZnJlZSBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mcmVlX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9lbmQoaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWFsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKGgsIGFkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gcmVhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHZvaWQqKiBuZXdfYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2VuZChoLCBhZGRyLCBuZXdfYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgaW50ZXJuYWwgYWNjZXNzIGVuZCAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sICAodm9pZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCgpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgdHlwZSBvZiBoZWFwIGRldGVjdGlvbi9yZXBvcnRpbmcgdG8gbW9kaWZ5LgorICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGxlYWtzLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfbGVha3MgMHgwMDAwMDAwMQorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGdyb3d0aC4KKyAqLworI2RlZmluZSBfX2l0dF9oZWFwX2dyb3d0aCAweDAwMDAwMDAyCisKKworLyoqIEBicmllZiBoZWFwIHJlc2V0IGRldGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24odW5zaWduZWQgaW50IHJlc2V0X21hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgICh1bnNpZ25lZCBpbnQgcmVzZXRfbWFzaykpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uICAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZXNldF9kZXRlY3Rpb24pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9yZXNldF9kZXRlY3Rpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIHJlcG9ydCAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmQodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmQsICh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gaGVhcCBncm91cCAqLworLyoqIEBlbmRjb25kICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEBkZWZncm91cCBkb21haW5zIERvbWFpbnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRG9tYWlucyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZG9tYWluCit7CisgICAgdm9sYXRpbGUgaW50IGZsYWdzOyAvKiE8IFplcm8gaWYgZGlzYWJsZWQsIG5vbi16ZXJvIGlmIGVuYWJsZWQuIFRoZSBtZWFuaW5nIG9mIGRpZmZlcmVudCBub24temVybyB2YWx1ZXMgaXMgcmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBjb25zdCBjaGFyKiBuYW1lQTsgIC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBuYW1lVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogbmFtZVc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIGludCAgIGV4dHJhMTsgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHN0cnVjdCBfX19pdHRfZG9tYWluKiBuZXh0OworfSBfX2l0dF9kb21haW47CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBkb21haW5zCisgKiBAYnJpZWYgQ3JlYXRlIGEgZG9tYWluLgorICogQ3JlYXRlIGRvbWFpbiB1c2luZyBzb21lIGRvbWFpbiBuYW1lOiB0aGUgVVJJIG5hbWluZyBzdHlsZSBpcyByZWNvbW1lbmRlZC4KKyAqIEJlY2F1c2UgdGhlIHNldCBvZiBkb21haW5zIGlzIGV4cGVjdGVkIHRvIGJlIHN0YXRpYyBvdmVyIHRoZSBhcHBsaWNhdGlvbidzCisgKiBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBkb21haW4uCisgKiBBbnkgZG9tYWluIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzLCByZWdhcmRsZXNzIG9mCisgKiB3aGljaCB0aHJlYWQgY3JlYXRlZCB0aGUgZG9tYWluLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgbmFtZSBvZiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSk7CitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgX19pdHRfZG9tYWluX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlX3B0ciBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShkb21haW5fY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQShuYW1lKSAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlKG5hbWUpICAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZG9tYWlucyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBpZHMgSURzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIElEcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfaWQKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgZDEsIGQyLCBkMzsKK30gX19pdHRfaWQ7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X2lkIF9faXR0X251bGwgPSB7IDAsIDAsIDAgfTsKKworLyoqCisgKiBAaW5ncm91cCBpZHMKKyAqIEBicmllZiBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIGNyZWF0ZSBhbiBJRCB3aXRob3V0IGRvbWFpbiBjb250cm9sLgorICogQGJyaWVmIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBpbml0aWFsaXplIGFuIF9faXR0X2lkIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbgorICogZG9lcyBub3QgYWZmZWN0IHRoZSB0cmFjZSBjb2xsZWN0b3IgcnVudGltZSBpbiBhbnkgd2F5LiBBZnRlciB5b3UgbWFrZSB0aGUgSUQgd2l0aCB0aGlzCisgKiBmdW5jdGlvbiwgeW91IHN0aWxsIG11c3QgY3JlYXRlIGl0IHdpdGggdGhlIF9faXR0X2lkX2NyZWF0ZSBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgdGhlIElECisgKiB0byBpZGVudGlmeSBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gYWRkciBUaGUgYWRkcmVzcyBvZiBvYmplY3Q7IGhpZ2ggUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICogQHBhcmFtW2luXSBleHRyYSBUaGUgZXh0cmEgZGF0YSB0byB1bmlxdWUgaWRlbnRpZnkgb2JqZWN0OyBsb3cgUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICovCisKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKQoreworICAgIF9faXR0X2lkIGlkID0gX19pdHRfbnVsbDsKKyAgICBpZC5kMSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKCh1aW50cHRyX3QpYWRkcik7CisgICAgaWQuZDIgPSAodW5zaWduZWQgbG9uZyBsb25nKWV4dHJhOworICAgIGlkLmQzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykwOyAvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZiBhbiBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElECisgKiBjYW4gYmUgdXNlZCB0byB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzCisgKiBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogSW5zdGFuY2UgSURzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljIQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2NyZWF0ZSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4KKyAqIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUgaW52YWxpZC4KKyAqIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2Rlc3Ryb3ksZCx4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGlkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBoYW5kbGVzcyBTdHJpbmcgSGFuZGxlcworICogQGluZ3JvdXAgcHVibGljCisgKiBTdHJpbmcgSGFuZGxlcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZQoreworICAgIGNvbnN0IGNoYXIqIHN0ckE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIHN0clc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogc3RyVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIG5leHQ7Cit9IF9faXR0X3N0cmluZ19oYW5kbGU7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBoYW5kbGVzCisgKiBAYnJpZWYgQ3JlYXRlIGEgc3RyaW5nIGhhbmRsZS4KKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGhhbmRsZSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzdHJpbmcuCisgKiBDb25zZWN1dGl2ZSBjYWxscyB0byBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKKyAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHN0cmluZyBoYW5kbGVzIGlzIGV4cGVjdGVkIHRvIHJlbWFpbgorICogc3RhdGljIGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBzdHJpbmcgaGFuZGxlLgorICogQW55IHN0cmluZyBoYW5kbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBzdHJpbmcgaGFuZGxlLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIGlucHV0IHN0cmluZworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUobmFtZSkgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGhhbmRsZXMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2l0dF90aW1lc3RhbXA7CisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X3RpbWVzdGFtcCBfX2l0dF90aW1lc3RhbXBfbm9uZSA9IChfX2l0dF90aW1lc3RhbXApLTFMTDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBpbmdyb3VwIHRpbWVzdGFtcHMKKyAqIEBicmllZiBSZXR1cm4gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBtb21lbnQuCisgKiBUaGlzIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiBmb3JtYXQgdGhhdCBpcyBtb3N0IHJlbGV2YW50IGZvciB0aGUgY3VycmVudAorICogaG9zdCBvciBwbGF0Zm9ybS4gIERvIG5vdCByZWx5IHRoYXQgaXQncyBSRFRTQyB2YWx1ZS4gIEl0IGlzIHBvc3NpYmxlCisgKiB0byBjb21wYXJlIF9faXR0X3RpbWVzdGFtcCB2YWx1ZXMgd2l0aCAiPCIgb3BlcmF0b3IuCisgKi8KK19faXR0X3RpbWVzdGFtcCBJVFRBUEkgX19pdHRfZ2V0X3RpbWVzdGFtcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCAgICAgIElUVE5PVElGWV9EQVRBKGdldF90aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICBJVFROT1RJRllfTkFNRShnZXRfdGltZXN0YW1wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCgpCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGltZXN0YW1wcyAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVnaW9ucyBSZWdpb25zCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFJlZ2lvbnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEJlZ2luIG9mIHJlZ2lvbiBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfcmVnaW9uX2JlZ2luIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQKKyAqIHVudGlsIGEgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggdGhlIHNhbWUgSUQKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UuIE11c3Qgbm90IGJlIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgcmVnaW9uIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyByZWdpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2JlZ2luKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHJlZ2lvbnMKKyAqIEBicmllZiBFbmQgb2YgcmVnaW9uIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfcmVnaW9uX2VuZCB3aXRoIGEgZ2l2ZW4gSUQgZW5kcyB0aGUKKyAqIHJlZ2lvbi4gU3VjY2Vzc2l2ZSBjYWxscyB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLCBhcyBhcmUKKyAqIGNhbGxzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBfX2l0dF9yZWdpb25fYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2VuZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fYmVnaW4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhyZWdpb25fYmVnaW4sZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHJlZ2lvbl9iZWdpbikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHJlZ2lvbl9lbmQsZCx4KQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWdpb25zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGZyYW1lcyBGcmFtZXMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRnJhbWVzIGFyZSBzaW1pbGFyIHRvIHJlZ2lvbnMsIGJ1dCBhcmUgaW50ZW5kZWQgdG8gYmUgZWFzaWVyIHRvIHVzZSBhbmQgdG8gaW1wbGVtZW50LgorICogSW4gcGFydGljdWxhcjoKKyAqIC0gRnJhbWVzIGFsd2F5cyByZXByZXNlbnQgcGVyaW9kcyBvZiBlbGFwc2VkIHRpbWUKKyAqIC0gQnkgZGVmYXVsdCwgZnJhbWVzIGhhdmUgbm8gbmVzdGluZyByZWxhdGlvbnNoaXBzCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgZnJhbWVzCisgKiBAYnJpZWYgQmVnaW4gYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gd2l0aCB0aGUKKyAqIHNhbWUgSUQgYXJlIGlnbm9yZWQgdW50aWwgYSBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIHRoZSBzYW1lIElELgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2Ugb3IgTlVMTAorICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbl92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBFbmQgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIGEgZ2l2ZW4gSUQKKyAqIGVuZHMgdGhlIGZyYW1lLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X2ZyYW1lX2JlZ2luIGNhbGwuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMIGZvciBjdXJyZW50CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBTdWJtaXRzIGEgZnJhbWUgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X2ZyYW1lX2JlZ2luIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdCB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdAorICogd2l0aCB0aGUgc2FtZSBJRC4KKyAqIFBhc3Npbmcgc3BlY2lhbCBfX2l0dF90aW1lc3RhbXBfbm9uZSB2YWx1ZSBhcyAiZW5kIiBhcmd1bWVudCBtZWFucworICogdGFrZSB0aGUgY3VycmVudCB0aW1lc3RhbXAgYXMgdGhlIGVuZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKiBAcGFyYW1baW5dIGJlZ2luIFRpbWVzdGFtcCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZQorICogQHBhcmFtW2luXSBlbmQgVGltZXN0YW1wIG9mIHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX3N1Ym1pdF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLAorICAgIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfc3VibWl0X3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCwgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZCx4KSAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2JlZ2luX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2JlZ2luX3YzKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZCx4KSAgICAgSVRUTk9USUZZX1ZPSURfRDEoZnJhbWVfZW5kX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZF92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGQseCxiLGUpIElUVE5PVElGWV9WT0lEX0QzKGZyYW1lX3N1Ym1pdF92MyxkLHgsYixlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgICAgSVRUTk9USUZZX05BTUUoZnJhbWVfc3VibWl0X3YzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoZG9tYWluLGlkLGJlZ2luLGVuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGZyYW1lcyBncm91cCAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tncm91cCBUYXNrIEdyb3VwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRhc2sgR3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgdGFza19ncm91cHMKKyAqIEBicmllZiBEZW5vdGVzIGEgdGFza19ncm91cCBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfdGFza19ncm91cCB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLiBNdXN0IG5vdCBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFza19ncm91cAorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2dyb3VwKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2dyb3VwLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXAoZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19ncm91cCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZ3JvdXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGFza2dyb3VwIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tzIFRhc2tzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEEgdGFzayBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGllY2Ugb2Ygd29yayBwZXJmb3JtZWQgYnkgYSBwYXJ0aWN1bGFyCisgKiB0aHJlYWQgZm9yIGEgcGVyaW9kIG9mIHRpbWUuIEEgY2FsbCB0byBfX2l0dF90YXNrX2JlZ2luIGNyZWF0ZXMgYQorICogdGFzayBpbnN0YW5jZS4gVGhpcyBiZWNvbWVzIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciB0aGF0IHRhc2sgb24gdGhhdAorICogdGhyZWFkLiBBIGZvbGxvd2luZyBjYWxsIHRvIF9faXR0X3Rhc2tfZW5kIG9uIHRoZSBzYW1lIHRocmVhZCBlbmRzIHRoZQorICogaW5zdGFuY2UuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBzaW11bHRhbmVvdXMgaW5zdGFuY2VzIG9mIHRhc2tzIHdpdGggdGhlCisgKiBzYW1lIG5hbWUgb24gZGlmZmVyZW50IHRocmVhZHMuIElmIGFuIElEIGlzIHNwZWNpZmllZCwgdGhlIHRhc2sgaW5zdGFuY2UKKyAqIHJlY2VpdmVzIHRoYXQgSUQuIE5lc3RlZCB0YXNrcyBhcmUgYWxsb3dlZC4KKyAqCisgKiBOb3RlOiBUaGUgdGFzayBpcyBkZWZpbmVkIGJ5IHRoZSBicmFja2V0aW5nIG9mIF9faXR0X3Rhc2tfYmVnaW4gYW5kCisgKiBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQuIElmIHNvbWUgc2NoZWR1bGluZyBtZWNoYW5pc20gY2F1c2VzCisgKiB0YXNrIHN3aXRjaGluZyAodGhlIHRocmVhZCBleGVjdXRlcyBhIGRpZmZlcmVudCB1c2VyIHRhc2spIG9yIHRhc2sKKyAqIHN3aXRjaGluZyAodGhlIHVzZXIgdGFzayBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCB0aHJlYWQpIHRoZW4gdGhpcyBicmVha3MKKyAqIHRoZSBub3Rpb24gb2YgIGN1cnJlbnQgaW5zdGFuY2UuIEFkZGl0aW9uYWwgQVBJIGNhbGxzIGFyZSByZXF1aXJlZCB0bworICogZGVhbCB3aXRoIHRoYXQgcG9zc2liaWxpdHkuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzayAobWF5IGJlIDApCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgRW5kIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkLHgseSx6KSAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luX2ZuLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9mbikKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZCkgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMCh0YXNrX2VuZCxkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkb21haW4saWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuKGRvbWFpbixpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9wdHIgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZChkb21haW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzIENvdW50ZXJzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIENvdW50ZXJzIGFyZSB1c2VyLWRlZmluZWQgb2JqZWN0cyB3aXRoIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCisgKiB2YWx1ZS4gQ291bnRlciB2YWx1ZXMgYXJlIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gQ291bnRlciB2YWx1ZXMKKyAqIGFyZSB0cmFja2VkIHBlci10aHJlYWQuIENvdW50ZXJzIGhhdmUgbmFtZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluCisgKiB0aGUgdG9vbHMuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IG9uZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHdpdGggYSBnaXZlbiBuYW1lIGNyZWF0ZXMgYSBjb3VudGVyIGJ5IHRoYXQgbmFtZSBhbmQgc2V0cyBpdHMKKyAqIHZhbHVlIHRvIHplcm8gb24gZXZlcnkgdGhyZWFkLiBTdWNjZXNzaXZlIGNhbGxzIGluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICogb24gdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgY2FsbCBpcyBpc3N1ZWQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjb3VudGVycworICogQGJyaWVmIEluY3JlbWVudCBhIGNvdW50ZXIgYnkgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBkZWx0YS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwuIENvdW50ZXIgbmFtZXMgYXJlIG5vdCBkb21haW4gc3BlY2lmaWMuCisgKiAgICAgICAgICAgIFRoZSBkb21haW4gYXJndW1lbnQgaXMgdXNlZCBvbmx5IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEkgY2FsbHMuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbVtpbl0gZGVsdGEgVGhlIGFtb3VudCBieSB3aGljaCB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGFfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjMoZCx4KSAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGNvdW50ZXJfaW5jX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jX3YzKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92MyhkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIoY291bnRlcl9pbmNfZGVsdGFfdjMsZCx4LHkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YV92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGRvbWFpbixuYW1lKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92Myhkb21haW4sbmFtZSxkZWx0YSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1hcmtlcnMgTWFya2VycworICogTWFya2VycyByZXByZXNlbnQgYSBzaW5nbGUgZGlzY3JlZXQgZXZlbnQgaW4gdGltZS4gTWFya2VycyBoYXZlIGEgc2NvcGUsCisgKiBkZXNjcmliZWQgYnkgYW4gZW51bWVyYXRlZCB0eXBlIF9faXR0X3Njb3BlLiBNYXJrZXJzIGFyZSBjcmVhdGVkIGJ5CisgKiB0aGUgQVBJIGNhbGwgX19pdHRfbWFya2VyLiBBIG1hcmtlciBpbnN0YW5jZSBjYW4gYmUgZ2l2ZW4gYW4gSUQgZm9yIHVzZSBpbgorICogYWRkaW5nIG1ldGFkYXRhLgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBEZXNjcmliZXMgdGhlIHNjb3BlIG9mIGFuIGV2ZW50IG9iamVjdCBpbiB0aGUgdHJhY2UuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3Njb3BlX3Vua25vd24gPSAwLAorICAgIF9faXR0X3Njb3BlX2dsb2JhbCwKKyAgICBfX2l0dF9zY29wZV90cmFja19ncm91cCwKKyAgICBfX2l0dF9zY29wZV90cmFjaywKKyAgICBfX2l0dF9zY29wZV90YXNrLAorICAgIF9faXR0X3Njb3BlX21hcmtlcgorfSBfX2l0dF9zY29wZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV91bmtub3duICBfX2l0dF9zY29wZV91bmtub3duCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9nbG9iYWwgICBfX2l0dF9zY29wZV9nbG9iYWwKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Byb2Nlc3MgIF9faXR0X3Njb3BlX3RyYWNrX2dyb3VwCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV90aHJlYWQgICBfX2l0dF9zY29wZV90cmFjaworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGFzayAgICAgX19pdHRfc2NvcGVfdGFzaworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIG1hcmtlciBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKG1hcmtlcixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyKGRvbWFpbixpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhCisgKiBUaGUgbWV0YWRhdGEgQVBJIGlzIHVzZWQgdG8gYXR0YWNoIGV4dHJhIGluZm9ybWF0aW9uIHRvIG5hbWVkCisgKiBlbnRpdGllcy4gTWV0YWRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGJ5IElELAorICogb3IgdG8gdGhlIGN1cnJlbnQgZW50aXR5ICh3aGljaCBpcyBhbHdheXMgYSB0YXNrKS4KKyAqCisgKiBDb25jZXB0dWFsbHkgbWV0YWRhdGEgaGFzIGEgdHlwZSAod2hhdCBraW5kIG9mIG1ldGFkYXRhKSwgYSBrZXkgKHRoZQorICogbmFtZSBvZiB0aGUgbWV0YWRhdGEpLCBhbmQgYSB2YWx1ZSAodGhlIGFjdHVhbCBkYXRhKS4gVGhlIGVuY29kaW5nIG9mCisgKiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuCisgKgorICogVGhlIHR5cGUgb2YgbWV0YWRhdGEgaXMgc3BlY2lmaWVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9tZXRkYXRhX3R5cGUuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBtZXRhZGF0YQorICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21ldGFkYXRhX3Vua25vd24gPSAwLAorICAgIF9faXR0X21ldGFkYXRhX3U2NCwgICAgIC8qKjwgVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zNjQsICAgICAvKio8IFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UzMiwgICAgIC8qKjwgVW5zaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMzIsICAgICAvKio8IFNpZ25lZCAzMi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UxNiwgICAgIC8qKjwgVW5zaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMTYsICAgICAvKio8IFNpZ25lZCAxNi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX2Zsb2F0LCAgIC8qKjwgU2lnbmVkIDMyLWJpdCBmbG9hdGluZy1wb2ludCAqLworICAgIF9faXR0X21ldGFkYXRhX2RvdWJsZSAgIC8qKjwgU0lnbmVkIDY0LWJpdCBmbG9hdGluZy1wb2ludCAqLworfSBfX2l0dF9tZXRhZGF0YV90eXBlOworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGQsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorICogQHBhcmFtW2luXSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG9yIC0xIGlmIHRoZSBsZW5ndGggaXMgdW5rbm93biBidXQgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQKKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZCAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkQSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZFcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjZW5kaWYKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkgIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciAgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBtZXRhZGF0YSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCByZWxhdGlvbnMgUmVsYXRpb25zCisgKiBJbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMgY2FuIGJlIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIG90aGVyCisgKiBpbnN0YW5jZXMgdXNpbmcgaW5zdGFuY2UgSURzIGFuZCB0aGUgcmVsYXRpb25zaGlwIEFQSSBjYWxscy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgVGhlIGtpbmQgb2YgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2VzIGlzIHNwZWNpZmllZCBieSB0aGUgZW51bWVyYXRlZCB0eXBlIF9faXR0X3JlbGF0aW9uLgorICogUmVsYXRpb25zIGJldHdlZW4gaW5zdGFuY2VzIGNhbiBiZSBhZGRlZCB3aXRoIGFuIEFQSSBjYWxsLiBUaGUgcmVsYXRpb24KKyAqIEFQSSB1c2VzIGluc3RhbmNlIElEcy4gUmVsYXRpb25zIGNhbiBiZSBhZGRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbAorICogaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFuZCBwZXJzaXN0IGluZGVwZW5kZW50bHkgb2YgdGhlIGluc3RhbmNlcy4gVGhpcworICogaXMgdGhlIG1vdGl2YXRpb24gZm9yIGhhdmluZyBkaWZmZXJlbnQgbGlmZXRpbWVzIGZvciBpbnN0YW5jZSBJRHMgYW5kCisgKiB0aGUgYWN0dWFsIGluc3RhbmNlcy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgX19pdHRfcmVsYXRpb25faXNfdW5rbm93biA9IDAsCisgICAgX19pdHRfcmVsYXRpb25faXNfZGVwZW5kZW50X29uLCAgICAgICAgIC8qKjwgIkEgaXMgZGVwZW5kZW50IG9uIEIiIG1lYW5zIHRoYXQgQSBjYW5ub3Qgc3RhcnQgdW50aWwgQiBjb21wbGV0ZXMgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19zaWJsaW5nX29mLCAgICAgICAgICAgLyoqPCAiQSBpcyBzaWJsaW5nIG9mIEIiIG1lYW5zIHRoYXQgQSBhbmQgQiB3ZXJlIGNyZWF0ZWQgYXMgYSBncm91cCAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX3BhcmVudF9vZiwgICAgICAgICAgICAvKio8ICJBIGlzIHBhcmVudCBvZiBCIiBtZWFucyB0aGF0IEEgY3JlYXRlZCBCICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWF0aW9uX29mLCAgICAgIC8qKjwgIkEgaXMgY29udGludWF0aW9uIG9mIEIiIG1lYW5zIHRoYXQgQSBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NoaWxkX29mLCAgICAgICAgICAgICAvKio8ICJBIGlzIGNoaWxkIG9mIEIiIG1lYW5zIHRoYXQgQSB3YXMgY3JlYXRlZCBieSBCIChpbnZlcnNlIG9mIGlzX3BhcmVudF9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jb250aW51ZWRfYnksICAgICAgICAgLyoqPCAiQSBpcyBjb250aW51ZWQgYnkgQiIgbWVhbnMgdGhhdCBCIGFzc3VtZXMgdGhlIGRlcGVuZGVuY2llcyBvZiBBIChpbnZlcnNlIG9mIGlzX2NvbnRpbnVhdGlvbl9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wcmVkZWNlc3Nvcl90byAgICAgICAgLyoqPCAiQSBpcyBwcmVkZWNlc3NvciB0byBCIiBtZWFucyB0aGF0IEIgY2Fubm90IHN0YXJ0IHVudGlsIEEgY29tcGxldGVzIChpbnZlcnNlIG9mIGlzX2RlcGVuZGVudF9vbikgKi8KK30gX19pdHRfcmVsYXRpb247CisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlIGlkZW50aWZpZXJzLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gaGVhZCBUaGUgSUQgZm9yIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbgorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50KGQseCx5KSBJVFROT1RJRllfVk9JRF9EMihyZWxhdGlvbl9hZGRfdG9fY3VycmVudCxkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGQoZCx4LHkseikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDMocmVsYXRpb25fYWRkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlbGF0aW9ucyBncm91cCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY2xvY2tfaW5mbworeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9ja19mcmVxOyAvKiE8IENsb2NrIGRvbWFpbiBmcmVxdWVuY3kgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfYmFzZTsgLyohPCBDbG9jayBkb21haW4gYmFzZSB0aW1lc3RhbXAgKi8KK30gX19pdHRfY2xvY2tfaW5mbzsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoSVRUQVBJICpfX2l0dF9nZXRfY2xvY2tfaW5mb19mbikoX19pdHRfY2xvY2tfaW5mbyogY2xvY2tfaW5mbywgdm9pZCogZGF0YSk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbgoreworICAgIF9faXR0X2Nsb2NrX2luZm8gaW5mbzsgICAgICAvKiE8IE1vc3QgcmVjZW50IGNsb2NrIGRvbWFpbiBpbmZvICovCisgICAgX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm47IC8qITwgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIHZvaWQqIGZuX2RhdGE7ICAgICAgICAgICAgICAvKiE8IElucHV0IGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHN0cnVjdCBfX19pdHRfY2xvY2tfZG9tYWluKiBuZXh0OworfSBfX2l0dF9jbG9ja19kb21haW47CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBjbG9jayBkb21haW4uCisgKiBDZXJ0YWluIGFwcGxpY2F0aW9ucyByZXF1aXJlIHRoZSBjYXBhYmlsaXR5IHRvIHRyYWNlIHRoZWlyIGFwcGxpY2F0aW9uIHVzaW5nCisgKiBhIGNsb2NrIGRvbWFpbiBkaWZmZXJlbnQgdGhhbiB0aGUgQ1BVLCBmb3IgaW5zdGFuY2UgdGhlIGluc3RydW1lbnRhdGlvbiBvZiBldmVudHMKKyAqIHRoYXQgb2NjdXIgb24gYSBHUFUuCisgKiBCZWNhdXNlIHRoZSBzZXQgb2YgZG9tYWlucyBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWMgb3ZlciB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwKKyAqIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBkZXN0cm95IGEgZG9tYWluLgorICogQW55IGRvbWFpbiBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHRocmVhZCBpbiB0aGUgcHJvY2VzcywgcmVnYXJkbGVzcyBvZiB3aGljaCB0aHJlYWQgY3JlYXRlZAorICogdGhlIGRvbWFpbi4gVGhpcyBjYWxsIGlzIHRocmVhZC1zYWZlLgorICogQHBhcmFtW2luXSBmbiBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCByZXRyaWV2ZXMgYWx0ZXJuYXRpdmUgQ1BVIHRpbWVzdGFtcHMKKyAqIEBwYXJhbVtpbl0gZm5fZGF0YSBBcmd1bWVudCBmb3IgYSBjYWxsYmFjayBmdW5jdGlvbjsgbWF5IGJlIE5VTEwKKyAqLworX19pdHRfY2xvY2tfZG9tYWluKiBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZShfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoZm4sZm5fZGF0YSkgKF9faXR0X2Nsb2NrX2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWlucworICogQGJyaWVmIFJlY2FsY3VsYXRlIGNsb2NrIGRvbWFpbnMgZnJlcXVlbmNlcyBhbmQgY2xvY2sgYmFzZSB0aW1lc3RhbXBzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNsb2NrX2RvbWFpbl9yZXNldCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQgICAgIElUVE5PVElGWV9WT0lEKGNsb2NrX2RvbWFpbl9yZXNldCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciBJVFROT1RJRllfTkFNRShjbG9ja19kb21haW5fcmVzZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQoKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLiBUaGlzIGVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpZmV0aW1lIG9mCisgKiBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHRyYWNlLiBPbmNlIHRoaXMgbGlmZXRpbWUgc3RhcnRzLCB0aGUgSUQgY2FuIGJlIHVzZWQgdG8KKyAqIHRhZyBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzIGluIGNhbGxzIHN1Y2ggYXMgX19pdHRfdGFza19iZWdpbiwgYW5kIHRvIHNwZWNpZnkgcmVsYXRpb25zaGlwcyBhbW9uZworICogaWRlbnRpZmllZCBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzLCB1c2luZyB0aGUgXHJlZiByZWxhdGlvbnMgQVBJcy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBjcmVhdGUuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2NyZWF0ZV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlbmRzIHRoZSBsaWZldGltZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUKKyAqIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4gQW55IHJlbGF0aW9uc2hpcHMgdGhhdCBhcmUgZXN0YWJsaXNoZWQgYWZ0ZXIgdGhpcyBsaWZldGltZSBlbmRzIGFyZQorICogaW52YWxpZC4gVGhpcyBjYWxsIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZ2l2ZW4gSUQgdmFsdWUgY2FuIGJlIHJldXNlZCBmb3IgYSBkaWZmZXJlbnQKKyAqIG5hbWVkIGVudGl0eSBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBkZXN0cm95LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9kZXN0cm95X2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGVfZXgsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkLHgseSx6KSAgSVRUTk9USUZZX1ZPSURfRDMoaWRfY3JlYXRlX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgICAgSVRUTk9USUZZX05BTUUoaWRfY3JlYXRlX2V4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4KGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKGlkX2Rlc3Ryb3lfZXgsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgICAgICBJVFROT1RJRllfTkFNRShpZF9kZXN0cm95X2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGQseCx5LHosYSxiKSAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9leCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkLHgseSx6LGEsYikgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2ZuX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4X3B0ciAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4KGQseCx5KSAgICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDIodGFza19lbmRfZXgsZCx4LHkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIGZvciB0aGlzIG1hcmtlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tYXJrZXJfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGQseCx5LHosYSxiKSAgICBJVFROT1RJRllfVk9JRF9ENShtYXJrZXJfZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLG5hbWUsc2NvcGUpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChyZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkLHgseSx6LGEsYikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDUocmVsYXRpb25fYWRkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1lLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxoZWFkLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfZ3JvdXBfdHlwZQoreworICAgIF9faXR0X3RyYWNrX2dyb3VwX3R5cGVfbm9ybWFsID0gMAorfSBfX2l0dF90cmFja19ncm91cF90eXBlOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90cmFja19ncm91cAoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWU7ICAgICAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgc3RydWN0IF9fX2l0dF90cmFjayogdHJhY2s7ICAgIC8qITwgTGlzdCBvZiBjaGlsZCB0cmFja3MgICAgKi8KKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlIHRndHlwZTsgLyohPCBUeXBlIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIGludCAgIGV4dHJhMTsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrX2dyb3VwKiBuZXh0OworfSBfX2l0dF90cmFja19ncm91cDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBQbGFjZWhvbGRlciBmb3IgY3VzdG9tIHRyYWNrIHR5cGVzLiBDdXJyZW50bHksICJub3JtYWwiIGN1c3RvbSB0cmFjaworICogaXMgdGhlIG9ubHkgYXZhaWxhYmxlIHRyYWNrIHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfdHlwZQoreworICAgIF9faXR0X3RyYWNrX3R5cGVfbm9ybWFsID0gMAorI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorICAgICwgX19pdHRfdHJhY2tfdHlwZV9xdWV1ZQorI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLworfSBfX2l0dF90cmFja190eXBlOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2sKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXAqIGdyb3VwOyAgLyohPCBQYXJlbnQgZ3JvdXAgdG8gYSB0cmFjayAqLworICAgIF9faXR0X3RyYWNrX3R5cGUgdHR5cGU7ICAgIC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgICAgICAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIG5leHQ7Cit9IF9faXR0X3RyYWNrOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrIGdyb3VwLgorICovCitfX2l0dF90cmFja19ncm91cCogSVRUQVBJIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrX2dyb3VwKiwgdHJhY2tfZ3JvdXBfY3JlYXRlLCAoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19ncm91cF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlKG5hbWUpICAoX19pdHRfdHJhY2tfZ3JvdXAqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrLgorICovCitfX2l0dF90cmFjayogSVRUQVBJIF9faXR0X3RyYWNrX2NyZWF0ZShfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdHJhY2sqLCB0cmFja19jcmVhdGUsIChfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfdHlwZSB0cmFja190eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlKHRyYWNrX2dyb3VwLG5hbWUsdHJhY2tfdHlwZSkgIChfX2l0dF90cmFjayopMAorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBsb2dpY2FsIHRyYWNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zZXRfdHJhY2soX19pdHRfdHJhY2sqIHRyYWNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc2V0X3RyYWNrLCAoX19pdHRfdHJhY2sgKnRyYWNrKSkKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrICAgICBJVFROT1RJRllfVk9JRChzZXRfdHJhY2spCisjZGVmaW5lIF9faXR0X3NldF90cmFja19wdHIgSVRUTk9USUZZX05BTUUoc2V0X3RyYWNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrKHRyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKy8qKgorICogQGRlZmdyb3VwIGV2ZW50cyBFdmVudHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRXZlbnRzIGdyb3VwCisgKiBAeworICovCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBldmVudHMgZ3JvdXAgKi8KKworCisvKioKKyAqIEBkZWZncm91cCBhcnJheXMgQXJyYXlzIFZpc3VhbGl6ZXIKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVmlzdWFsaXplIGFycmF5cworICogQHsKKyAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X2F2X2RhdGFfdHlwZQorICogQGJyaWVmIERlZmluZXMgdHlwZXMgb2YgYXJyYXlzIGRhdGEgKGZvciBDL0MrKyBpbnRyaW5zaWMgdHlwZXMpCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X2VfZmlyc3QgPSAwLAorICAgIF9faXR0X2VfY2hhciA9IDAsICAvKiAxLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWNoYXIsICAgICAvKiAxLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAqLworICAgIF9faXR0X2VfaW50MTYsICAgICAvKiAyLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWludDE2LCAgICAvKiAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAgKi8KKyAgICBfX2l0dF9lX2ludDMyLCAgICAgLyogNC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQzMiwgICAgLyogNC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDY0LCAgICAgLyogOC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQ2NCwgICAgLyogOC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2Zsb2F0LCAgICAgLyogNC1ieXRlIGZsb2F0aW5nICovCisgICAgX19pdHRfZV9kb3VibGUsICAgIC8qIDgtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfbGFzdCA9IF9faXR0X2VfZG91YmxlCit9IF9faXR0X2F2X2RhdGFfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZSBhbiBhcnJheSBkYXRhIHRvIGEgZmlsZS4KKyAqIE91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBjc3YgYW5kIGJtcCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgKGJtcCAtIGZvciAyLWRpbWVuc2lvbmFsIGFycmF5IG9ubHkpLgorICogQHBhcmFtW2luXSBkYXRhIC0gcG9pbnRlciB0byB0aGUgYXJyYXkgZGF0YQorICogQHBhcmFtW2luXSByYW5rIC0gdGhlIHJhbmsgb2YgdGhlIGFycmF5CisgKiBAcGFyYW1baW5dIGRpbWVuc2lvbnMgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzLCB3aGljaCBzcGVjaWZpZXMgdGhlIGFycmF5IGRpbWVuc2lvbnMuCisgKiBUaGUgc2l6ZSBvZiBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsKKyAqIEBwYXJhbVtpbl0gdHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBhcnJheSwgc3BlY2lmaWVkIGFzIG9uZSBvZiB0aGUgX19pdHRfYXZfZGF0YV90eXBlIHZhbHVlcyAoZm9yIGludHJpbnNpYyB0eXBlcykKKyAqIEBwYXJhbVtpbl0gZmlsZVBhdGggLSB0aGUgZmlsZSBwYXRoOyB0aGUgb3V0cHV0IGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbgorICogQHBhcmFtW2luXSBjb2x1bW5PcmRlciAtIGRlZmluZXMgaG93IHRoZSBhcnJheSBpcyBzdG9yZWQgaW4gdGhlIGxpbmVhciBtZW1vcnkuCisgKiBJdCBzaG91bGQgYmUgMSBmb3IgY29sdW1uLW1ham9yIG9yZGVyIChlLmcuIGluIEZPUlRSQU4pIG9yIDAgLSBmb3Igcm93LW1ham9yIG9yZGVyIChlLmcuIGluIEMpLgorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZUEodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlVyh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVXCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgX19pdHRfYXZfc2F2ZUEKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBfX2l0dF9hdl9zYXZlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmUodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIElUVE5PVElGWV9OQU1FKGF2X3NhdmVBKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlVyAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZVcpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUEobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKwordm9pZCBJVFRBUEkgX19pdHRfZW5hYmxlX2F0dGFjaCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZW5hYmxlX2F0dGFjaCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoICAgICBJVFROT1RJRllfVk9JRChlbmFibGVfYXR0YWNoKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciBJVFROT1RJRllfTkFNRShlbmFibGVfYXR0YWNoKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCgpCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqIEB9IGFycmF5cyBncm91cCAqLworCisvKiogQGVuZGNvbmQgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisKKyNpZm5kZWYgX0lUVE5PVElGWV9QUklWQVRFXworI2RlZmluZSBfSVRUTk9USUZZX1BSSVZBVEVfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzay4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgKmNhbm5vdCogYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2ssIG9yIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGQseCx5LHopICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9vdmVybGFwcGVkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGQseCx5LHosYSxiKSAgICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZCx4KSAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHRhc2tfZW5kX292ZXJsYXBwZWQsZCx4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4KGQseCx5LHopICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2VuZF9vdmVybGFwcGVkX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX292ZXJsYXBwZWRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCx0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbWFrcnNfaW50ZXJuYWwgTWFya3MKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBNYXJrcyBncm91cAorICogQHdhcm5pbmcgSW50ZXJuYWwgQVBJOgorICogICAtIEl0IGlzIG5vdCBzaGlwcGVkIHRvIG91dHNpZGUgb2YgSW50ZWwKKyAqICAgLSBJdCBpcyBkZWxpdmVyZWQgdG8gaW50ZXJuYWwgSW50ZWwgdGVhbXMgdXNpbmcgZS1tYWlsIG9yIFNWTiBhY2Nlc3Mgb25seQorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIG1hcmsgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfbWFya190eXBlOworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgdXNlciBtYXJrIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqIEBwYXJhbVtpbl0gbmFtZSAtIG5hbWUgb2YgbWFyayB0byBjcmVhdGUKKyAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbWFyayB0eXBlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZShuYW1lKSAgKF9faXR0X21hcmtfdHlwZSkwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhICJkaXNjcmV0ZSIgdXNlciBtYXJrIHR5cGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqCisgKiAtIFRoZSBtYXJrIG9mICJkaXNjcmV0ZSIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrIHNpZ24uCisgKiAtIFRoZSBjYWxsIGlzICJzeW5jaHJvbm91cyIgLSBmdW5jdGlvbiByZXR1cm5zIGFmdGVyIG1hcmsgaXMgYWN0dWFsbHkgYWRkZWQgdG8gcmVzdWx0cy4KKyAqIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBtYXJrIGRpZmZlcmVudCBwaGFzZXMgb2YgYXBwbGljYXRpb24KKyAqICAgKGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtYXJrIGF1dG9tYXRpY2FsbHkgbWVhbmQgZW5kIG9mIGN1cnJlbnQgcmVnaW9uKS4KKyAqIC0gQ2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAiY29udGludW91cyIgbWFya3MgKHNlZSBiZWxvdykgYXQgdGhlIHNhbWUgY29sbGVjdGlvbiBzZXNzaW9uCisgKiBAcGFyYW1baW5dIG10IC0gbWFyaywgY3JlYXRlZCBieSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lKSBmdW5jdGlvbgorICogQHBhcmFtW2luXSBwYXJhbWV0ZXIgLSBzdHJpbmcgcGFyYW1ldGVyIG9mIG1hcmsKKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtBKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKTsKK2ludCBJVFRBUEkgX19pdHRfbWFya1coX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrVworIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrQQorIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmssICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQSAgICAgSVRUTk9USUZZX0RBVEEobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrQSkKKyNkZWZpbmUgX19pdHRfbWFya1cgICAgIElUVE5PVElGWV9EQVRBKG1hcmtXKQorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgSVRUTk9USUZZX05BTUUobWFya1cpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFyayAgICAgIElUVE5PVElGWV9EQVRBKG1hcmspCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICBJVFROT1RJRllfTkFNRShtYXJrKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsobXQsIHBhcmFtZXRlcikgIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVXNlIHRoaXMgaWYgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhICJkaXNjcmV0ZSIgdXNlciBldmVudCB0eXBlIChtYXJrKSBmb3IgcHJvY2VzcworICogcmF0aGVyIHRoZW4gZm9yIG9uZSB0aHJlYWQKKyAqIEBzZWUgaW50IF9faXR0X21hcmsoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyKiBwYXJhbWV0ZXIpOworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsVyhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICBfX2l0dF9tYXJrX2dsb2JhbFcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgX19pdHRfbWFya19nbG9iYWxXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxBCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWwoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQSAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxBKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbFcpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWxXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWwpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWwpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFcobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGFuICJlbmQiIHBvaW50IGZvciAiY29udGludW91cyIgbWFyayB3aXRoIHNwZWNpZmllZCBuYW1lLgorICoKKyAqIC0gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICogICBBbHNvIHJldHVybnMgbm9uLXplcm8gdmFsdWUgd2hlbiBwcmVjZWRpbmcgImJlZ2luIiBwb2ludCBmb3IgdGhlCisgKiAgIG1hcmsgd2l0aCB0aGUgc2FtZSBuYW1lIGZhaWxlZCB0byBiZSBjcmVhdGVkIG9yIG5vdCBjcmVhdGVkLgorICogLSBUaGUgbWFyayBvZiAiY29udGludW91cyIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluCisgKiAgIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrCisgKiAgIHNpZ24gKGRpZmZlcmVudCBmcm9tICJkaXNjcmV0ZSIgbWFyaykgdG9nZXRoZXIgd2l0aCBsaW5lIGZyb20KKyAqICAgY29ycmVzcG9uZGluZyAiYmVnaW4iIG1hcmsgdG8gImVuZCIgbWFyay4KKyAqIEBub3RlIENvbnRpbnVvdXMgbWFya3MgY2FuIG92ZXJsYXAgYW5kIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci4KKyAqIERpc2NyZXRlIG1hcmsgY2FuIGJlIG5lc3RlZCBpbnNpZGUgbWFya2VkIHJlZ2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmICAgICBJVFROT1RJRllfREFUQShtYXJrX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfb2ZmKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYW4gImVuZCIgcG9pbnQgZm9yIG1hcmsgb2YgcHJvY2VzcworICogQHNlZSBpbnQgX19pdHRfbWFya19vZmYoX19pdHRfbWFya190eXBlIG10KTsKKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYoX19pdHRfbWFya190eXBlIG10KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxfb2ZmKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZihtdCkgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1hcmtzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzX2ludGVybmFsIENvdW50ZXJzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogQ291bnRlcnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NvdW50ZXIgKl9faXR0X2NvdW50ZXI7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGNvdW50ZXIgd2l0aCBnaXZlbiBuYW1lL2RvbWFpbiBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisgKgorICogQWZ0ZXIgX19pdHRfY291bnRlcl9jcmVhdGUoKSBpcyBjYWxsZWQsIF9faXR0X2NvdW50ZXJfaW5jKCkgLyBfX2l0dF9jb3VudGVyX2luY19kZWx0YSgpIGNhbiBiZSB1c2VkCisgKiB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgb24gYW55IHRocmVhZAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGNvdW50ZXIgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X2NvdW50ZXJfY3JlYXRlKCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9kZXN0cm95KF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2Rlc3Ryb3ksIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChjb3VudGVyX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95KGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgSW5jcmVtZW50IHRoZSBjb3VudGVyIHZhbHVlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jKF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgKF9faXR0X2NvdW50ZXIgaWQpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmMpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luYykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jKGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZSB3aXRoIHgKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGEoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmNfZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKGlkLCB2YWx1ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN0aXRjaCBTdGFjayBTdGl0Y2hpbmcKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBTdGFjayBTdGl0Y2hpbmcgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NhbGxlciAqX19pdHRfY2FsbGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgdGhlIHN0aXRjaCBwb2ludCBlLmcuIGEgcG9pbnQgaW4gY2FsbCBzdGFjayB3aGVyZSBvdGhlciBzdGFja3Mgc2hvdWxkIGJlIHN0aXRjaGVkIHRvLgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIG1hdGNoIHRoZSBjdXQgcG9pbnRzIHdpdGggY29ycmVzcG9uZGluZyBzdGl0Y2ggcG9pbnRzLgorICovCitfX2l0dF9jYWxsZXIgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkgKF9faXR0X2NhbGxlcikwCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGluZm9yYW10aW9uIGFib3V0IHN0aXRjaCBwb2ludCBpZGVudGlmaWVkIGJ5IHRoZSBwb2ludGVyIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3kgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVyX2Rlc3Ryb3kpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTZXRzIHRoZSBjdXQgcG9pbnQuIFN0YWNrIGZyb20gZWFjaCBldmVudCB3aGljaCBvY2N1cnMgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUgY3V0CisgKiBhdCB0aGUgc2FtZSBzdGFjayBsZXZlbCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBhbmQgc3RpdGNoZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfZW50ZXIpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2VudGVyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBlbGltaW5hdGVzIHRoZSBjdXQgcG9pbnQgd2hpY2ggd2FzIHNldCBieSBsYXRlc3QgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCkuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsIChfX2l0dF9jYWxsZXIgaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlZV9sZWF2ZSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZWVfbGVhdmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gc3RpdGNoIGdyb3VwICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19pdHRfZXJyb3JfY29kZQoreworICAgIF9faXR0X2Vycm9yX3N1Y2Nlc3MgICAgICAgPSAwLCAvKiE8IG5vIGVycm9yICovCisgICAgX19pdHRfZXJyb3Jfbm9fbW9kdWxlICAgICA9IDEsIC8qITwgbW9kdWxlIGNhbid0IGJlIGxvYWRlZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lOyB3aW46ICUyJGQgLS0gc3lzdGVtIGVycm9yIGNvZGU7IHVueDogJTIkcyAtLSBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9ub19zeW1ib2wgICAgID0gMiwgLyohPCBzeW1ib2wgbm90IGZvdW5kICovCisgICAgLyogJTEkcyAtLSBsaWJyYXJ5IG5hbWUsICUyJHMgLS0gc3ltYm9sIG5hbWUuICovCisgICAgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cCA9IDMsIC8qITwgdW5rbm93biBncm91cCBzcGVjaWZpZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkcyAtLSBncm91cCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYgPSA0LCAvKiE8IEdldEVudmlyb25tZW50VmFyaWFibGUoKSBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBzeXN0ZW0gZXJyb3IuICovCisgICAgX19pdHRfZXJyb3JfZW52X3Rvb19sb25nICA9IDUsIC8qITwgdmFyaWFibGUgdmFsdWUgdG9vIGxvbmcgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSB2YXIsICUzJGQgLS0gbWF4IGFsbG93ZWQgbGVuZ3RoLiAqLworICAgIF9faXR0X2Vycm9yX3N5c3RlbSAgICAgICAgPSA2ICAvKiE8IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgb3IgcHRocmVhZF9tdXRleF9pbml0IGZhaWxlZCAqLworICAgIC8qICUxJHMgLS0gZnVuY3Rpb24gbmFtZSwgJTIkZCAtLSBlcnJuby4gKi8KK30gX19pdHRfZXJyb3JfY29kZTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9lcnJvcl9oYW5kbGVyX3QpKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCk7CitfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIF9faXR0X3NldF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopOworCitjb25zdCBjaGFyKiBJVFRBUEkgX19pdHRfYXBpX3ZlcnNpb24odm9pZCk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2RlZmluZSBfX2l0dF9lcnJvcl9oYW5kbGVyIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsIGVycm9yX2hhbmRsZXIpCit2b2lkIF9faXR0X2Vycm9yX2hhbmRsZXIoX19pdHRfZXJyb3JfY29kZSBjb2RlLCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIGNvbnN0IGludCBJVFROT1RJRllfTkFNRShlcnIpOworI2RlZmluZSBfX2l0dF9lcnIgSVRUTk9USUZZX05BTUUoZXJyKQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24gICAgIElUVE5PVElGWV9EQVRBKGFwaV92ZXJzaW9uKQorI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgSVRUTk9USUZZX05BTUUoYXBpX3ZlcnNpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbigpICAgKGNvbnN0IGNoYXIqKTAKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9QUklWQVRFXyAqLworCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFICovCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaApAQCAtMCwwICsxLDQ1OSBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfQ09ORklHX0hfCisjZGVmaW5lIF9JVFROT1RJRllfQ09ORklHX0hfCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJVFRfT1NfV0lOCisjICBkZWZpbmUgSVRUX09TX1dJTiAgIDEKKyNlbmRpZiAvKiBJVFRfT1NfV0lOICovCisKKyNpZm5kZWYgSVRUX09TX0xJTlVYCisjICBkZWZpbmUgSVRUX09TX0xJTlVYIDIKKyNlbmRpZiAvKiBJVFRfT1NfTElOVVggKi8KKworI2lmbmRlZiBJVFRfT1NfTUFDCisjICBkZWZpbmUgSVRUX09TX01BQyAgIDMKKyNlbmRpZiAvKiBJVFRfT1NfTUFDICovCisKKyNpZm5kZWYgSVRUX09TCisjICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX1dJTgorIyAgZWxpZiBkZWZpbmVkKCBfX0FQUExFX18gKSAmJiBkZWZpbmVkKCBfX01BQ0hfXyApCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19MSU5VWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfT1MgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fV0lOCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1dJTiAxCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9QT1NJWAorIyAgZGVmaW5lIElUVF9QTEFURk9STV9QT1NJWCAyCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1BPU0lYICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX01BQworIyAgZGVmaW5lIElUVF9QTEFURk9STV9NQUMgMworI2VuZGlmIC8qIElUVF9QTEFURk9STV9NQUMgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk0KKyMgIGlmIElUVF9PUz09SVRUX09TX1dJTgorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9XSU4KKyMgIGVsaWYgSVRUX09TPT1JVFRfT1NfTUFDCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9QT1NJWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk0gKi8KKworI2lmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKFVOSUNPREUpCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgQ0RFQ0wKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgQ0RFQ0wgX19jZGVjbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBDREVDTCAvKiBhY3R1YWwgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogQ0RFQ0wgKi8KKworI2lmbmRlZiBTVERDQUxMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBTVERDQUxMIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBTVERDQUxMIC8qIHN1cHBvcnRlZCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBTVERDQUxMICovCisKKyNkZWZpbmUgSVRUQVBJICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSSBDREVDTAorCisvKiBUT0RPOiBUZW1wb3JhcnkgZm9yIGNvbXBhdGliaWxpdHkhICovCisjZGVmaW5lIElUVEFQSV9DQUxMICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSV9DQUxMIENERUNMCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKy8qIHVzZSBfX2ZvcmNlaW5saW5lIChWQysrIHNwZWNpZmljKSAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBfX2ZvcmNlaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIC8qIG5vdGhpbmcgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qCisgKiBHZW5lcmFsbHksIGZ1bmN0aW9ucyBhcmUgbm90IGlubGluZWQgdW5sZXNzIG9wdGltaXphdGlvbiBpcyBzcGVjaWZpZWQuCisgKiBGb3IgZnVuY3Rpb25zIGRlY2xhcmVkIGlubGluZSwgdGhpcyBhdHRyaWJ1dGUgaW5saW5lcyB0aGUgZnVuY3Rpb24gZXZlbgorICogaWYgbm8gb3B0aW1pemF0aW9uIGxldmVsIHdhcyBzcGVjaWZpZWQuCisgKi8KKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljCisjZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZiAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisjaWZuZGVmIElUVF9BUkNIX0FSTQorIyAgZGVmaW5lIElUVF9BUkNIX0FSTSAgNAorI2VuZGlmIC8qIElUVF9BUkNIX0FSTSAqLworCisjaWZuZGVmIElUVF9BUkNICisjICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMgorIyAgZWxpZiBkZWZpbmVkIF9NX1g2NCB8fCBkZWZpbmVkIF9NX0FNRDY0IHx8IGRlZmluZWQgX194ODZfNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMkUKKyMgIGVsaWYgZGVmaW5lZCBfTV9JQTY0IHx8IGRlZmluZWQgX19pYTY0X18KKyMgICAgZGVmaW5lIElUVF9BUkNIIElUVF9BUkNIX0lBNjQKKyMgIGVsaWYgZGVmaW5lZCBfTV9BUk0gfHwgX19hcm1fXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQVJNCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIElUVF9FWFRFUk5fQyBleHRlcm4gIkMiCisjZWxzZQorIyAgZGVmaW5lIElUVF9FWFRFUk5fQyAvKiBub3RoaW5nICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBJVFRfVE9fU1RSX0FVWCh4KSAjeAorI2RlZmluZSBJVFRfVE9fU1RSKHgpICAgICBJVFRfVE9fU1RSX0FVWCh4KQorCisjZGVmaW5lIF9fSVRUX0JVSUxEX0FTU0VSVChleHByLCBzdWZmaXgpIGRvIHsgXAorICAgIHN0YXRpYyBjaGFyIF9faXR0X2J1aWxkX2NoZWNrXyMjc3VmZml4WyhleHByKSA/IDEgOiAtMV07IFwKKyAgICBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFswXSA9IDA7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSAgX19JVFRfQlVJTERfQVNTRVJUKChleHByKSwgc3VmZml4KQorI2RlZmluZSBJVFRfQlVJTERfQVNTRVJUKGV4cHIpICAgICAgICAgICBfSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIF9fTElORV9fKQorCisjZGVmaW5lIElUVF9NQUdJQyB7IDB4RUQsIDB4QUIsIDB4QUIsIDB4RUMsIDB4MEQsIDB4RUUsIDB4REEsIDB4MzAgfQorCisvKiBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLiAqLworI2RlZmluZSBBUElfVkVSU0lPTl9CVUlMRCAgICAyMDExMTExMQorCisjaWZuZGVmIEFQSV9WRVJTSU9OX05VTQorI2RlZmluZSBBUElfVkVSU0lPTl9OVU0gMC4wLjAKKyNlbmRpZiAvKiBBUElfVkVSU0lPTl9OVU0gKi8KKworI2RlZmluZSBBUElfVkVSU0lPTiAiSVRULUFQSS1WZXJzaW9uICIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9OVU0pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiBJVFRfVE9fU1RSKEFQSV9WRVJTSU9OX0JVSUxEKSAiKSIKKworLyogT1MgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhNT0RVTEUgICAgICAgICAgIGxpYl90OwordHlwZWRlZiBEV09SRCAgICAgICAgICAgICBUSURUOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OICBtdXRleF90OworI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFUiB7IDAgfQorI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSAvKiBlbXB0eSBmb3IgV2luZG93cyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGRsZmNuLmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICovCisjZW5kaWYgLyogX0dOVV9TT1VSQ0UgKi8KKyNpZm5kZWYgX19VU0VfVU5JWDk4CisjZGVmaW5lIF9fVVNFX1VOSVg5OCAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBvbiBTTEVTMTEuMSB3aXRoIGdjYyA0LjMuNCB3aGVyZWluIHB0aHJlYWQuaCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gX19VU0VfWE9QRU4ySzggKi8KKyNlbmRpZiAvKl9fVVNFX1VOSVg5OCovCisjaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgcHRocmVhZF90ICAgICAgICAgVElEVDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90ICAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBHZXRQcm9jQWRkcmVzcyhsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBMb2FkTGlicmFyeUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBGcmVlTGlicmFyeShoYW5kbGUpCisjZGVmaW5lIF9faXR0X3N5c3RlbV9lcnJvcigpICAgICAgKGludClHZXRMYXN0RXJyb3IoKQorI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIGxzdHJjbXBBKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBsc3RybGVuQShzKQorI2RlZmluZSBfX2l0dF9mc3RyY3B5bihzMSwgczIsIGwpIGxzdHJjcHluQShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgX3N0cmR1cChzKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWQoKSAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZGVmaW5lIF9faXR0X3RocmVhZF95aWVsZCgpICAgICAgU3dpdGNoVG9UaHJlYWQoKQorI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKTsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9nZXRfcHJvYyhsaWIsIG5hbWUpIGRsc3ltKGxpYiwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfaW5pdChtdXRleCkgICB7XAorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4X2F0dHIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcl9jb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhfYXR0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleF9pbml0IiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBfX2l0dF9tdXRleF9sb2NrKG11dGV4KSAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBkbG9wZW4obmFtZSwgUlRMRF9MQVpZKQorI2RlZmluZSBfX2l0dF91bmxvYWRfbGliKGhhbmRsZSkgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIGVycm5vCisjZGVmaW5lIF9faXR0X2ZzdHJjbXAoczEsIHMyKSAgICAgc3RyY21wKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBzdHJsZW4ocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBzdHJuY3B5KHMxLCBzMiwgbCkKKyNkZWZpbmUgX19pdHRfZnN0cmR1cChzKSAgICAgICAgICBzdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBwdGhyZWFkX3NlbGYoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIHNjaGVkX3lpZWxkKCkKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NAorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX2ZldGNoYWRkNF9hY3EoKHZvaWQgKilhZGRyLCB2YWwpCisjZWxzZSAgLyogX19JTlRFTF9DT01QSUxFUiAqLworLyogVE9ETzogQWRkIFN1cHBvcnQgZm9yIG5vdCBJbnRlbCBjb21waWxlcnMgZm9yIElBLTY0IGFyY2hpdGVjdHVyZSAqLworI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyRSAvKiBJVFRfQVJDSCE9SVRUX0FSQ0hfSUE2NCAqLworSVRUX0lOTElORSBsb25nCitfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKQoreworICAgIGxvbmcgcmVzdWx0OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrXG54YWRkICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIocmVzdWx0KSwiPW0iKCooaW50KilwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKGFkZGVuZCksICJtIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VsaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTQorI2RlZmluZSBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNChhZGRyLCB2YWwpIF9fc3luY19mZXRjaF9hbmRfYWRkKGFkZHIsIHZhbCkKKyNlbmRpZiAvKiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NCAqLworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gX19UQkJfbWFjaGluZV9mZXRjaGFkZDQocHRyLCAxKSArIDFMOworfQorI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsID0gMCwKKyAgICBfX2l0dF9jb2xsZWN0aW9uX3BhdXNlZCA9IDEKK30gX19pdHRfY29sbGVjdGlvbl9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF90aHJlYWRfbm9ybWFsICA9IDAsCisgICAgX19pdHRfdGhyZWFkX2lnbm9yZWQgPSAxCit9IF9faXR0X3RocmVhZF9zdGF0ZTsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90aHJlYWRfaW5mbworeworICAgIGNvbnN0IGNoYXIqIG5hbWVBOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBBU0NJSS4gKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgY29uc3Qgd2NoYXJfdCogbmFtZVc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIFVOSUNPREUuICovCisjZWxzZSAgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIHZvaWQqIG5hbWVXOworI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICBUSURUICAgICAgICAgICAgICAgdGlkOworICAgIF9faXR0X3RocmVhZF9zdGF0ZSBzdGF0ZTsgICAvKiE8IFRocmVhZCBzdGF0ZSAocGF1c2VkIG9yIG5vcm1hbCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgZXh0cmExOyAgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHZvaWQqICAgICAgICAgICAgICBleHRyYTI7ICAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgc3RydWN0IF9fX2l0dF90aHJlYWRfaW5mbyogbmV4dDsKK30gX19pdHRfdGhyZWFkX2luZm87CisKKyNpbmNsdWRlICJpdHRub3RpZnlfdHlwZXMuaCIgLyogRm9yIF9faXR0X2dyb3VwX2lkIGRlZmluaXRpb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2FwaV9pbmZvXzIwMTAxMDAxCit7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKKyAgICB2b2lkKiogICAgICAgICBmdW5jX3B0cjsKKyAgICB2b2lkKiAgICAgICAgICBpbml0X2Z1bmM7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXA7Cit9ICBfX2l0dF9hcGlfaW5mb18yMDEwMTAwMTsKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2FwaV9pbmZvCit7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKKyAgICB2b2lkKiogICAgICAgICBmdW5jX3B0cjsKKyAgICB2b2lkKiAgICAgICAgICBpbml0X2Z1bmM7CisgICAgdm9pZCogICAgICAgICAgbnVsbF9mdW5jOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwOworfSAgX19pdHRfYXBpX2luZm87CisKK3N0cnVjdCBfX19pdHRfZG9tYWluOworc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlOworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ2xvYmFsCit7CisgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBtYWdpY1s4XTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fbWFqb3I7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX21pbm9yOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9idWlsZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIGFwaV9pbml0aWFsaXplZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIG11dGV4X2luaXRpYWxpemVkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgYXRvbWljX2NvdW50ZXI7CisgICAgbXV0ZXhfdCAgICAgICAgICAgICAgICBtdXRleDsKKyAgICBsaWJfdCAgICAgICAgICAgICAgICAgIGxpYjsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXI7CisgICAgY29uc3QgY2hhcioqICAgICAgICAgICBkbGxfcGF0aF9wdHI7CisgICAgX19pdHRfYXBpX2luZm8qICAgICAgICBhcGlfbGlzdF9wdHI7CisgICAgc3RydWN0IF9fX2l0dF9nbG9iYWwqICBuZXh0OworICAgIC8qIEpvaW5hYmxlIHN0cnVjdHVyZXMgYmVsb3cgKi8KKyAgICBfX2l0dF90aHJlYWRfaW5mbyogICAgIHRocmVhZF9saXN0OworICAgIHN0cnVjdCBfX19pdHRfZG9tYWluKiAgZG9tYWluX2xpc3Q7CisgICAgc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlKiBzdHJpbmdfbGlzdDsKKyAgICBfX2l0dF9jb2xsZWN0aW9uX3N0YXRlIHN0YXRlOworfSBfX2l0dF9nbG9iYWw7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNkZWZpbmUgTkVXX1RIUkVBRF9JTkZPX1coZ3B0cixoLGhfdGFpbCx0LHMsbikgeyBcCisgICAgaCA9IChfX2l0dF90aHJlYWRfaW5mbyopbWFsbG9jKHNpemVvZihfX2l0dF90aHJlYWRfaW5mbykpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnRpZCAgICA9IHQ7IFwKKyAgICAgICAgaC0+bmFtZUEgID0gTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBuID8gX3djc2R1cChuKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+c3RhdGUgID0gczsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+dGhyZWFkX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19USFJFQURfSU5GT19BKGdwdHIsaCxoX3RhaWwsdCxzLG4pIHsgXAorICAgIGggPSAoX19pdHRfdGhyZWFkX2luZm8qKW1hbGxvYyhzaXplb2YoX19pdHRfdGhyZWFkX2luZm8pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT50aWQgICAgPSB0OyBcCisgICAgICAgIGgtPm5hbWVBICA9IG4gPyBfX2l0dF9mc3RyZHVwKG4pIDogTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBOVUxMOyBcCisgICAgICAgIGgtPnN0YXRlICA9IHM7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnRocmVhZF9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfRE9NQUlOX1coZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X2RvbWFpbiopbWFsbG9jKHNpemVvZihfX2l0dF9kb21haW4pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5mbGFncyAgPSAwOyAgICAvKiBkb21haW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLyBcCisgICAgICAgIGgtPm5hbWVBICA9IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5kb21haW5fbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX0RPTUFJTl9BKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9kb21haW4qKW1hbGxvYyhzaXplb2YoX19pdHRfZG9tYWluKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+ZmxhZ3MgID0gMDsgICAgLyogZG9tYWluIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8gXAorICAgICAgICBoLT5uYW1lQSAgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+ZG9tYWluX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19TVFJJTkdfSEFORExFX1coZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X3N0cmluZ19oYW5kbGUqKW1hbGxvYyhzaXplb2YoX19pdHRfc3RyaW5nX2hhbmRsZSkpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnN0ckEgICA9IE5VTEw7IFwKKyAgICAgICAgaC0+c3RyVyAgID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5zdHJpbmdfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1NUUklOR19IQU5ETEVfQShncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfc3RyaW5nX2hhbmRsZSopbWFsbG9jKHNpemVvZihfX2l0dF9zdHJpbmdfaGFuZGxlKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+c3RyQSAgID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPnN0clcgICA9IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnN0cmluZ19saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2VuZGlmIC8qIF9JVFROT1RJRllfQ09ORklHX0hfICovCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjVmNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYwpAQCAtMCwwICsxLDk0MyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIFBBVEhfTUFYIDUxMgorI2Vsc2UgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgSU5URUxfTk9fTUFDUk9fQk9EWQorI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpbmNsdWRlICJkaXNhYmxlX3dhcm5pbmdzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGFwaV92ZXJzaW9uW10gPSBBUElfVkVSU0lPTiAiXDBcbkAoIykgJFJldmlzaW9uOiA0Mjc1NCAkXG4iOworCisjZGVmaW5lIF9OXyhuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisKKyNpZiBJVFRfT1M9PUlUVF9PU19XSU4KK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmRsbCI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19MSU5VWAorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuc28iOworI2VsaWYgSVRUX09TPT1JVFRfT1NfTUFDCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5keWxpYiI7CisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIG9yIHVua25vd24gT1MuCisjZW5kaWYKKworI2lmZGVmIF9fQU5EUk9JRF9fCisvKiBkZWZhdWx0IGxvY2F0aW9uIG9mIHVzZXJhcGkgY29sbGVjdG9yIG9uIEFuZHJvaWQgKi8KKyNkZWZpbmUgQU5EUk9JRF9JVFROT1RJRllfREVGQVVMVF9QQVRIICAiL2RhdGEvZGF0YS9jb20uaW50ZWwudnR1bmUvaW50ZWwvbGliaXR0bm90aWZ5LnNvIgorI2VuZGlmCisKKworI2lmbmRlZiBMSUJfVkFSX05BTUUKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMgorI2RlZmluZSBMSUJfVkFSX05BTUUgSU5URUxfTElCSVRUTk9USUZZMzIKKyNlbHNlCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlk2NAorI2VuZGlmCisjZW5kaWYgLyogTElCX1ZBUl9OQU1FICovCisKKyNkZWZpbmUgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0socCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFwLm11dGV4X2luaXRpYWxpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQoJnAuYXRvbWljX2NvdW50ZXIpID09IDEpIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9tdXRleF9pbml0KCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwLm11dGV4X2luaXRpYWxpemVkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfdGhyZWFkX3lpZWxkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfbXV0ZXhfbG9jaygmcC5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworY29uc3QgaW50IF9OXyhlcnIpID0gMDsKKwordHlwZWRlZiBpbnQgKF9faXR0X2luaXRfaXR0bGliX3QpKGNvbnN0IGNoYXIqLCBfX2l0dF9ncm91cF9pZCk7CisKKy8qIHRoaXMgZGVmaW5lIHVzZWQgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9pbml0X2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0MgaW50IF9OXyhpbml0X2l0dGxpYikoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKK3N0YXRpYyBfX2l0dF9pbml0X2l0dGxpYl90KiBfX2l0dF9pbml0X2l0dGxpYl9wdHIgPSBfTl8oaW5pdF9pdHRsaWIpOworI2RlZmluZSBfX2l0dF9pbml0X2l0dGxpYl9uYW1lIF9faXR0X2luaXRfaXR0bGliX3B0cgorI2VuZGlmIC8qIF9faXR0X2luaXRfaXR0bGliX25hbWUgKi8KKwordHlwZWRlZiB2b2lkIChfX2l0dF9maW5pX2l0dGxpYl90KSh2b2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGZpbmFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZmluaV9pdHRsaWIpKHZvaWQpOworc3RhdGljIF9faXR0X2ZpbmlfaXR0bGliX3QqIF9faXR0X2ZpbmlfaXR0bGliX3B0ciA9IF9OXyhmaW5pX2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2ZpbmlfaXR0bGliX25hbWUgX19pdHRfZmluaV9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfZmluaV9pdHRsaWJfbmFtZSAqLworCisvKiBidWlsZGluZyBwb2ludGVycyB0byBpbXBvcnRlZCBmdW5jcyAqLworI3VuZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0MgSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3MgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsgICAgICAgICAgICAgXAorICAgIGlmIChJVFROT1RJRllfTkFNRShuYW1lKSAmJiBJVFROT1RJRllfTkFNRShuYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSkgXAorICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUobmFtZSkgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKHR5cGUpMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0MgSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3MgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsgICAgICAgICAgICAgXAorICAgIGlmIChJVFROT1RJRllfTkFNRShuYW1lKSAmJiBJVFROT1RJRllfTkFNRShuYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSkgXAorICAgICAgICBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0MgSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsKKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7CisKKyNkZWZpbmUgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKK0lUVF9HUk9VUF9MSVNUKGdyb3VwX2xpc3QpOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dyb3VwX2FsaWFzCit7CisgICAgY29uc3QgY2hhciogICAgZW52X3ZhcjsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7Cit9IF9faXR0X2dyb3VwX2FsaWFzOworCitzdGF0aWMgX19pdHRfZ3JvdXBfYWxpYXMgZ3JvdXBfYWxpYXNbXSA9IHsKKyAgICB7ICJLTVBfRk9SX1RQUk9GSUxFIiwgKF9faXR0X2dyb3VwX2lkKShfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfc3luYyAgfCBfX2l0dF9ncm91cF9tYXJrKSB9LAorICAgIHsgIktNUF9GT1JfVENIRUNLIiwgICAoX19pdHRfZ3JvdXBfaWQpKF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9zeW5jICB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX3N1cHByZXNzKSB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgICAoX19pdHRfZ3JvdXBfbm9uZSkgfSwKKyAgICB7IGFwaV92ZXJzaW9uLCAgICAgICAgKF9faXR0X2dyb3VwX25vbmUpIH0gLyogISEhIEp1c3QgdG8gYXZvaWQgdW51c2VkIGNvZGUgZWxpbWluYXRpb24gISEhICovCit9OworCisjcHJhZ21hIHBhY2socG9wKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIF9faXR0X2FwaV9pbmZvIGFwaV9saXN0W10gPSB7CisvKiBEZWZpbmUgZnVuY3Rpb25zIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxuYW1laW5kbGwsZ3JvdXAsZm9ybWF0KSB7IElUVF9UT19TVFIoSVRUX0pPSU4oX19pdHRfLG5hbWVpbmRsbCkpLCAodm9pZCoqKSh2b2lkKikmSVRUTk9USUZZX05BTUUobmFtZSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCAoX19pdHRfZ3JvdXBfaWQpKGdyb3VwKX0sCisjZGVmaW5lIElUVF9TVFVCViBJVFRfU1RVQgorI2RlZmluZSBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKy8qIERlZmluZSBmdW5jdGlvbnMgd2l0aG91dCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLG5hbWVpbmRsbCxncm91cCxmb3JtYXQpIHtJVFRfVE9fU1RSKElUVF9KT0lOKF9faXR0XyxuYW1laW5kbGwpKSwgKHZvaWQqKikodm9pZCopJklUVE5PVElGWV9OQU1FKG5hbWUpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksIE5VTEwsIChfX2l0dF9ncm91cF9pZCkoZ3JvdXApfSwKKyNkZWZpbmUgSVRUX1NUVUJWIElUVF9TVFVCCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBfX2l0dF9ncm91cF9ub25lfQorfTsKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyogcHJpdmF0ZSwgaW5pdCB0aHJlYWQgaW5mbyBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X3RocmVhZF9pbmZvIGluaXRfdGhyZWFkX2luZm8gPSB7CisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZUEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpZCAqLworICAgIF9faXR0X3RocmVhZF9ub3JtYWwsICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X3RocmVhZF9pbmZvKilOVUxMICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworLyogcHJpdmF0ZSwgTlVMTCBkb21haW4gaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF9kb21haW4gbnVsbF9kb21haW4gPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3M6ICBkaXNhYmxlZCBieSBkZWZhdWx0ICovCisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZUEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF9kb21haW4qKU5VTEwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKKy8qIHByaXZhdGUsIE5VTEwgc3RyaW5nIGhhbmRsZSBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUgbnVsbF9zdHJpbmdfaGFuZGxlID0geworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0ckEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogc3RyVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfc3RyaW5nX2hhbmRsZSopTlVMTCAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBkbGxfcGF0aFtQQVRIX01BWF0gPSB7IDAgfTsKKworLyogc3RhdGljIHBhcnQgZGVzY3JpcHRvciB3aGljaCBoYW5kbGVzLiBhbGwgbm90aWZpY2F0aW9uIGFwaSBhdHRyaWJ1dGVzLiAqLworX19pdHRfZ2xvYmFsIF9OXyhfaXR0YXBpX2dsb2JhbCkgPSB7CisgICAgSVRUX01BR0lDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZGVudGlmaWNhdGlvbiBpbmZvICovCisgICAgSVRUX01BSk9SLCBJVFRfTUlOT1IsIEFQSV9WRVJTSU9OX0JVSUxELCAgICAgICAvKiB2ZXJzaW9uIGluZm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFwaV9pbml0aWFsaXplZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXV0ZXhfaW5pdGlhbGl6ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF0b21pY19jb3VudGVyICovCisgICAgTVVURVhfSU5JVElBTElaRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRleCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBsaWJyYXJ5IGhhbmRsZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXJyb3JfaGFuZGxlciAqLworICAgIChjb25zdCBjaGFyKiopJmRsbF9wYXRoLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGxsX3BhdGhfcHRyICovCisgICAgKF9faXR0X2FwaV9pbmZvKikmYXBpX2xpc3QsICAgICAgICAgICAgICAgICAgICAvKiBhcGlfbGlzdF9wdHIgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgX19pdHRfZ2xvYmFsICovCisgICAgKF9faXR0X3RocmVhZF9pbmZvKikmaW5pdF90aHJlYWRfaW5mbywgICAgICAgICAvKiB0aHJlYWRfbGlzdCAqLworICAgIChfX2l0dF9kb21haW4qKSZudWxsX2RvbWFpbiwgICAgICAgICAgICAgICAgICAgLyogZG9tYWluX2xpc3QgKi8KKyAgICAoX19pdHRfc3RyaW5nX2hhbmRsZSopJm51bGxfc3RyaW5nX2hhbmRsZSwgICAgIC8qIHN0cmluZ19saXN0ICovCisgICAgX19pdHRfY29sbGVjdGlvbl9ub3JtYWwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xsZWN0aW9uIHN0YXRlICovCit9OworCit0eXBlZGVmIHZvaWQgKF9faXR0X2FwaV9pbml0X3QpKF9faXR0X2dsb2JhbCosIF9faXR0X2dyb3VwX2lkKTsKK3R5cGVkZWYgdm9pZCAoX19pdHRfYXBpX2ZpbmlfdCkoX19pdHRfZ2xvYmFsKik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmZGVmIElUVF9OT1RJRllfRVhUX1JFUE9SVAorSVRUX0VYVEVSTl9DIHZvaWQgX05fKGVycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2NvZGUsIHZhX2xpc3QgYXJncyk7CisjZW5kaWYgLyogSVRUX05PVElGWV9FWFRfUkVQT1JUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTUpIC8qIHdhcm5pbmcgQzQwNTU6ICd0eXBlIGNhc3QnIDogZnJvbSBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgdG8gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgdm9pZCBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfY29kZSBjb2RlLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGNvZGUpOworICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlciA9IChfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKShzaXplX3QpX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyOworICAgICAgICBoYW5kbGVyKGNvZGUsIGFyZ3MpOworICAgIH0KKyNpZmRlZiBJVFRfTk9USUZZX0VYVF9SRVBPUlQKKyAgICBfTl8oZXJyb3JfaGFuZGxlcikoY29kZSwgYXJncyk7CisjZW5kaWYgLyogSVRUX05PVElGWV9FWFRfUkVQT1JUICovCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgX19pdHRfZG9tYWluICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVXKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKShuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5uYW1lVyAhPSBOVUxMICYmICF3Y3NjbXAoaC0+bmFtZVcsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfRE9NQUlOX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIF9faXR0X2RvbWFpbiAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlQSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkobmFtZSk7CisjZWxzZQorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGUpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkobmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5uYW1lQSAhPSBOVUxMICYmICFfX2l0dF9mc3RyY21wKGgtPm5hbWVBLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX0RPTUFJTl9BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykobmFtZSk7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+c3RyVyAhPSBOVUxMICYmICF3Y3NjbXAoaC0+c3RyVywgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19TVFJJTkdfSEFORExFX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkobmFtZSk7CisjZWxzZQorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGUpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpKG5hbWUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+c3RyQSAhPSBOVUxMICYmICFfX2l0dF9mc3RyY21wKGgtPnN0ckEsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfU1RSSU5HX0hBTkRMRV9BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHBhdXNlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHBhdXNlKSAmJiBJVFROT1RJRllfTkFNRShwYXVzZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHBhdXNlKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRShwYXVzZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0YXRlID0gX19pdHRfY29sbGVjdGlvbl9wYXVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocmVzdW1lKSxfaW5pdCkpKHZvaWQpCit7CisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHJlc3VtZSkgJiYgSVRUTk9USUZZX05BTUUocmVzdW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocmVzdW1lKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZXN1bWUpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5zdGF0ZSA9IF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfVEhSRUFEX0lORk9fVygmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9ub3JtYWwsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5uYW1lVyA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldFcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfbm9ybWFsLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+bmFtZUEgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXRBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldCksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBuYW1lID0gInVua25vd24iOworICAgICAgICBORVdfVEhSRUFEX0lORk9fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9pZ25vcmVkLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+c3RhdGUgPSBfX2l0dF90aHJlYWRfaWdub3JlZDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfaWdub3JlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkoKTsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhlbmFibGVfYXR0YWNoKSxfaW5pdCkpKHZvaWQpCit7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAvKgorICAgICAqIGlmIExJQl9WQVJfTkFNRSBlbnYgdmFyaWFibGUgd2VyZSBzZXQgYmVmb3JlIHRoZW4gc3RheSBwcmV2aW91cyB2YWx1ZQorICAgICAqIGVsc2Ugc2V0IGRlZmF1bHQgcGF0aAorICAgICovCisgICAgc2V0ZW52KElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSwgQU5EUk9JRF9JVFROT1RJRllfREVGQVVMVF9QQVRILCAwKTsKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZnNwbGl0KGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIHNlcCwgY29uc3QgY2hhcioqIG91dCwgaW50KiBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50IGo7CisKKyAgICBpZiAoIXMgfHwgIXNlcCB8fCAhb3V0IHx8ICFsZW4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgc1tpXTsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFzW2ldKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICpsZW4gPSAwOworICAgICpvdXQgPSAmc1tpXTsKKworICAgIGZvciAoOyBzW2ldOyBpKyssICgqbGVuKSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKDsgc1tpXTsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuICZzW2ldOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiBlbnYgdmFyaWFibGUgdGhhdCBwbGFjZWQgaW50byBzdGF0aWMgYnVmZmVyLgorICogISEhIFRoZSBzYW1lIHN0YXRpYyBidWZmZXIgaXMgdXNlZCBmb3Igc3Vic2VxdWVudCBjYWxscy4gISEhCisgKiBUaGlzIHdhcyBkb25lIHRvIGF2aW9kIGR5bmFtaWMgYWxsb2NhdGlvbiBmb3IgZmV3IGNhbGxzLgorICogQWN0dWFsbHkgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIG9ubHkgZm91ciB0aW1lcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2dldF9lbnZfdmFyKGNvbnN0IGNoYXIqIG5hbWUpCit7CisjZGVmaW5lIE1BWF9FTlZfVkFMVUVfU0laRSA0MDg2CisgICAgc3RhdGljIGNoYXIgIGVudl9idWZmW01BWF9FTlZfVkFMVUVfU0laRV07CisgICAgc3RhdGljIGNoYXIqIGVudl92YWx1ZSA9IChjaGFyKillbnZfYnVmZjsKKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBzaXplX3QgbWF4X2xlbiA9IE1BWF9FTlZfVkFMVUVfU0laRSAtIChzaXplX3QpKGVudl92YWx1ZSAtIGVudl9idWZmKTsKKyAgICAgICAgRFdPUkQgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQShuYW1lLCBlbnZfdmFsdWUsIChEV09SRCltYXhfbGVuKTsKKyAgICAgICAgaWYgKHJjID49IG1heF9sZW4pCisgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfZW52X3Rvb19sb25nLCBuYW1lLCAoc2l6ZV90KXJjIC0gMSwgKHNpemVfdCkobWF4X2xlbiAtIDEpKTsKKyAgICAgICAgZWxzZSBpZiAocmMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiByZXQgPSAoY29uc3QgY2hhciopZW52X3ZhbHVlOworICAgICAgICAgICAgZW52X3ZhbHVlICs9IHJjICsgMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBlbXB0eSwgR2V0RW52aXJvcm5tZW50VmFyaWFibGVzKCkKKyAgICAgICAgICAgICAqIHJldHVybnMgemVybyAobnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBpbmNsdWRpbmcgdGVybWluYXRpbmcgbnVsbCksCisgICAgICAgICAgICAgKiBhbmQgR2V0TGFzdEVycm9yKCkgcmV0dXJucyBFUlJPUl9TVUNDRVNTLiAqLworICAgICAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudl92YWx1ZTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52LCBuYW1lLCAoaW50KWVycik7CisgICAgICAgIH0KKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgY2hhciogZW52ID0gZ2V0ZW52KG5hbWUpOworICAgICAgICBpZiAoZW52ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZW52KTsKKyAgICAgICAgICAgIHNpemVfdCBtYXhfbGVuID0gTUFYX0VOVl9WQUxVRV9TSVpFIC0gKHNpemVfdCkoZW52X3ZhbHVlIC0gZW52X2J1ZmYpOworICAgICAgICAgICAgaWYgKGxlbiA8IG1heF9sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmV0ID0gKGNvbnN0IGNoYXIqKWVudl92YWx1ZTsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGVudl92YWx1ZSwgZW52LCBsZW4gKyAxKTsKKyAgICAgICAgICAgICAgICBlbnZfdmFsdWUgKz0gbGVuICsgMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2Vudl90b29fbG9uZywgbmFtZSwgKHNpemVfdClsZW4sIChzaXplX3QpKG1heF9sZW4gLSAxKSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9nZXRfbGliX25hbWUodm9pZCkKK3sKKyAgICBjb25zdCBjaGFyKiBsaWJfbmFtZSA9IF9faXR0X2dldF9lbnZfdmFyKElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSk7CisKKyAgICByZXR1cm4gbGliX25hbWU7Cit9CisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpIChhKSA8IChiKSA/IChhKSA6IChiKQorI2VuZGlmIC8qIG1pbiAqLworCitzdGF0aWMgX19pdHRfZ3JvdXBfaWQgX19pdHRfZ2V0X2dyb3Vwcyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIHJlcyA9IF9faXR0X2dyb3VwX25vbmU7CisgICAgY29uc3QgY2hhciogdmFyX25hbWUgID0gIklOVEVMX0lUVE5PVElGWV9HUk9VUFMiOworICAgIGNvbnN0IGNoYXIqIGdyb3VwX3N0ciA9IF9faXR0X2dldF9lbnZfdmFyKHZhcl9uYW1lKTsKKworICAgIGlmIChncm91cF9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIgZ3JbMjU1XTsKKyAgICAgICAgY29uc3QgY2hhciogY2h1bms7CisgICAgICAgIHdoaWxlICgoZ3JvdXBfc3RyID0gX19pdHRfZnNwbGl0KGdyb3VwX3N0ciwgIiw7ICIsICZjaHVuaywgJmxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faXR0X2ZzdHJjcHluKGdyLCBjaHVuaywgc2l6ZW9mKGdyKSAtIDEpOworICAgICAgICAgICAgZ3JbbWluKGxlbiwgKGludCkoc2l6ZW9mKGdyKSAtIDEpKV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX19pdHRfZnN0cmNtcChnciwgZ3JvdXBfbGlzdFtpXS5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPOiAhISEgV29ya2Fyb3VuZCBmb3IgYnVnIHdpdGggd2FybmluZyBmb3IgdW5rbm93biBncm91cCAhISEKKyAgICAgICAgICogU2hvdWxkIGJlIGZpeGVkIGluIG5ldyBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgICAgICAgICAqIE5vdyB0aGUgZm9sbG93aW5nIGdyb3VwcyBzaG91bGQgYmUgc2V0IGFsd2F5cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9ub25lOyBpKyspCisgICAgICAgICAgICBpZiAoZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9hbGwgJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkID4gX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA8IF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCkKKyAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9hbGlhc1tpXS5lbnZfdmFyICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIGlmIChfX2l0dF9nZXRfZW52X3Zhcihncm91cF9hbGlhc1tpXS5lbnZfdmFyKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBncm91cF9hbGlhc1tpXS5ncm91cHM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2l0dF9saWJfdmVyc2lvbihsaWJfdCBsaWIpCit7CisgICAgaWYgKGxpYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX2luaXQiKSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV92ZXJzaW9uIikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvKiBJdCdzIG5vdCB1c2VkIHJpZ2h0IG5vdyEgQ29tbWVudCBpdCBvdXQgdG8gYXZvaWQgd2FybmluZ3MuCitzdGF0aWMgdm9pZCBfX2l0dF9yZWluaXRfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLy8gRmlsbCBhbGwgcG9pbnRlcnMgd2l0aCBpbml0aWFsIHN0dWJzCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmluaXRfZnVuYzsKK30KKyovCisKK3N0YXRpYyB2b2lkIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLyogTnVsaWZ5IGFsbCBwb2ludGVycyBleGNlcHQgZG9tYWluX2NyZWF0ZSBhbmQgc3RyaW5nX2hhbmRsZV9jcmVhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKQoreworICAgIF9faXR0X2FwaV9maW5pX3QqIF9faXR0X2FwaV9maW5pX3B0cjsKKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0ciA9IChfX2l0dF9hcGlfZmluaV90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2ZpbmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2ZpbmlfcHRyKQorICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCkpOworCisgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworIC8qIFRPRE86ICEhISBub3Qgc2FmZSAhISEgZG9uJ3Qgc3VwcG9ydCB1bmxvYWQgc28gZmFyLgorICAqICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAqICAgICAgICAgICAgICAgICBfX2l0dF91bmxvYWRfbGliKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKyAgKiAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IE5VTEw7CisgICovCisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAwOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIH0KK30KKworSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqIGxpYl9uYW1lLCBfX2l0dF9ncm91cF9pZCBpbml0X2dyb3VwcykKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgX19pdHRfZ3JvdXBfaWQgemVyb19ncm91cCA9IF9faXR0X2dyb3VwX25vbmU7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKworICAgICAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9IGN1cnJlbnRfdGhyZWFkOworICAgICAgICAgICAgICAgIGlmIChsaWJfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9saWJfbmFtZSgpOworICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dldF9ncm91cHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzICE9IF9faXR0X2dyb3VwX25vbmUgfHwgbGliX25hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gX19pdHRfbG9hZF9saWIoKGxpYl9uYW1lID09IE5VTEwpID8gaXR0bm90aWZ5X2xpYl9uYW1lIDogbGliX25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF90KiBfX2l0dF9hcGlfaW5pdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGliX3ZlcnNpb24gPSBfX2l0dF9saWJfdmVyc2lvbihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGliX3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9ncm91cF9sZWdhY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBhbGwgcG9pbnRlcnMgZnJvbSBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGdyb3VwcyAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSAodm9pZCopX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcG9pbnRlcnMgZm9yIGZ1bmN0aW9uIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19zeW1ib2wsIGxpYl9uYW1lLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvX2dyb3VwID0gKF9faXR0X2dyb3VwX2lkKSh6ZXJvX2dyb3VwIHwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXApOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzID09IF9faXR0X2dyb3VwX2xlZ2FjeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdG9vbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgID0gSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlQSkgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVXKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpOworI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkgICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKSAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKSAgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19yZWxlYXNpbmcpID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcmVsZWFzaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgemVyb19ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIgPSAoX19pdHRfYXBpX2luaXRfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9pbml0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9pbml0X3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBpbml0X2dyb3Vwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fbW9kdWxlLCBsaWJfbmFtZSwKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zeXN0ZW1fZXJyb3IoKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDE7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9maW5pX2l0dGxpYl9wdHIgPT0gX05fKGZpbmlfaXR0bGliKSkgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisgICAgfQorCisgICAgLyogRXZhbHVhdGluZyBpZiBhbnkgZnVuY3Rpb24gcHRyIGlzIG5vbiBlbXB0eSBhbmQgaXQncyBpbiBpbml0X2dyb3VwcyAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyICE9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYyAmJgorICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitJVFRfRVhURVJOX0MgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfTl8oc2V0X2Vycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlcikKK3sKKyAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIHByZXYgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgPSAodm9pZCopKHNpemVfdCloYW5kbGVyOworICAgIHJldHVybiBwcmV2OworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFmZTNjCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApAQCAtMCwwICsxLDMxNiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWZuZGVmIElUVF9GT1JNQVRfREVGSU5FRAorIyAgaWZuZGVmIElUVF9GT1JNQVQKKyMgICAgZGVmaW5lIElUVF9GT1JNQVQKKyMgIGVuZGlmIC8qIElUVF9GT1JNQVQgKi8KKyMgIGlmbmRlZiBJVFRfTk9fUEFSQU1TCisjICAgIGRlZmluZSBJVFRfTk9fUEFSQU1TCisjICBlbmRpZiAvKiBJVFRfTk9fUEFSQU1TICovCisjZW5kaWYgLyogSVRUX0ZPUk1BVF9ERUZJTkVEICovCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBtYWNybyBleHBlY3RlZDoKKyAqIElUVF9TVFVCKGFwaSwgdHlwZSwgZnVuY19uYW1lLCBhcmd1bWVudHMsIHBhcmFtcywgZnVuY19uYW1lX2luX2RsbCwgZ3JvdXAsIHByaW50Zl9mbXQpCisgKi8KKyNpZmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHBhdXNlLCAgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcmVzdW1lLCBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZUEsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVXLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCB0aHJlYWRfaWdub3JlLCBfX2l0dF9ncm91cF90aHJlYWQsICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0QSwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRXLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldCwgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgICAgdGhyX2lnbm9yZSwgICAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBlbmFibGVfYXR0YWNoLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZW5hYmxlX2F0dGFjaCwgX19pdHRfZ3JvdXBfYWxsLCAibm8gYXJncyIpCisKKyNlbHNlICAvKiBfX0lUVF9JTlRFUk5BTF9JTklUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfZGVzdHJveSwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19kZXN0cm95LCAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NhbmNlbCwgICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfYWNxdWlyZWQsICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZWxlYXNpbmcsICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3B1c2gsICAgICAgICh1bnNpZ25lZCBpbnQgbWFzayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtYXNrKSwgc3VwcHJlc3NfcHVzaCwgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3BvcCwgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3VwcHJlc3NfcG9wLCAgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfbWFya19yYW5nZSwgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19jbGVhcl9yYW5nZSxfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcHJlcGFyZSwgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2FjcXVpcmVkLCAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfc2l0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3NpdGVfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfdGFza19iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3Rhc2tfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfYWNxdWlyZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2UsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX3JlbGVhc2UsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sICh2b2lkICphZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgICh2b2lkKiBhZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtb2RlbF9zaXRlX2JlZ2luVywgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbW9kZWxfdGFza19iZWdpblcsIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9zaXRlX2JlZ2luQUwsIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF90YXNrX2JlZ2luQUwsIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIChzaXplX3QgY291bnQpLCAgICAgICAgICAgIChJVFRfRk9STUFUIGNvdW50KSwgICAgICBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpLCAgIChJVFRfRk9STUFUIHgpLCAgICAgICAgICBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICBoZWFwX2FsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIHNpemUsIGluaXRpYWxpemVkKSwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAgICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgICAgICAgICAgIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X2FkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSwgIChJVFRfRk9STUFUIHJlc2V0X21hc2spLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAgICAgICAgICAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSwgKElUVF9GT1JNQVQgcmVjb3JkX21hc2spLCAgaGVhcF9yZWNvcmQsICAgICAgICBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9kZXN0cm95LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBnZXRfdGltZXN0YW1wLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAibm8gYXJncyIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgcmVnaW9uX2JlZ2luLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgICAgcmVnaW9uX2VuZCwgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbl92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgZnJhbWVfYmVnaW5fdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgZnJhbWVfZW5kX3YzLCAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9zdWJtaXRfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBiZWdpbiwgZW5kKSwgZnJhbWVfc3VibWl0X3YzLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZ3JvdXAsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19ncm91cCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2JlZ2luLCAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgdm9pZCogZm4pLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgZm4pLCAgIHRhc2tfYmVnaW5fZm4sIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluKSwgICAgICAgICAgICAgICAgICAgdGFza19lbmQsICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUpLCAgICAgICAgY291bnRlcl9pbmNfdjMsICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YV92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUsIHZhbHVlKSwgY291bnRlcl9pbmNfZGVsdGFfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJWQiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCwgJWx1LCAlcCIpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZFcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGQsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCByZWxhdGlvbiwgdGFpbCksICAgICAgIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIGV2ZW50X3N0YXJ0LCAgICAgICAgICAoX19pdHRfZXZlbnQgZXZlbnQpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBldmVudCksICAgICAgICAgZXZlbnRfc3RhcnQsICAgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfZW5kLCAgICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9lbmQsICAgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAicCwgXCIlc1wiLCBcIiVzXCIsICV4IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVBLCAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICpwLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgJWQsIFwiJVNcIiwgJWQsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKnAsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCAlZCwgXCIlc1wiLCAlZCwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAgICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19yZWxlYXNpbmcsICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV9yZWFkLCAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV93cml0ZSwgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3VwZGF0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV91cGRhdGUsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3N0YXRlX3QsICAgICBzdGF0ZV9nZXQsICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3RhdGVfZ2V0LCAgICBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX3NldCwgICAgKF9faXR0X3N0YXRlX3QgcyksICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHMpLCAgICBzdGF0ZV9zZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCBvYmpfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpLCAoSVRUX0ZPUk1BVCBwLCBzKSwgdGhyX21vZGVfc2V0LCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCwgJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVBLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlVywgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfYmVnaW4sICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfZW5kLCAgICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlVywgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGUsICBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfZGVzdHJveSwgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9kZXN0cm95LCAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgICAgICAgKF9faXR0X2NvdW50ZXIgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGlkKSwgICAgICAgIGNvdW50ZXJfaW5jLCAgICAgICBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBpZCwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YSwgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwLCAlbHUiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyaywgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmssICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtBLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtXLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmssICAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmssICBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgKElUVF9GT1JNQVQgbXQpLCBtYXJrX29mZiwgX19pdHRfZ3JvdXBfbWFyaywgIiVkIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsVywgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbCwgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtdCksICAgICAgICAgICAgbWFya19nbG9iYWxfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0aXRjaCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZXJfZGVzdHJveSwgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlZV9lbnRlciwgICBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2xlYXZlLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKKworSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSwgKElUVF9GT1JNQVQgZm4sIGZuX2RhdGEpLCBjbG9ja19kb21haW5fY3JlYXRlLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgICAgICAgICAgICAgICAgY2xvY2tfZG9tYWluX3Jlc2V0LCAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZV9leCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9jcmVhdGVfZXgsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3lfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9kZXN0cm95X2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBmbiksIHRhc2tfYmVnaW5fZm5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCksIHRhc2tfZW5kX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIHR5cGUsIGNvdW50LCBkYXRhKSwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlZCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGhlYWQsIHJlbGF0aW9uLCB0YWlsKSwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfdHJhY2tfZ3JvdXAqLCB0cmFja19ncm91cF9jcmVhdGUsIChfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbmFtZSwgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICB0cmFja19ncm91cF9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFjayosICAgICAgIHRyYWNrX2NyZWF0ZSwgICAgICAgKF9faXR0X3RyYWNrX2dyb3VwKiB0cmFja19ncm91cCxfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpLCAoSVRUX0ZPUk1BVCB0cmFja19ncm91cCwgbmFtZSwgdHJhY2tfdHlwZSksIHRyYWNrX2NyZWF0ZSwgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgKF9faXR0X3RyYWNrICp0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgYXBpX3ZlcnNpb24sIF9faXR0X2dyb3VwX2FsbCAmIH5fX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlQSwgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlVywgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlLCAgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0lOSVQgKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaCBiL3JjMS9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjk1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX1RZUEVTX0hfCisjZGVmaW5lIF9JVFROT1RJRllfVFlQRVNfSF8KKwordHlwZWRlZiBlbnVtIF9fX2l0dF9ncm91cF9pZAoreworICAgIF9faXR0X2dyb3VwX25vbmUgICAgICA9IDAsCisgICAgX19pdHRfZ3JvdXBfbGVnYWN5ICAgID0gMTw8MCwKKyAgICBfX2l0dF9ncm91cF9jb250cm9sICAgPSAxPDwxLAorICAgIF9faXR0X2dyb3VwX3RocmVhZCAgICA9IDE8PDIsCisgICAgX19pdHRfZ3JvdXBfbWFyayAgICAgID0gMTw8MywKKyAgICBfX2l0dF9ncm91cF9zeW5jICAgICAgPSAxPDw0LAorICAgIF9faXR0X2dyb3VwX2ZzeW5jICAgICA9IDE8PDUsCisgICAgX19pdHRfZ3JvdXBfaml0ICAgICAgID0gMTw8NiwKKyAgICBfX2l0dF9ncm91cF9tb2RlbCAgICAgPSAxPDw3LAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21pbiA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfY291bnRlciAgID0gMTw8OCwKKyAgICBfX2l0dF9ncm91cF9mcmFtZSAgICAgPSAxPDw5LAorICAgIF9faXR0X2dyb3VwX3N0aXRjaCAgICA9IDE8PDEwLAorICAgIF9faXR0X2dyb3VwX2hlYXAgICAgICA9IDE8PDExLAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N1cHByZXNzID0gMTw8MTMsCisgICAgX19pdHRfZ3JvdXBfYXJyYXlzICAgID0gMTw8MTQsCisgICAgX19pdHRfZ3JvdXBfYWxsICAgICAgID0gLTEKK30gX19pdHRfZ3JvdXBfaWQ7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfbGlzdAoreworICAgIF9faXR0X2dyb3VwX2lkIGlkOworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7Cit9IF9faXR0X2dyb3VwX2xpc3Q7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNkZWZpbmUgSVRUX0dST1VQX0xJU1QodmFybmFtZSkgXAorICAgIHN0YXRpYyBfX2l0dF9ncm91cF9saXN0IHZhcm5hbWVbXSA9IHsgICAgICAgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FsbCwgICAgICAgImFsbCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvbnRyb2wsICAgImNvbnRyb2wiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3RocmVhZCwgICAgInRocmVhZCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21hcmssICAgICAgIm1hcmsiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N5bmMsICAgICAgInN5bmMiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZzeW5jLCAgICAgImZzeW5jIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ppdCwgICAgICAgImppdCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21vZGVsLCAgICAgIm1vZGVsIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvdW50ZXIsICAgImNvdW50ZXIiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZyYW1lLCAgICAgImZyYW1lIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0aXRjaCwgICAgInN0aXRjaCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2hlYXAsICAgICAgImhlYXAiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgInN0cnVjdHVyZSIgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N1cHByZXNzLCAgInN1cHByZXNzIiAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FycmF5cywgICAgImFycmF5cyIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX25vbmUsICAgICAgTlVMTCAgICAgICAgfSAgXAorICAgIH0KKworI2VuZGlmIC8qIF9JVFROT1RJRllfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmggYi9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTViYjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCkBAIC0wLDAgKzEsOTcxIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xFR0FDWV9JVFROT1RJRllfSF8KKyNkZWZpbmUgX0xFR0FDWV9JVFROT1RJRllfSF8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIExlZ2FjeSBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKy8qIEhlbHBlciBtYWNybyBmb3Igam9pbmluZyB0b2tlbnMgKi8KKyNkZWZpbmUgSVRUX0pPSU5fQVVYKHAsbikgcCMjbgorI2RlZmluZSBJVFRfSk9JTihwLG4pICAgICBJVFRfSk9JTl9BVVgocCxuKQorCisjaWZkZWYgSVRUX01BSk9SCisjdW5kZWYgSVRUX01BSk9SCisjZW5kaWYKKyNpZmRlZiBJVFRfTUlOT1IKKyN1bmRlZiBJVFRfTUlOT1IKKyNlbmRpZgorI2RlZmluZSBJVFRfTUFKT1IgICAgIDMKKyNkZWZpbmUgSVRUX01JTk9SICAgICAwCisKKy8qIFN0YW5kYXJkIHZlcnNpb25pbmcgb2YgYSB0b2tlbiB3aXRoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgSVRUX1ZFUlNJT05JWkUoeCkgICAgXAorICAgIElUVF9KT0lOKHgsICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oXywgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihJVFRfTUFKT1IsICAgICAgXAorICAgIElUVF9KT0lOKF8sIElUVF9NSU5PUikpKSkKKworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUFJFRklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2l0dF8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUFJFRklYICovCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QT1NURklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BPU1RGSVggX3B0cl8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCAqLworCisjZGVmaW5lIElUVE5PVElGWV9OQU1FX0FVWChuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisjZGVmaW5lIElUVE5PVElGWV9OQU1FKG4pICAgICBJVFRfVkVSU0lPTklaRShJVFROT1RJRllfTkFNRV9BVVgoSVRUX0pPSU4obixJTlRFTF9JVFROT1RJRllfUE9TVEZJWCkpKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEKG4pICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pCisjZGVmaW5lIElUVE5PVElGWV9EQVRBKG4pICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorCisjaWZkZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQgorI2VuZGlmCisjaWZkZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUJWCisjZW5kaWYKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGUgKGFwaSogSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpKSBhcmdzOyAgIFwKKyAgICBleHRlcm4gSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpIElUVE5PVElGWV9OQU1FKG5hbWUpOworI2RlZmluZSBJVFRfU1RVQiBJVFRfU1RVQlYKKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeSBMZWdhY3kgQVBJCisgKiBAeworICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfY29udHJvbCBDb2xsZWN0aW9uIENvbnRyb2wKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IG5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBpcyBiZWluZyBjb2xsZWN0ZWQKKyAqCisgKiBQYXVzaW5nIG9jY3VycyBub3Qgb25seSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGJ1dCBmb3IgYWxsIHByb2Nlc3MgYXMgd2VsbCBhcyBzcGF3bmVkIHByb2Nlc3NlcworICogLSBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRToKKyAqICAgLSBEb2VzIG5vdCBhbmFseXplIG9yIHJlcG9ydCBlcnJvcnMgdGhhdCBpbnZvbHZlIG1lbW9yeSBhY2Nlc3MuCisgKiAgIC0gT3RoZXIgZXJyb3JzIGFyZSByZXBvcnRlZCBhcyB1c3VhbC4gUGF1c2luZyBkYXRhIGNvbGxlY3Rpb24gaW4KKyAqICAgICBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRQorICogICAgIG9ubHkgcGF1c2VzIHRyYWNpbmcgYW5kIGFuYWx5emluZyBtZW1vcnkgYWNjZXNzLgorICogICAgIEl0IGRvZXMgbm90IHBhdXNlIHRyYWNpbmcgb3IgYW5hbHl6aW5nIHRocmVhZGluZyBBUElzLgorICogICAuCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBhbmQgSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBYRToKKyAqICAgLSBEb2VzIGNvbnRpbnVlIHRvIHJlY29yZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBzdGFydGVkLgorICogICAuCisgKiAtIE90aGVyIGVmZmVjdHM6CisgKiAgIC0gUG9zc2libGUgcmVkdWN0aW9uIG9mIHJ1bnRpbWUgb3ZlcmhlYWQuCisgKiAgIC4KKyAqIEB7CisgKi8KKyNpZm5kZWYgX0lUVE5PVElGWV9IXworLyoqIEBicmllZiBQYXVzZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9wYXVzZSh2b2lkKTsKKy8qKiBAYnJpZWYgUmVzdW1lIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Jlc3VtZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcGF1c2UsICAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9wYXVzZSAgICAgIElUVE5PVElGWV9WT0lEKHBhdXNlKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIElUVE5PVElGWV9OQU1FKHBhdXNlKQorI2RlZmluZSBfX2l0dF9yZXN1bWUgICAgIElUVE5PVElGWV9WT0lEKHJlc3VtZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciBJVFROT1RJRllfTkFNRShyZXN1bWUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9wYXVzZSgpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWUoKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworLyoqIEB9IGxlZ2FjeV9jb250cm9sIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV90aHJlYWRzIFRocmVhZHMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogVGhyZWFkcyBncm91cAorICogQHdhcm5pbmcgTGVnYWN5IEFQSQorICogQHsKKyAqLworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU2V0IG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRocmVhZCBpbiBhbmFseXNpcyBHVUkuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsLG5hbWUgYW5kIG5hbWVsZW4gbWlzbWF0Y2hlZCkKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IExJQklUVEFQSSBfX2l0dF90aHJfbmFtZV9zZXRBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0Vyhjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgX19pdHRfdGhyX25hbWVfc2V0VworIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgX19pdHRfdGhyX25hbWVfc2V0V19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0ICAgICBfX2l0dF90aHJfbmFtZV9zZXRBCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBfX2l0dF90aHJfbmFtZV9zZXRBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IExJQklUVEFQSSBfX2l0dF90aHJfbmFtZV9zZXQoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0QSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXRXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldCwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEEgICAgIElUVE5PVElGWV9EQVRBKHRocl9uYW1lX3NldEEpCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldEEpCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFcgICAgIElUVE5PVElGWV9EQVRBKHRocl9uYW1lX3NldFcpCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldFcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0ICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXQpCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0KQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QShuYW1lLCBuYW1lbGVuKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFcobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldChuYW1lLCBuYW1lbGVuKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgTWFyayBjdXJyZW50IHRocmVhZCBhcyBpZ25vcmVkIGZyb20gdGhpcyBwb2ludCBvbiwgZm9yIHRoZSBkdXJhdGlvbiBvZiBpdHMgZXhpc3RlbmNlLgorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF90aHJfaWdub3JlKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCB0aHJfaWdub3JlLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmUgICAgIElUVE5PVElGWV9WT0lEKHRocl9pZ25vcmUpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIElUVE5PVElGWV9OQU1FKHRocl9pZ25vcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJfaWdub3JlKCkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfdGhyZWFkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfc3luYyBTeW5jaHJvbml6YXRpb24KKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogU3luY2hyb25pemF0aW9uIGdyb3VwCisgKiBAd2FybmluZyBMZWdhY3kgQVBJCisgKiBAeworICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgYXJndW1lbnQgZm9yIHN5bmMgb2JqZWN0IHR5cGUKKyAqLworI2RlZmluZSBfX2l0dF9hdHRyX2JhcnJpZXIgMQorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgYXJndW1lbnQgZm9yIHN5bmMgb2JqZWN0IHR5cGUKKyAqLworI2RlZmluZSBfX2l0dF9hdHRyX211dGV4ICAgMgorCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBBc3NpZ24gYSBuYW1lIHRvIGEgc3luYyBvYmplY3QgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZworICogQHBhcmFtW2luXSBhZGRyICAgIC0gcG9pbnRlciB0byB0aGUgc3luYyBvYmplY3QuIFlvdSBzaG91bGQgdXNlIGEgcmVhbCBwb2ludGVyIHRvIHlvdXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGRvbid0IGNsYXNoIHdpdGggb3RoZXIgb2JqZWN0IGFkZHJlc3NlcworICogQHBhcmFtW2luXSBvYmp0eXBlIC0gbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcyBwYXNzZWQsIHRoZSBvYmplY3Qgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgYmUgYXNzdW1lZCB0byBiZSBvZiBnZW5lcmljICJVc2VyIFN5bmNocm9uaXphdGlvbiIgdHlwZQorICogQHBhcmFtW2luXSBvYmpuYW1lIC0gbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwgbm8gbmFtZSB3aWxsIGJlIGFzc2lnbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgb2JqZWN0IC0tIHlvdSBjYW4gdXNlIHRoZSBfX2l0dF9zeW5jX3JlbmFtZSBjYWxsIGxhdGVyIHRvIGFzc2lnbgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUKKyAqIEBwYXJhbVtpbl0gYXR0cmlidXRlIC0gb25lIG9mIFsjX19pdHRfYXR0cl9iYXJyaWVyLCAjX19pdHRfYXR0cl9tdXRleF0gdmFsdWVzIHdoaWNoIGRlZmluZXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBleGFjdCBzZW1hbnRpY3Mgb2YgaG93IHByZXBhcmUvYWNxdWlyZWQvcmVsZWFzaW5nIGNhbGxzIHdvcmsuCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIF9faXR0X3N5bmNfc2V0X25hbWVXCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgX19pdHRfc3luY19zZXRfbmFtZUEKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciogb2JqdHlwZSwgY29uc3QgY2hhciogb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUEgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lVykKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfc2V0X25hbWUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBBc3NpZ24gYSBuYW1lIGFuZCB0eXBlIHRvIGEgc3luYyBvYmplY3QgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZworICogQHBhcmFtW2luXSBhZGRyIC0gICAgICBwb2ludGVyIHRvIHRoZSBzeW5jIG9iamVjdC4gWW91IHNob3VsZCB1c2UgYSByZWFsIHBvaW50ZXIgdG8geW91ciBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBkb24ndCBjbGFzaCB3aXRoIG90aGVyIG9iamVjdCBhZGRyZXNzZXMKKyAqIEBwYXJhbVtpbl0gb2JqdHlwZSAtICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcyBwYXNzZWQsIHRoZSBvYmplY3Qgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICBiZSBhc3N1bWVkIHRvIGJlIG9mIGdlbmVyaWMgIlVzZXIgU3luY2hyb25pemF0aW9uIiB0eXBlCisgKiBAcGFyYW1baW5dIG9iam5hbWUgLSAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsIG5vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgb2JqZWN0IC0tIHlvdSBjYW4gdXNlIHRoZSBfX2l0dF9zeW5jX3JlbmFtZSBjYWxsIGxhdGVyIHRvIGFzc2lnbgorICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZQorICogQHBhcmFtW2luXSB0eXBlbGVuLCBuYW1lbGVuIC0gICBhIGxlbmd0aCBvZiBzdHJpbmcgZm9yIGFwcHJvcHJpYXRlIG9ianR5cGUgYW5kIG9iam5hbWUgcGFyYW1ldGVyCisgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZSAtIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdIHZhbHVlcyB3aGljaCBkZWZpbmVzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBleGFjdCBzZW1hbnRpY3Mgb2YgaG93IHByZXBhcmUvYWNxdWlyZWQvcmVsZWFzaW5nIGNhbGxzIHdvcmsuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsLG5hbWUgYW5kIG5hbWVsZW4gbWlzbWF0Y2hlZCkKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpOworaW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEKKyNlbmRpZgorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQSAgICAgSVRUTk9USUZZX0RBVEEobm90aWZ5X3N5bmNfbmFtZUEpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lQSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWVXKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lV19wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSAgICAgSVRUTk9USUZZX0RBVEEobm90aWZ5X3N5bmNfbmFtZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcoYWRkciwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUoYWRkciwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEVudGVyIHNwaW4gbG9vcCBvbiB1c2VyLWRlZmluZWQgc3luYyBvYmplY3QKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZSh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19wcmVwYXJlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19wcmVwYXJlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZShhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBRdWl0IHNwaW4gbG9vcCB3aXRob3V0IGFjcXVpcmluZyBzcGluIG9iamVjdAorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2NhbmNlbCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWwgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX2NhbmNlbCkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19jYW5jZWwpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWwoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFN1Y2Nlc3NmdWwgc3BpbiBsb29wIGNvbXBsZXRpb24gKHN5bmMgb2JqZWN0IGFjcXVpcmVkKQorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFN0YXJ0IHN5bmMgb2JqZWN0IHJlbGVhc2luZyBjb2RlLiBJcyBjYWxsZWQgYmVmb3JlIHRoZSBsb2NrIHJlbGVhc2UgY2FsbC4KKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19yZWxlYXNpbmcsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZ19wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9zeW5jIGdyb3VwICovCisKKyNpZm5kZWYgX0lUVE5PVElGWV9IXworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X2V2ZW50cyBFdmVudHMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogRXZlbnRzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgdXNlciBldmVudCB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9ldmVudDsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGV2ZW50IG5vdGlmaWNhdGlvbgorICogQG5vdGUgbmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwvbmFtZSBhbmQgbmFtZWxlbiBub3QgbWF0Y2hpbmcsIHVzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZAorICogQHJldHVybiBub24temVybyBldmVudCBpZGVudGlmaWVyIHVwb24gc3VjY2VzcyBhbmQgX19pdHRfZXJyIG90aGVyd2lzZQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZSwgIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyhuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlKG5hbWUsIG5hbWVsZW4pICAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgb2NjdXJyZW5jZS4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfc3RhcnQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfc3RhcnQsIChfX2l0dF9ldmVudCBldmVudCkpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0ICAgICBJVFROT1RJRllfREFUQShldmVudF9zdGFydCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X3N0YXJ0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBlbmQgb2NjdXJyZW5jZS4KKyAqIEBub3RlIEl0IGlzIG9wdGlvbmFsIGlmIGV2ZW50cyBkbyBub3QgaGF2ZSBkdXJhdGlvbnMuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2VuZChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9lbmQsIChfX2l0dF9ldmVudCBldmVudCkpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfZW5kKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9ldmVudHMgZ3JvdXAgKi8KKyNlbmRpZiAvKiBfSVRUTk9USUZZX0hfICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9tZW1vcnkgTWVtb3J5IEFjY2Vzc2VzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHJlYWRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3JlYWQodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfcmVhZCwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWQgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV9yZWFkKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgSVRUTk9USUZZX05BTUUobWVtb3J5X3JlYWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZChhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gd3JpdGluZworICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9tZW1vcnlfd3JpdGUodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfd3JpdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZSAgICAgSVRUTk9USUZZX1ZPSUQobWVtb3J5X3dyaXRlKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGVfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV93cml0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZShhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiB1cGRhdGluZworICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9tZW1vcnlfdXBkYXRlKHZvaWQgKmFkZHJlc3MsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3VwZGF0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZSAgICAgSVRUTk9USUZZX1ZPSUQobWVtb3J5X3VwZGF0ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZV9wdHIgSVRUTk9USUZZX05BTUUobWVtb3J5X3VwZGF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGUoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfbWVtb3J5IGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9zdGF0ZSBUaHJlYWQgYW5kIE9iamVjdCBTdGF0ZXMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICovCisKKy8qKiBAYnJpZWYgc3RhdGUgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfc3RhdGVfdDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19pdHRfb2JqX3N0YXRlIHsKKyAgICBfX2l0dF9vYmpfc3RhdGVfZXJyID0gMCwKKyAgICBfX2l0dF9vYmpfc3RhdGVfY2xyID0gMSwKKyAgICBfX2l0dF9vYmpfc3RhdGVfc2V0ID0gMiwKKyAgICBfX2l0dF9vYmpfc3RhdGVfdXNlID0gMworfSBfX2l0dF9vYmpfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIF9faXR0X3Rocl9zdGF0ZSB7CisgICAgX19pdHRfdGhyX3N0YXRlX2VyciA9IDAsCisgICAgX19pdHRfdGhyX3N0YXRlX2NsciA9IDEsCisgICAgX19pdHRfdGhyX3N0YXRlX3NldCA9IDIKK30gX19pdHRfdGhyX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF9vYmpfcHJvcCB7CisgICAgX19pdHRfb2JqX3Byb3Bfd2F0Y2ggICAgPSAxLAorICAgIF9faXR0X29ial9wcm9wX2lnbm9yZSAgID0gMiwKKyAgICBfX2l0dF9vYmpfcHJvcF9zaGFyYWJsZSA9IDMKK30gX19pdHRfb2JqX3Byb3BfdDsKKwordHlwZWRlZiBlbnVtIF9faXR0X3Rocl9wcm9wIHsKKyAgICBfX2l0dF90aHJfcHJvcF9xdWlldCA9IDEKK30gX19pdHRfdGhyX3Byb3BfdDsKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBzdGF0ZXMKKyAqLworX19pdHRfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfc3RhdGVfZ2V0KHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0YXRlX3QsIHN0YXRlX2dldCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXQgICAgIElUVE5PVElGWV9EQVRBKHN0YXRlX2dldCkKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciBJVFROT1RJRllfTkFNRShzdGF0ZV9nZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXQodm9pZCkgKF9faXR0X3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3Qgc3RhdGVzCisgKi8KK19faXR0X3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3N0YXRlX3NldChfX2l0dF9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0YXRlX3QsIHN0YXRlX3NldCwgKF9faXR0X3N0YXRlX3QgcykpCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldCAgICAgSVRUTk9USUZZX0RBVEEoc3RhdGVfc2V0KQorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHN0YXRlX3NldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldChzKSAoX19pdHRfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBtb2RlcworICovCitfX2l0dF90aHJfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfdGhyX21vZGVfc2V0KF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdGhyX3N0YXRlX3QsIHRocl9tb2RlX3NldCwgKF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3QgcykpCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldCAgICAgSVRUTk9USUZZX0RBVEEodGhyX21vZGVfc2V0KQorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHRocl9tb2RlX3NldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldChwLCBzKSAoX19pdHRfdGhyX3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3QgbW9kZXMKKyAqLworX19pdHRfb2JqX3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X29ial9tb2RlX3NldChfX2l0dF9vYmpfcHJvcF90IHAsIF9faXR0X29ial9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X29ial9zdGF0ZV90LCBvYmpfbW9kZV9zZXQsIChfX2l0dF9vYmpfcHJvcF90IHAsIF9faXR0X29ial9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKG9ial9tb2RlX3NldCkKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRShvYmpfbW9kZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXQocCwgcykgKF9faXR0X29ial9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3N0YXRlIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGZyYW1lcyBGcmFtZXMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogRnJhbWVzIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBmcmFtZSBpZGVudGlmaWNhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBfX2l0dF9mcmFtZV90ICpfX2l0dF9mcmFtZTsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGEgZ2xvYmFsIGZyYW1lIHdpdGggZ2l2ZW4gZG9tYWluCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKmRvbWFpbik7CitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIF9faXR0X2ZyYW1lX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBfX2l0dF9mcmFtZV9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZShjb25zdCBjaGFyICpkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqZG9tYWluKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpkb21haW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKmRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGZyYW1lX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGZyYW1lX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQShkb21haW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlVyhkb21haW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIFJlY29yZCBhbiBmcmFtZSBiZWdpbiBvY2N1cnJlbmNlLiAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfYmVnaW4oX19pdHRfZnJhbWUgZnJhbWUpOworLyoqIEBicmllZiBSZWNvcmQgYW4gZnJhbWUgZW5kIG9jY3VycmVuY2UuICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9lbmQgIChfX2l0dF9mcmFtZSBmcmFtZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luLCAoX19pdHRfZnJhbWUgZnJhbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kLCAgIChfX2l0dF9mcmFtZSBmcmFtZSkpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChmcmFtZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2JlZ2luKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmQgICAgICAgSVRUTk9USUZZX1ZPSUQoZnJhbWVfZW5kKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfcHRyICAgSVRUTk9USUZZX05BTUUoZnJhbWVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW4oZnJhbWUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZChmcmFtZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGZyYW1lcyBncm91cCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0xFR0FDWV9JVFROT1RJRllfSF8gKi8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5zIGIvcmMxL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxYmExYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5zCkBAIC0wLDAgKzEsMTU5MSBAQAorLy8gIHpfTGludXhfYXNtLnM6ICAtIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkKKy8vICAgICAgICAgICAgICAgICAgICB3cml0dGVuIGZvciBJbnRlbCBwbGF0Zm9ybXMgcnVubmluZyBMaW51eCogT1MKKy8vICRSZXZpc2lvbjogNDI4MTAgJAorLy8gJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKworLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLy8KKy8vLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8vLworLy8vLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8vLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworIyBpZiBfX01JQ19fIHx8IF9fTUlDMl9fCisvLworLy8gdGhlICdkZWxheSByMTYvcjMyL3I2NCcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgJ3BhdXNlJy4KKy8vIFRoZSBkZWxheSBvcGVyYXRpb24gaGFzIHRoZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20KKy8vIHRoZSByb3VuZC1yb2JpbiBIVCBtZWNoYW5pc20sIGFuZCB0aGVyZWZvcmUgc3BlZWRzIHVwIHRoZSBpc3N1ZSByYXRlIG9mCisvLyB0aGUgb3RoZXIgdGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlLgorLy8KKy8vIEEgdmFsdWUgb2YgMCB3b3JrcyBmaW5lIGZvciA8PSAyIHRocmVhZHMgcGVyIGNvcmUsIGJ1dCBjYXVzZXMgdGhlIEVQQ0MKKy8vIGJhcnJpZXIgdGltZSB0byBpbmNyZWFzZSBncmVhdGx5IGZvciAzIG9yIG1vcmUgdGhyZWFkcyBwZXIgY29yZS4KKy8vCisvLyBBIHZhbHVlIG9mIDEwMCB3b3JrcyBwcmV0dHkgd2VsbCBmb3IgdXAgdG8gNCB0aHJlYWRzIHBlciBjb3JlLCBidXQgaXNuJ3QKKy8vIHF1aXRlIGFzIGZhc3QgYXMgMCBmb3IgMiB0aHJlYWRzIHBlciBjb3JlLgorLy8KKy8vIFdlIG5lZWQgdG8gY2hlY2sgd2hhdCBoYXBwZW5zIGZvciBvdmVyc3Vic2NyaXB0aW9uIC8gPiA0IHRocmVhZHMgcGVyIGNvcmUuCisvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG5lZWQgdG8gcGFzcyB0aGUgZGVsYXkgdmFsdWUgaW4gYXMgYSBwYXJhbWV0ZXIKKy8vIHRoYXQgdGhlIGNhbGxlciBkZXRlcm1pbmVzIGJhc2VkIG9uIHRoZSB0b3RhbCAjIHRocmVhZHMgLyAjIGNvcmVzLgorLy8KKy8vLm1hY3JvIHBhdXNlX29wCisvLwltb3YgICAgJDEwMCwgJXJheAorLy8JZGVsYXkgICVyYXgKKy8vLmVuZG0KKyMgZWxzZQorIyAgZGVmaW5lIHBhdXNlX29wICAgLmJ5dGUgMHhmMywweDkwCisjIGVuZGlmIC8vIF9fTUlDX18gfHwgX19NSUMyX18KKworIyBpZiBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fCisjICBkZWZpbmUgS01QX1BSRUZJWF9VTkRFUlNDT1JFKHgpIF8jI3ggIC8vIGV4dHJhIHVuZGVyc2NvcmUgZm9yIE9TIFgqIHN5bWJvbHMKKy5tYWNybyBBTElHTgorCS5hbGlnbiAkMAorLmVuZG1hY3JvCisubWFjcm8gREVCVUdfSU5GTworLyogTm90IHN1cmUgd2hhdCAuc2l6ZSBkb2VzIGluIGljYywgbm90IHN1cmUgaWYgd2UgbmVlZCB0byBkbyBzb21ldGhpbmcKKyAgIHNpbWlsYXIgZm9yIE9TIFgqLgorKi8KKy5lbmRtYWNybworLm1hY3JvIFBST0MKKwlBTElHTiAgNAorCS5nbG9ibCBLTVBfUFJFRklYX1VOREVSU0NPUkUoJDApCitLTVBfUFJFRklYX1VOREVSU0NPUkUoJDApOgorLmVuZG1hY3JvCisjIGVsc2UgLy8gZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXworIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSB4ICAvLyBubyBleHRyYSB1bmRlcnNjb3JlIGZvciBMaW51eCogT1Mgc3ltYm9scworLm1hY3JvIEFMSUdOIHNpemUKKwkuYWxpZ24gMTw8KFxzaXplKQorLmVuZG0KKy5tYWNybyBERUJVR19JTkZPIHByb2MKKy8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIC50eXBlIGFuZCAuc2l6ZSBmb3IgdGhlIGZ1bmN0aW9ucworCS5hbGlnbiAxNgorCS50eXBlICBccHJvYyxAZnVuY3Rpb24KKyAgICAgICAgLnNpemUgIFxwcm9jLC4tXHByb2MKKy5lbmRtCisubWFjcm8gUFJPQyBwcm9jCisJQUxJR04gIDQKKyAgICAgICAgLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYykKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYyk6CisuZW5kbQorIyBlbmRpZiAvLyBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX3g4Nl82NAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkYXRhCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKKy8vCisvLyBTdXBwb3J0IGZvciB1bm5hbWVkIGNvbW1vbiBibG9ja3MuCisvLworLy8gQmVjYXVzZSB0aGUgc3ltYm9sICIuZ29tcF9jcml0aWNhbF91c2VyXyIgY29udGFpbnMgYSAiLiIsIHdlIGhhdmUgdG8KKy8vIHB1dCB0aGlzIHN0dWZmIGluIGFzc2VtYmx5LgorLy8KKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGlmIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIKKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmdsb2JsIF9fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC5sb25nIC5nb21wX2NyaXRpY2FsX3VzZXJfCisjICBlbHNlIC8qIExpbnV4KiBPUyAqLworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgICAgIC5kYXRhCisJQUxJR04gNAorICAgICAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAuNGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAgICAgLnR5cGUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLEBvYmplY3QKKyAgICAgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDQKKyMgIGVuZGlmIC8qIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18gKi8KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgaWYgS01QX0FSQ0hfWDg2XzY0CisjICBpZiBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyCisgICAgICAgIC5kYXRhCisgICAgICAgIC5nbG9ibCBfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAucXVhZCAuZ29tcF9jcml0aWNhbF91c2VyXworIyAgZWxzZSAvKiBMaW51eCogT1MgKi8KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgICAgICAuZGF0YQorCUFMSUdOIDgKKyAgICAgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLjhieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgICAgIC50eXBlIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcixAb2JqZWN0CisgICAgICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw4CisjICBlbmRpZiAvKiBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fICovCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworI2lmIEtNUF9BUkNIX1g4NgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUKKy8vIHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworCS5pZGVudCAiSW50ZWwgQ29ycG9yYXRpb24iCisJLmRhdGEKKwlBTElHTiA0CisvLyB2b2lkCisvLyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKy8vCisKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF94ODZfcGF1c2UKKworICAgICAgICBwYXVzZV9vcAorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfeDg2X3BhdXNlCisKKy8vCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworLy8KKwlQUk9DICBfX2ttcF94ODZfY3B1aWQKKworCXB1c2hsICVlYnAKKwltb3ZsICAlZXNwLCVlYnAKKyAgICAgICAgcHVzaGwgJWVkaQorICAgICAgICBwdXNobCAlZWJ4CisgICAgICAgIHB1c2hsICVlY3gKKyAgICAgICAgcHVzaGwgJWVkeAorCisJbW92bCAgOCglZWJwKSwgJWVheAorCW1vdmwgIDEyKCVlYnApLCAlZWN4CisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgIDE2KCVlYnApLCAlZWRpCisJbW92bCAgJWVheCwgMCglZWRpKQorCW1vdmwgICVlYngsIDQoJWVkaSkKKwltb3ZsICAlZWN4LCA4KCVlZGkpCisJbW92bCAgJWVkeCwgMTIoJWVkaSkKKworICAgICAgICBwb3BsICAlZWR4CisgICAgICAgIHBvcGwgICVlY3gKKyAgICAgICAgcG9wbCAgJWVieAorICAgICAgICBwb3BsICAlZWRpCisgICAgICAgIG1vdmwgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgJWVicAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfY3B1aWQKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKworICAgICAgICBQUk9DICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ4CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklYWwKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2IgICAgICVhbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGd3ICAgICAlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCisgICAgICAgIG1vdmIgICAgICAxMiglZXNwKSwgJWRsCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJWVjeCkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWFsID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlZHg6ZWF4ID09ICglZWRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CisgICAgICAgIG1vdncgICAgICAxMiglZXNwKSwgJWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIHB1c2hsICAgICAlZWJwCisgICAgICAgIG1vdmwgICAgICAlZXNwLCAlZWJwCisgICAgICAgIHB1c2hsICAgICAlZWJ4CisgICAgICAgIHB1c2hsICAgICAlZWRpCisgICAgICAgIG1vdmwgICAgICA4KCVlYnApLCAlZWRpCisgICAgICAgIG1vdmwgICAgICAxMiglZWJwKSwgJWVheCAgICAgICAgLy8gImN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMTYoJWVicCksICVlZHggICAgICAgIC8vICJjdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyMCglZWJwKSwgJWVieCAgICAgICAgLy8gInN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjQoJWVicCksICVlY3ggICAgICAgIC8vICJzdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZzhiICglZWRpKQorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CTQoJWVzcCkKKy8vIAlkYXRhOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklZWF4CisKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWwzMgorCisgICAgICAgIHB1c2hsICAgJWVicAorICAgICAgICBtb3ZsICAgICVlc3AsICVlYnAKKyAgICAgICAgc3VibCAgICAkNCwgJWVzcAorICAgICAgICBwdXNobCAgICVlc2kKKworICAgICAgICBtb3ZsICAgIDQoJWVicCksICVlc2kKKyAgICAgICAgZmxkcyAgICAoJWVzaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgPGFkZHI+CisgICAgICAgIGZzdHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9sZCB2YWx1ZQorCisgICAgICAgIG1vdmwgICAgOCglZWJwKSwgJWVheAorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAlZWF4LCAoJWVzaSkKKworICAgICAgICBmbGRzICAgIC00KCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHZhbHVlCisKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWwzMgorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCitfYWRkciA9IDgKK19kYXRhID0gMTIKK19vbGRfdmFsdWUgPSAtNAorX25ld192YWx1ZSA9IC04CisKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIG1vdmwgICAgJWVzcCwgJWVicAorICAgICAgICBzdWJsICAgICQ4LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYngKKyAgICAgICAgbW92bCAgICBfYWRkciglZWJwKSwgJWVzaQorTDIyOgorICAgICAgICBmbGRzICAgICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0cyAgICBfb2xkX3ZhbHVlKCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorICAgICAgICBmYWRkcyAgIF9kYXRhKCVlYnApCisgICAgICAgIGZzdHBzICAgX25ld192YWx1ZSglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZGF0YQorCisgICAgICAgIG1vdmwgICAgX29sZF92YWx1ZSglZWJwKSwgJWVheAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBvbGRfdmFsdWUKKyAgICAgICAgbW92bCAgICBfbmV3X3ZhbHVlKCVlYnApLCAlZWJ4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIG5ld192YWx1ZQorCisJbG9jaworCWNtcHhjaGdsICVlYngsKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlICVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpGIGFuZCBsb2FkICVFQlggaW50byA8YWRkcj4uICBFbHNlLCBjbGVhcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gWkYgYW5kIGxvYWQgPGFkZHI+IGludG8gJUVBWC4KKyAgICAgICAgam56ICAgICBMMjIKKworCisgICAgICAgIGZsZHMgICAgX29sZF92YWx1ZSglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CisvLworLy8ga21wX3JlYWw2NAorLy8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKmFkZHIsIGttcF9yZWFsNjQgZGF0YSApOworLy8KKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKworX2FkZHIgPSA4CitfZGF0YSA9IDEyCitfb2xkX3ZhbHVlID0gLTgKK19uZXdfdmFsdWUgPSAtMTYKKworICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIHN1YmwgICAgJDE2LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYngKKyAgICAgICAgcHVzaGwgICAlZWN4CisgICAgICAgIHB1c2hsICAgJWVkeAorICAgICAgICBtb3ZsICAgIF9hZGRyKCVlYnApLCAlZXNpCitMNDQ6CisgICAgICAgIGZsZGwgICAgKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIDxhZGRyPgorICAgICAgICBmc3RsICAgIF9vbGRfdmFsdWUoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGludG8gb2xkX3ZhbHVlCisgICAgICAgIGZhZGRsICAgX2RhdGEoJWVicCkKKyAgICAgICAgZnN0cGwgICBfbmV3X3ZhbHVlKCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkYXRhCisKKyAgICAgICAgbW92bCAgICBfb2xkX3ZhbHVlKzQoJWVicCksICVlZHgKKyAgICAgICAgbW92bCAgICBfb2xkX3ZhbHVlKCVlYnApLCAlZWF4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIG9sZF92YWx1ZQorICAgICAgICBtb3ZsICAgIF9uZXdfdmFsdWUrNCglZWJwKSwgJWVjeAorICAgICAgICBtb3ZsICAgIF9uZXdfdmFsdWUoJWVicCksICVlYngKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgbmV3X3ZhbHVlCisKKwlsb2NrCisJY21weGNoZzhiICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSAlRURYOiVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpGIGFuZCBsb2FkICVFQ1g6JUVCWCBpbnRvIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBaRiBhbmQgbG9hZCA8YWRkcj4gaW50byAlRURYOiVFQVguCisgICAgICAgIGpueiAgICAgTDQ0CisKKworICAgICAgICBmbGRsICAgIF9vbGRfdmFsdWUoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGRfdmFsdWUKKyAgICAgICAgcG9wbCAgICAlZWR4CisgICAgICAgIHBvcGwgICAgJWVjeAorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmbGRjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAkJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlzdWJsICQ4LCVlc3AJCS8vIGFsbG9jYXRlIHNwYWNlIGZvciB0d28gbG9jYWwgdmFyaWFibGVzLgorCQkJCS8vIFRoZXNlIHZhcmliYWxlcyBhcmU6CisJCQkJLy8JYXJndjogLTQoJWVicCkKKwkJCQkvLwl0ZW1wOiAtOCglZWJwKQorCQkJCS8vCisJcHVzaGwgJWVieAkJLy8gc2F2ZSAlZWJ4IHRvIHVzZSBkdXJpbmcgdGhpcyByb3V0aW5lCisJCQkJLy8KKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworLmludm9rZV8yOgorCWNtcGwgJDAsJWVieAorCWpnICAuaW52b2tlXzQKKwlqbXAgLmludm9rZV8zCisJQUxJR04gMgorLmludm9rZV80OgorCW1vdmwgLTQoJWVicCksJWVheAorCXN1YmwgJDQsJWVieAkJCS8vIGRlY3JlbWVudCBhcmdjLgorCWFkZGwgJWVieCwlZWF4CQkJLy8gaW5kZXggaW50byBhcmd2LgorCW1vdmwgKCVlYXgpLCVlZHgKKwlwdXNobCAlZWR4CisKKwlqbXAgLmludm9rZV8yCisJQUxJR04gMgorLmludm9rZV8zOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKworLy8ga21wX3VpbnQ2NAorLy8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCisJUFJPQyAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisJcmR0c2MKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZAorLy8gSW50ZWwoUikgNjQgcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tIE1hY2hpbmUgdHlwZSBQCisvLyBtYXJrX2Rlc2NyaXB0aW9uICJJbnRlbCBDb3Jwb3JhdGlvbiI7CisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKy8vIC0tCS5maWxlICJ6X0xpbnV4X2FzbS5zIgorCS5kYXRhCisJQUxJR04gNAorCisvLyBBQzogVGhlIGZvbGxvd2luZyAjaWYgaGlkZW4gdGhlIC50ZXh0IHRodXMgbW92aW5nIHRoZSByZXN0IG9mIGNvZGUgaW50byAuZGF0YSBzZWN0aW9uIG9uIE1JQy4KKy8vIFRvIHByZXZlbnQgdGhpcyBpbiBmdXR1cmUgLnRleHQgYWRkZWQgdG8gZXZlcnkgcm91dGluZSBkZWZpbml0aW9uIGZvciB4ODZfNjQuCisjIGlmIF9fTUlDX18gfHwgX19NSUMyX18KKworIyBlbHNlCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeDg2X3BhdXNlCisvLworLy8gdm9pZAorLy8gX19rbXBfeDg2X3BhdXNlKCB2b2lkICk7CisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3g4Nl9wYXVzZQorCisgICAgICAgIHBhdXNlX29wCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeDg2X3BhdXNlCisKKyMgZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAltb2RlOgkJJWVkaQorLy8gCW1vZGUyOgkJJWVzaQorLy8gCWNwdWlkX2J1ZmZlcjoJJXJkeAorCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNocSAgJXJicAorCW1vdnEgICAlcnNwLCVyYnAKKyAgICAgICAgcHVzaHEgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorCisJbW92bCAgICVlc2ksICVlY3gJCS8vICJtb2RlMiIKKwltb3ZsICAgJWVkaSwgJWVheAkJLy8gIm1vZGUiCisgICAgICAgIG1vdnEgICAlcmR4LCAlcnNpICAgICAgICAgICAgICAgLy8gY3B1aWRfYnVmZmVyCisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgICAlZWF4LCAwKCVyc2kpCQkvLyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92bCAgICVlYngsIDQoJXJzaSkKKwltb3ZsICAgJWVjeCwgOCglcnNpKQorCW1vdmwgICAlZWR4LCAxMiglcnNpKQorCisgICAgICAgIHBvcHEgICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92cSAgICVyYnAsICVyc3AKKyAgICAgICAgcG9wcSAgICVyYnAKKwlyZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vCXJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaWwKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfeGNoZ19maXhlZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8gcmV0dXJuOgklcmF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hncSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlcmF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTZfcmV0KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisjIGlmICEgKF9fTUlDX18gfHwgX19NSUMyX18pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKKy8vCisvLyBrbXBfcmVhbDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlhZGRyOgklcmRpCisvLyAJZGF0YToJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisvLworLy8gcmV0dXJuOgkleG1tMCAobG93ZXIgNCBieXRlcykKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorMToKKwltb3ZzcyAgICglcmRpKSwgJXhtbTEJLy8gbG9hZCB2YWx1ZSBvZiA8YWRkcj4KKwltb3ZkCSV4bW0xLCAlZWF4CS8vIHNhdmUgb2xkIHZhbHVlIG9mIDxhZGRyPgorCisJYWRkc3MJJXhtbTAsICV4bW0xCS8vIG5ldyB2YWx1ZSA9IG9sZCB2YWx1ZSArIDxkYXRhPgorCW1vdmQJJXhtbTEsICVlY3gJLy8gbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCisJbG9jaworCWNtcHhjaGdsICVlY3gsICglcmRpKQkvLyBDb21wYXJlICVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8vIFpGIGFuZCBleGNoYW5nZSAlRUNYIHdpdGggPGFkZHI+LiAgRWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgWkYgYW5kIGxvYWQgPGFkZHI+IGludG8gJUVBWC4KKyAgICAgICAganogICAgICAyZgorCXBhdXNlX29wCisJam1wCTFiCisyOgorCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKy8vCisvLyBrbXBfcmVhbDY0CisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgYWRkcjogICAlcmRpCisvLyAgICAgIGRhdGE6ICAgJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLyAgICAgIHJldHVybjogJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CisxOgorICAgICAgICBtb3ZscGQJKCVyZGkpLCAleG1tMQkvLyBsb2FkIHZhbHVlIG9mIDxhZGRyPgorCW1vdmQJJXhtbTEsICVyYXgJLy8gc2F2ZSBvbGQgdmFsdWUgb2YgPGFkZHI+CisKKwlhZGRzZAkleG1tMCwgJXhtbTEJLy8gbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAkleG1tMSwgJXJjeAkvLyBtb3ZlIG5ldyB2YWx1ZSB0byBHUCByZWcuCisKKwlsb2NrCisJY21weGNoZ3EgICVyY3gsICglcmRpKSAJLy8gQ29tcGFyZSAlUkFYIHdpdGggPGFkZHI+LiAgSWYgZXF1YWwgc2V0CisJCQkJLy8gWkYgYW5kIGV4Y2hhbmdlICVSQ1ggd2l0aCA8YWRkcj4uICBFbHNlLAorCQkJCS8vIGNsZWFyIFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvICVSQVguCisgICAgICAgIGp6ICAgICAgMmYKKwlwYXVzZV9vcAorCWptcCAgICAgMWIKKworMjoKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CSVyZGkKKy8vIAlkYXRhOgkleG1tMCAobG93ZXIgNCBieXRlcykKKy8vCisvLyByZXR1cm46CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKwltb3ZkCSV4bW0wLCAlZWF4CS8vIGxvYWQgImRhdGEiIHRvIGVheAorCisgICAgICAgICBsb2NrCisgICAgICAgICB4Y2hnbCAlZWF4LCAoJXJkaSkKKworCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKworICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWw2NAorLy8KKy8vIGttcF9yZWFsNjQKKy8vIF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICphZGRyLCBrbXBfcmVhbDY0IGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICBhZGRyOiAgICVyZGkKKy8vICAgICAgZGF0YTogICAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vICAgICAgcmV0dXJuOiAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsNjQKKworCW1vdmQJJXhtbTAsICVyYXgJLy8gbG9hZCAiZGF0YSIgdG8gcmF4CisKKyAgICAgICAgIGxvY2sKKwl4Y2hncSAgJXJheCwgKCVyZGkpCisKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsNjQKKworCisjIGVuZGlmIC8qICEoX19NSUNfXyB8fCBfX01JQzJfXykgKi8KKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmbGRjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKy8vIFRPRE86IHJlbW92ZSB0aGUgd29ya2Fyb3VuZCBmb3IgcHJvYmxlbSB3aXRoIGZuY2xleCBpbnN0cnVjdGlvbiAobm8gQ1Ega25vd24pCisgICAgICAgIGZzdGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBzdG9yZSBGUCBlbnYKKyAgICAgICAgYW5kdyAgICAkfjB4ODBmZiwgNC0zMiglcnNwKSAgIC8vIGNsZWFyIDAtNywxNSBiaXRzIG9mIEZQIFNXCisgICAgICAgIGZsZGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBsb2FkIEZQIGVudiBiYWNrCisgICAgICAgIHJldAorI2Vsc2UKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorI2VuZGlmCisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIG5vdGU6CisvLwlhdCBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlICVyc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICAlcmRpOiAgCXBrZm4KKy8vCSVlc2k6CWd0aWQKKy8vCSVlZHg6CXRpZAorLy8JJWVjeDoJYXJnYworLy8JJXI4OglwX2FyZ3YKKy8vCisvLyBsb2NhbHM6CisvLwlfX2d0aWQ6CWd0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJmd0aWQgdG8gcGtmbgorLy8JX190aWQ6CXRpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKy8vCisvLyByZWcgdGVtcHM6CisvLwklcmF4Ogl1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorLy8JJXJkeDoJdXNlZCBpbiBzdGFjayBwb2ludGVyIGFsaWdubWVudCBjYWxjdWxhdGlvbgorLy8JJXIxMToJdXNlZCB0byB0cmF2ZXJzZSBwX2FyZ3YgYXJyYXkKKy8vCSVyc2k6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwYXJhbWV0ZXJzCisvLwkJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIG51bWJlciBvZiBwa2ZuIHBhcm1zIHRvIHB1c2gKKy8vCSVyYng6CXVzZWQgdG8gaG9sZCBwa2ZuIGFkZHJlc3MsIGFuZCB6ZXJvIGNvbnN0YW50LCBjYWxsZWUtc2F2ZQorLy8KKy8vIHJldHVybjoJJWVheCAJKGFsd2F5cyAxL1RSVUUpCisvLworCitfX2d0aWQgPSAtMTYKK19fdGlkID0gLTI0CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJcHVzaHEgCSVyYnAJCS8vIHNhdmUgYmFzZSBwb2ludGVyCisJbW92cSAJJXJzcCwlcmJwCS8vIGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGlzIHJvdXRpbmUuCisJcHVzaHEgCSVyYngJCS8vICVyYnggaXMgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyCisKKwlwdXNocQklcnNpCQkvLyBQdXQgZ3RpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGdpZCB0byBwa2ZuCisJcHVzaHEJJXJkeAkJLy8gUHV0IHRpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKworCW1vdnEJJXJjeCwgJXJheAkvLyBTdGFjayBhbGlnbm1lbnQgY2FsY3VsYXRpb24gYmVnaW5zOyBhcmdjIC0+ICVyYXgKKwltb3ZxCSQwLCAlcmJ4CS8vIGNvbnN0YW50IGZvciBjbW92cyBsYXRlcgorCXN1YnEJJDQsICVyYXgJLy8gc3VidHJhY3QgZm91ciBhcmdzIHBhc3NlZCBpbiByZWdpc3RlcnMgdG8gcGtmbgorI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKwlqcwlMX2ttcF8wCQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJTF9rbXBfMF9leGl0CS8vIGp1bXAgYWhlYWQKK0xfa21wXzA6CisJbW92cQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorTF9rbXBfMF9leGl0OgorI2Vsc2UKKwljbW92c3EJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKKyNlbmRpZiAvLyBfX01JQ19fIHx8IF9fTUlDMl9fCisKKwltb3ZxCSVyYXgsICVyc2kJLy8gc2F2ZSBtYXgoMCwgYXJnYy00KSAtPiAlcnNpIGZvciBsYXRlcgorCXNobHEgCSQzLCAlcmF4CS8vIE51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN0YWNrOiBtYXgoMCwgYXJnYy00KSo4CisKKwltb3ZxIAklcnNwLCAlcmR4CS8vCisJc3VicSAJJXJheCwgJXJkeAkvLyAlcnNwLShtYXgoMCxhcmdjLTQpKjgpIC0+ICVyZHggLS0KKwkJCQkvLyB3aXRob3V0IGFsaWduLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdnEgCSVyZHgsICVyYXgJLy8gU2F2ZSB0byAlcmF4CisKKwlhbmRxIAkkMHhGRkZGRkZGRkZGRkZGRjgwLCAlcmF4ICAvLyBtYXNrIG9mZiBsb3dlciA3IGJpdHMgKDEyOCBieXRlcyBhbGlnbikKKwlzdWJxIAklcmF4LCAlcmR4CS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVyc3AKKwlzdWJxIAklcmR4LCAlcnNwCS8vIFByZXBhcmUgdGhlIHN0YWNrIHB0ciAtLQorCQkJCS8vIG5vdyAlcnNwIHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYm91bmRhcnkgYXQgY2FsbCBzaXRlCisKKwkJCQkvLyBzZXR1cCBwa2ZuIHBhcmFtZXRlciByZWcgYW5kIHN0YWNrCisJbW92cQklcmN4LCAlcmF4CS8vIGFyZ2MgLT4gJXJheAorCWNtcHEJJDAsICVyc2kKKwlqZQlMX2ttcF9pbnZva2VfcGFzc19wYXJtcwkvLyBqdW1wIGFoZWFkIGlmIG5vIHBhcm1zIHRvIHB1c2gKKwlzaGxxCSQzLCAlcmN4CS8vIGFyZ2MqOCAtPiAlcmN4CisJbW92cSAJJXI4LCAlcmR4CS8vIHBfYXJndiAtPiAlcmR4CisJYWRkcQklcmN4LCAlcmR4CS8vICZwX2FyZ3ZbYXJnY10gLT4gJXJkeAorCisJbW92cQklcnNpLCAlcmN4CS8vIG1heCAoMCwgYXJnYy00KSAtPiAlcmN4CisKK0xfa21wX2ludm9rZV9wdXNoX3Bhcm1zOgkvLyBwdXNoIG50aCAtIDd0aCBwYXJtcyB0byBwa2ZuIG9uIHN0YWNrCisJc3VicQkkOCwgJXJkeAkvLyBkZWNyZW1lbnQgcF9hcmd2IHBvaW50ZXIgdG8gcHJldmlvdXMgcGFybQorCW1vdnEJKCVyZHgpLCAlcnNpCS8vIHBfYXJndlslcmN4LTFdIC0+ICVyc2kKKwlwdXNocQklcnNpCQkvLyBwdXNoIHBfYXJndlslcmN4LTFdIG9udG8gc3RhY2sgKHJldmVyc2Ugb3JkZXIpCisJc3VibAkkMSwgJWVjeAorCisvLyBDNjk1NzA6ICJYODZfNjRfUkVMT0NfQlJBTkNIIG5vdCBzdXBwb3J0ZWQiIGVycm9yIGF0IGxpbmtpbmcgb24gbWFjXzMyZQorLy8JCWlmIHRoZSBuYW1lIG9mIHRoZSBsYWJlbCB0aGF0IGlzIGFuIG9wZXJhbmQgb2YgdGhpcyBqZWN4eiBzdGFydHMgd2l0aCBhIGRvdCAoIi4iKTsKKy8vCSAgIEFwcGxlJ3MgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgMS1ieXRlIGxlbmd0aCByZWxvY2F0aW9uOworLy8gICAgICAgICBSZXNvbHV0aW9uOiByZXBsYWNlIGFsbCAubGFiZWxYIGVudHJpZXMgd2l0aCBMX2xhYmVsWC4KKworCWplY3h6ICAgTF9rbXBfaW52b2tlX3Bhc3NfcGFybXMgIC8vIHN0b3Agd2hlbiBmb3VyIHBfYXJndltdIHBhcm1zIGxlZnQKKwlqbXAJTF9rbXBfaW52b2tlX3B1c2hfcGFybXMKKworCUFMSUdOIDMKK0xfa21wX2ludm9rZV9wYXNzX3Bhcm1zOgkvLyBwdXQgMXN0IC0gNnRoIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzLgorCQkJCS8vIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRyYXNoaW5nCisJCQkJLy8gcmVnaXN0ZXJzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBwYXJtcyEKKwltb3ZxCSVyZGksICVyYngJLy8gcGtmbiAtPiAlcmJ4CisJbGVhcQlfX2d0aWQoJXJicCksICVyZGkgLy8gJmd0aWQgLT4gJXJkaSAoc3RvcmUgMXN0IHBhcm0gdG8gcGtmbikKKwlsZWFxCV9fdGlkKCVyYnApLCAlcnNpICAvLyAmdGlkIC0+ICVyc2kgKHN0b3JlIDJuZCBwYXJtIHRvIHBrZm4pCisKKwltb3ZxCSVyOCwgJXIxMQkvLyBwX2FyZ3YgLT4gJXIxMQorCisjaWYgX19NSUNfXyB8fCBfX01JQzJfXworCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWpucwlMX2ttcF80CQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJTF9rbXBfNF9leGl0ICAgIC8vIGp1bXAgYWhlYWQKK0xfa21wXzQ6CisJbW92cQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCitMX2ttcF80X2V4aXQ6CisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwlqbnMJTF9rbXBfMwkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzNfZXhpdCAgICAvLyBqdW1wIGFoZWFkCitMX2ttcF8zOgorCW1vdnEJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorTF9rbXBfM19leGl0OgorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJam5zCUxfa21wXzIJCS8vIGp1bXAgdG8gbW92cQorCWptcAlMX2ttcF8yX2V4aXQgICAgLy8ganVtcCBhaGVhZAorTF9rbXBfMjoKKwltb3ZxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCitMX2ttcF8yX2V4aXQ6CisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwlqbnMJTF9rbXBfMQkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzFfZXhpdCAgICAvLyBqdW1wIGFoZWFkCitMX2ttcF8xOgorCW1vdnEJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorTF9rbXBfMV9leGl0OgorI2Vsc2UKKwljbXBxCSQ0LCAlcmF4CS8vIGFyZ2MgPj0gND8KKwljbW92bnNxCTI0KCVyMTEpLCAlcjkJLy8gcF9hcmd2WzNdIC0+ICVyOSAoc3RvcmUgNnRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDMsICVyYXgJLy8gYXJnYyA+PSAzPworCWNtb3Zuc3EJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJY21vdm5zcQk4KCVyMTEpLCAlcmN4CS8vIHBfYXJndlsxXSAtPiAlcmN4IChzdG9yZSA0dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMSwgJXJheAkvLyBhcmdjID49IDE/CisJY21vdm5zcQkoJXIxMSksICVyZHgJLy8gcF9hcmd2WzBdIC0+ICVyZHggKHN0b3JlIDNyZCBwYXJtIHRvIHBrZm4pCisjZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisJY2FsbAkqJXJieAkJLy8gY2FsbCAoKnBrZm4pKCk7CisJbW92cQkkMSwgJXJheAkvLyBtb3ZlIDEgaW50byByZXR1cm4gcmVnaXN0ZXI7CisKKwltb3ZxCS04KCVyYnApLCAlcmJ4CS8vIHJlc3RvcmUgJXJieAl1c2luZyAlcmJwIHNpbmNlICVyc3Agd2FzIG1vZGlmaWVkCisJbW92cSAJJXJicCwgJXJzcAkvLyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwlwb3BxIAklcmJwCQkvLyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKy8vIGttcF91aW50NjQKKy8vIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQorICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCXJkdHNjCisJc2hscSAgICAkMzIsICVyZHgKKwlvcnEgICAgICVyZHgsICVyYXgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2JzcjMyCisvLworLy8gaW50CisvLyBfX2ttcF9ic3IzMiggaW50ICk7CisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2JzcjMyCisKKyAgICAgICAgYnNyICAgICVlZGksJWVheAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2JzcjMyCisKKwkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfQVJDSF9BUk0KKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA0CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuNGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorI2VuZGlmIC8qIEtNUF9BUkNIX0FSTSAqLworCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKy5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jIGIvcmMxL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzNmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMKQEAgLTAsMCArMSwyNTY3IEBACisvKgorICogel9MaW51eF91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQyODQ3ICQKKyAqICREYXRlOiAyMDEzLTExLTI2IDA5OjEwOjAxIC0wNjAwIChUdWUsIDI2IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgICAgICAgLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgS01QX09TX0xJTlVYCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjIGlmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisvLyBXZSBzaG91bGQgcmVhbGx5IGluY2x1ZGUgPGZ1dGV4Lmg+LCBidXQgdGhhdCBjYXVzZXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBvbiBkaWZmZXJlbnQKKy8vIExpbnV4KiBPUyBkaXN0cmlidXRpb25zIHRoYXQgZWl0aGVyIHJlcXVpcmUgdGhhdCB5b3UgaW5jbHVkZSAob3IgYnJlYWsgd2hlbiB5b3UgdHJ5IHRvIGluY2x1ZGUpCisvLyA8cGNpL3R5cGVzLmg+LgorLy8gU2luY2UgYWxsIHdlIG5lZWQgaXMgdGhlIHR3byBtYWNyb3MgYmVsb3cgKHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgQUJJLCBzbyBjYW4ndCBjaGFuZ2UpCisvLyB3ZSBqdXN0IGRlZmluZSB0aGUgY29uc3RhbnRzIGhlcmUgYW5kIGRvbid0IGluY2x1ZGUgPGZ1dGV4Lmg+CisjICBpZm5kZWYgRlVURVhfV0FJVAorIyAgIGRlZmluZSBGVVRFWF9XQUlUICAgIDAKKyMgIGVuZGlmCisjICBpZm5kZWYgRlVURVhfV0FLRQorIyAgIGRlZmluZSBGVVRFWF9XQUtFICAgIDEKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBLTVBfT1NfREFSV0lOCisjIGluY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyMgaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjZWxpZiBLTVBfT1NfRlJFRUJTRAorIyBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjIGluY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8vIEZvciBub24teDg2IGFyY2hpdGVjdHVyZQorI2lmIEtNUF9DT01QSUxFUl9HQ0MgJiYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjIGluY2x1ZGUgPGZmaS5oPgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBrbXBfc3lzX3RpbWVyIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0YXJ0OworfTsKKworLy8gQ29udmVydCB0aW1lc3BlYyB0byBuYW5vc2Vjb25kcy4KKyNkZWZpbmUgVFMyTlModGltZXNwZWMpICgoKHRpbWVzcGVjKS50dl9zZWMgKiAxZTkpICsgKHRpbWVzcGVjKS50dl9uc2VjKQorCitzdGF0aWMgc3RydWN0IGttcF9zeXNfdGltZXIgX19rbXBfc3lzX3RpbWVyX2RhdGE7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBTVEFUSUNfRUZJMl9XT1JLQVJPVU5EIHN0cnVjdCBzaWdhY3Rpb24gICAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgc2lnc2V0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc2lnc2V0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfaW5pdF9ydW50aW1lICAgPSBGQUxTRTsKKworc3RhdGljIGludCBfX2ttcF9mb3JrX2NvdW50ID0gMDsKKworc3RhdGljIHB0aHJlYWRfY29uZGF0dHJfdCAgX19rbXBfc3VzcGVuZF9jb25kX2F0dHI7CitzdGF0aWMgcHRocmVhZF9tdXRleGF0dHJfdCBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHI7CisKK3N0YXRpYyBrbXBfY29uZF9hbGlnbl90ICAgIF9fa21wX3dhaXRfY3Y7CitzdGF0aWMga21wX211dGV4X2FsaWduX3QgICBfX2ttcF93YWl0X214OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorc3RhdGljIHZvaWQKK19fa21wX3ByaW50X2NvbmQoIGNoYXIgKmJ1ZmZlciwga21wX2NvbmRfYWxpZ25fdCAqY29uZCApCit7CisgICAgc3ByaW50ZiggYnVmZmVyLCAiKGNvbmQgKGxvY2sgKCVsZCwgJWQpKSwgKGRlc2NyICglcCkpKSIsCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3RhdHVzLCBjb25kLT5jX2NvbmQuX19jX2xvY2suX19zcGlubG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBjb25kLT5jX2NvbmQuX19jX3dhaXRpbmcgKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyoKKyAqIEFmZmluaXR5IHN1cHBvcnQKKyAqLworCisvKgorICogT24gc29tZSBvZiB0aGUgb2xkZXIgT1MncyB0aGF0IHdlIGJ1aWxkIG9uLCB0aGVzZSBjb25zdGFudHMgYXJlbid0IHByZXNlbnQKKyAqIGluIDxhc20vdW5pc3RkLmg+ICNpbmNsdWRlZCBmcm9tIDxzeXMuc3lzY2FsbC5oPi4gIFRoZXkgbXVzdCBiZSB0aGUgc2FtZSBvbgorICogYWxsIHN5c3RlbXMgb2YgdGhlIHNhbWUgYXJjaCB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkLCBhbmQgdGhleSBjYW5ub3QgY2hhbmdlLgorICogc3RvbmUgZm9yZXZlci4KKyAqLworCisjICBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDI0MQorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyNDEKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyNDIKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjQyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAgMjAzCisjICAgZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDIwMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICovCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDIwNAorIyAgIGVsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyMDQKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3IgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworCisjICBlbHNlCisjICAgZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKworIyAgZW5kaWYgLyogS01QX0FSQ0hfKiAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgaW50IHJldHZhbCA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayApOworICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGVycm9yID0gZXJybm87CisgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludAorX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgga21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yICkKK3sKKyAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgIklsbGVnYWwgZ2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisKKyAgICBpbnQgcmV0dmFsID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgX19rbXBfYWZmaW5fbWFza19zaXplLCBtYXNrICk7CisgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRmF0YWxTeXNFcnJvciApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCB3aGljaCApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IChrbXBfYWZmaW5fbWFza190ICopYWxsb2NhKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgIEtNUF9DUFVfU0VUKHdoaWNoLCBtYXNrKTsKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworfQorCisvKgorICogRGV0ZXJtaW5lIGlmIHdlIGNhbiBhY2Nlc3MgYWZmaW5pdHkgZnVuY3Rpb25hbGl0eSBvbiB0aGlzIHZlcnNpb24gb2YKKyAqIExpbnV4KiBPUyBieSBjaGVja2luZyBfX05SX3NjaGVkX3tnZXQsc2V0fWFmZmluaXR5IHN5c3RlbSBjYWxscywgYW5kIHNldAorICogX19rbXBfYWZmaW5fbWFza19zaXplIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSAoMCBtZWFucyBub3QgY2FwYWJsZSkuCisgKi8KK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKGNvbnN0IGNoYXIgKmVudl92YXIpCit7CisgICAgLy8KKyAgICAvLyBDaGVjayBhbmQgc2VlIGlmIHRoZSBPUyBzdXBwb3J0cyB0aHJlYWQgYWZmaW5pdHkuCisgICAgLy8KKworIyBkZWZpbmUgS01QX0NQVV9TRVRfU0laRV9MSU1JVCAgICAgICAgICAoMTAyNCoxMDI0KQorCisgICAgaW50IGdDb2RlOworICAgIGludCBzQ29kZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpidWY7CisgICAgYnVmID0gKCBrbXBfYWZmaW5fbWFza190ICogKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUICk7CisKKyAgICAvLyBJZiBMaW51eCogT1M6CisgICAgLy8gSWYgdGhlIHN5c2NhbGwgZmFpbHMgb3IgcmV0dXJucyBhIHN1Z2dlc3Rpb24gZm9yIHRoZSBzaXplLAorICAgIC8vIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBzZWFyY2ggZm9yIGFuIGFwcHJvcHJpYXRlIHNpemUuCisgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlULCBidWYgKTsKKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAiaW5pdGlhbCBnZXRhZmZpbml0eSBjYWxsIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAvL2lmICgoZ0NvZGUgPCAwKSAmJiAoZXJybm8gPT0gRU5PU1lTKSkKKyAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7ICAvLyBzaG91bGQgYWxyZWFkeSBiZSAwCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGdDb2RlID4gMCkgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAvLyBUaGUgb3B0aW1hbCBzaXR1YXRpb246IHRoZSBPUyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAgICAgICAgLy8gaXQgZXhwZWN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQSB2ZXJpZmljYXRpb24gb2YgY29ycmVjdCBiZWhhdmlvciBpcyB0aGF0IElzZXRhZmZpbml0eSBvbiBhIE5VTEwKKyAgICAgICAgLy8gYnVmZmVyIHdpdGggdGhlIHNhbWUgc2l6ZSBmYWlscyB3aXRoIGVycm5vIHNldCB0byBFRkFVTFQuCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUZBVUxUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gZ0NvZGU7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiYWZmaW5pdHkgc3VwcG9ydGVkIChtYXNrIHNpemUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgcmVwZWF0ZWRseSB3aXRoIGluY3JlYXNpbmcgc2V0IHNpemVzCisgICAgLy8gdW50aWwgd2Ugc3VjY2VlZCwgb3IgcmVhY2ggYW4gdXBwZXIgYm91bmQgb24gdGhlIHNlYXJjaC4KKyAgICAvLworICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgInNlYXJjaGluZyBmb3IgcHJvcGVyIHNldCBzaXplXG4iKSk7CisgICAgaW50IHNpemU7CisgICAgZm9yIChzaXplID0gMTsgc2l6ZSA8PSBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUOyBzaXplICo9IDIpIHsKKyAgICAgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCAgc2l6ZSwgYnVmICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICJnZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsIHNpemUsCisgICAgICAgICAgICBnQ29kZSwgZXJybm8pKTsKKworICAgICAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgICAgICBpZiAoIGVycm5vID09IEVOT1NZUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7ICAvLyBzaG91bGQgYWxyZWFkeSBiZSAwCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IGdDb2RlOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KV9fa21wX2FmZmluX21hc2tfc2l6ZSkpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vaW50IGVycm9yID0gZXJybm87ICAvLyBzYXZlIHVuY2F1Z2h0IGVycm9yIGNvZGUKKyAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgIC8vIGVycm5vID0gZXJyb3I7ICAvLyByZXN0b3JlIHVuY2F1Z2h0IGVycm9yIGNvZGUsIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgbmV4dCBLTVBfV0FSTklORyBiZWxvdworCisgICAgLy8KKyAgICAvLyBBZmZpbml0eSBpcyBub3Qgc3VwcG9ydGVkCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgImNhbm5vdCBkZXRlcm1pbmUgbWFzayBzaXplIC0gYWZmaW5pdHkgbm90IHN1cHBvcnRlZFxuIikpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZDYW50R2V0TWFza1NpemUsIGVudl92YXIgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIENoYW5nZSB0aHJlYWQgdG8gdGhlIGFmZmluaXR5IG1hc2sgcG9pbnRlZCB0byBieSBhZmZpbl9tYXNrIGFyZ3VtZW50CisgKiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgb2xkIHZhbHVlIGluIHRoZSBvbGRfbWFzayBhcmd1bWVudCwgaWYgYXJndW1lbnQKKyAqIGlzIG5vbi1OVUxMLgorICovCisKK3ZvaWQKK19fa21wX2NoYW5nZV90aHJlYWRfYWZmaW5pdHlfbWFzayggaW50IGd0aWQsIGttcF9hZmZpbl9tYXNrX3QgKm5ld19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X21hc2sgIT0gTlVMTCApOworCisgICAgICAgIGlmICggb2xkX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIG9sZF9tYXNrLCBUUlVFICk7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENoYW5nZVRocmVhZEFmZk1hc2tFcnJvciApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBuZXdfbWFzaywgVFJVRSApOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIG9sZF9idWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIGNoYXIgbmV3X2J1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhvbGRfYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZF9tYXNrKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2sobmV3X2J1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBuZXdfbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBDaGFuZ2VBZmZNYXNrLCAiS01QX0FGRklOSVRZIChCaW5kKSIsIGd0aWQsIG9sZF9idWYsIG5ld19idWYgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLyogTWFrZSBzdXJlIG9sZCB2YWx1ZSBpcyBjb3JyZWN0IGluIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX21hc2sgIT0gTlVMTCAmJiAobWVtY21wKG9sZF9tYXNrLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUpID09IDApICk7CisgICAgICAgIEtNUF9DUFVfQ09QWSggdGgtPnRoLnRoX2FmZmluX21hc2ssIG5ld19tYXNrICk7CisgICAgfQorfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKK2ludAorX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKQoreworICAgIGludCBsb2MgPSAwOworICAgIGludCByYyA9IHN5c2NhbGwoIF9fTlJfZnV0ZXgsICZsb2MsIEZVVEVYX1dBS0UsIDEsIE5VTEwsIE5VTEwsIDAgKTsKKyAgICBpbnQgcmV0dmFsID0gKCByYyA9PSAwICkgfHwgKCBlcnJubyAhPSBFTk9TWVMgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogcmMgPSAlZCBlcnJubyA9ICVkXG4iLCByYywKKyAgICAgIGVycm5vICkgKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGU6IGZ1dGV4IHN5c2NhbGwlcyBzdXBwb3J0ZWRcbiIsCisgICAgICAgIHJldHZhbCA/ICIiIDogIiBub3QiICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykKKy8qCisgKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgKiB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzCisgKi8KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjIGlmIEtNUF9BUkNIX1g4Ngora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjZW5kaWYgLyogKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykgKi8KKwordm9pZAorX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCAhdGggKSByZXR1cm47CisKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NhbmNlbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVTUkNIICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50VGVybWluYXRlV29ya2VyVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisgICAgX19rbXBfeWllbGQoIFRSVUUgKTsKK30gLy8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNldCB0aHJlYWQgc3RhY2sgaW5mbyBhY2NvcmRpbmcgdG8gdmFsdWVzIHJldHVybmVkIGJ5CisgKiBwdGhyZWFkX2dldGF0dHJfbnAoKS4KKyAqIElmIHZhbHVlcyBhcmUgdW5yZWFzb25hYmxlLCBhc3N1bWUgY2FsbCBmYWlsZWQgYW5kIHVzZQorICogaW5jcmVtZW50YWwgc3RhY2sgcmVmaW5lbWVudCBtZXRob2QgaW5zdGVhZC4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgc3RhY2sgcGFyYW1ldGVycyBjb3VsZCBiZSBkZXRlcm1pbmVkIGV4YWN0bHksCisgKiBGQUxTRSBpZiBpbmNyZW1lbnRhbCByZWZpbmVtZW50IGlzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGttcF9pbnQzMgorX19rbXBfc2V0X3N0YWNrX2luZm8oIGludCBndGlkLCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgICAgc3RhY2tfZGF0YTsKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKyAgICAvKiBMaW51eCogT1Mgb25seSAtLSBubyBwdGhyZWFkX2dldGF0dHJfbnAgc3VwcG9ydCBvbiBPUyBYKiAqLworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworICAgIHNpemVfdCAgICAgICAgIHNpemUgPSAwOworICAgIHZvaWQgKiAgICAgICAgIGFkZHIgPSAwOworCisgICAgLyogQWx3YXlzIGRvIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgZm9yIHViZXJtYXN0ZXIgdGhyZWFkcyBzaW5jZSB0aGUgaW5pdGlhbAorICAgICAgIHRocmVhZCBzdGFjayByYW5nZSBjYW4gYmUgcmVkdWNlZCBieSBzaWJsaW5nIHRocmVhZCBjcmVhdGlvbiBzbyBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sKKyAgICAgICBtYXkgY2F1c2UgdGhyZWFkIGd0aWQgYWxpYXNpbmcgKi8KKyAgICBpZiAoICEgS01QX1VCRVJfR1RJRChndGlkKSApIHsKKworICAgICAgICAvKiBGZXRjaCB0aGUgcmVhbCB0aHJlYWQgYXR0cmlidXRlcyAqLworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfaW5pdCIsIHN0YXR1cyApOworI2lmIEtNUF9PU19GUkVFQlNECisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRfbnAiLCBzdGF0dXMgKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfZ2V0YXR0cl9ucCggcHRocmVhZF9zZWxmKCksICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9nZXRhdHRyX25wIiwgc3RhdHVzICk7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCAmYXR0ciwgJmFkZHIsICZzaXplICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrIiwgc3RhdHVzICk7CisgICAgICAgIEtBX1RSQUNFKCA2MCwgKCAiX19rbXBfc2V0X3N0YWNrX2luZm86IFQjJWQgcHRocmVhZF9hdHRyX2dldHN0YWNrIHJldHVybmVkIHNpemU6ICVsdSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImxvdyBhZGRyOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemUsIGFkZHIgKSk7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgIT0gMCAmJiBhZGRyICE9IDAgKSB7ICAgICAvKiB3YXMgc3RhY2sgcGFyYW1ldGVyIGRldGVybWluYXRpb24gc3VjY2Vzc2Z1bD8gKi8KKyAgICAgICAgLyogU3RvcmUgdGhlIGNvcnJlY3QgYmFzZSBhbmQgc2l6ZSAqLworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgKCgoY2hhciAqKWFkZHIpICsgc2l6ZSkpOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc2l6ZSk7CisgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYgLyogS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEICovCisKKyAgICAvKiBVc2UgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBzdGFydGluZyBmcm9tIGluaXRpYWwgY29uc2VydmF0aXZlIGVzdGltYXRlICovCisgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIDApOworICAgIFRDV19QVFIodGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQqCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICp0aHIgKQoreworICAgIGludCBzdGF0dXMsIG9sZF90eXBlLCBvbGRfc3RhdGU7CisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzaWdzZXRfdCAgICBuZXdfc2V0LCBvbGRfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgICAgdm9pZCAqZXhpdF92YWw7CisgICAgdm9pZCAqcGFkZGluZyA9IDA7CisgICAgaW50IGd0aWQ7CisgICAgaW50IGVycm9yOworCisgICAgZ3RpZCA9ICgoa21wX2luZm9fdCopdGhyKSAtPiB0aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIF9fa21wX2d0aWQgPSBndGlkOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfQkxPQ0ssICYgbmV3X3NldCwgJiBvbGRfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNECisgICAgaWYgKCBfX2ttcF9zdGtvZmZzZXQgPiAwICYmIGd0aWQgPiAwICkgeworICAgICAgICBwYWRkaW5nID0gYWxsb2NhKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgKGttcF9pbmZvX3QqKXRociApOworCisgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggKGttcF9pbmZvX3QqKXRociApOworCisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCAoa21wX2luZm9fdCAqKSB0aHIgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfU0VUTUFTSywgJiBvbGRfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKworc3RhdGljIHZvaWQqCitfX2ttcF9sYXVuY2hfbW9uaXRvciggdm9pZCAqdGhyICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMsIG9sZF90eXBlLCBvbGRfc3RhdGU7CisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzaWdzZXRfdCAgICBuZXdfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgICAgc3RydWN0IHRpbWVzcGVjICBpbnRlcnZhbDsKKyAgICBpbnQgeWllbGRfY291bnQ7CisgICAgaW50IHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgaW50IGVycm9yOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMxIGxhdW5jaGVkXG4iICkgKTsKKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGZpeCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb24gd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgd29yay4KKyAgICAvLyBIb3dldmVyLCBkZWNpc2lvbiBhYm91dCB0aGUgZml4IGlzIG5vdCBtYWRlIHlldCwgc28gaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgICAgIGludCBzY2hlZCA9IHNjaGVkX2dldHNjaGVkdWxlciggMCApOworICAgICAgICBpZiAoIHNjaGVkID09IFNDSEVEX0ZJRk8gfHwgc2NoZWQgPT0gU0NIRURfUlIgKSB7CisgICAgICAgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgICAgICAgICAgLy8gbW9uaXRvci4KKyAgICAgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgICAgIGludCAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBzY2hlZCApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgKTsKKyAgICAgICAgICAgIHNjaGVkX2dldHBhcmFtKCAwLCAmIHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIHBhcmFtLnNjaGVkX3ByaW9yaXR5IDwgbWF4X3ByaW9yaXR5ICkgeworICAgICAgICAgICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ICs9IDE7CisgICAgICAgICAgICAgICAgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIoIDAsIHNjaGVkLCAmIHBhcmFtICk7CisgICAgICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBNb25pdG9yV2lsbFN0YXJ2ZSApLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBhYm9ydCBoZXJlLCBiZWNhdXNlIG51bWJlciBvZiBDUFVzIG1heSBiZSBlbm91Z2ggZm9yIGFsbCB0aGUgdGhyZWFkcywKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIG1vbml0b3IgdGhyZWFkLCBzbyBhcHBsaWNhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSB3b3JrLi4uCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIGlmICggX19rbXBfbW9uaXRvcl93YWtldXBzID09IDEgKSB7CisgICAgICAgIGludGVydmFsLnR2X3NlYyAgPSAxOworICAgICAgICBpbnRlcnZhbC50dl9uc2VjID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnRlcnZhbC50dl9zZWMgID0gMDsKKyAgICAgICAgaW50ZXJ2YWwudHZfbnNlYyA9IChOU0VDX1BFUl9TRUMgLyBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzIgbW9uaXRvclxuIiApICk7CisKKyAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAwOyAgLyogU3RhcnQgb3V0IHdpdGggeWllbGRpbmcgc2h1dCBvZmYgKi8KKyAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgLyogWWllbGRpbmcgaXMgb24gcGVybWFuZW50bHkgKi8KKyAgICB9CisKKyAgICB3aGlsZSggISBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lICkgKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgIHR2YWw7CisKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmbm93ICk7CisKKyAgICAgICAgbm93LnR2X3NlYyAgKz0gaW50ZXJ2YWwudHZfc2VjOworICAgICAgICBub3cudHZfbnNlYyArPSBpbnRlcnZhbC50dl9uc2VjOworCisgICAgICAgIGlmIChub3cudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKKyAgICAgICAgICAgIG5vdy50dl9zZWMgICs9IDE7CisgICAgICAgICAgICBub3cudHZfbnNlYyAtPSBOU0VDX1BFUl9TRUM7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICYgX19rbXBfd2FpdF9jdi5jX2NvbmQsICYgX19rbXBfd2FpdF9teC5tX211dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG5vdyApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gRVRJTUVET1VUICYmIHN0YXR1cyAhPSBFSU5UUiApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF90aW1lZHdhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKworICAgICAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgICAgIHlpZWxkX2N5Y2xlcysrOworICAgICAgICAgICAgaWYgKCAoeWllbGRfY3ljbGVzICUgeWllbGRfY291bnQpID09IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgICAvKiBUdXJuIGl0IG9mZiBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgIC8qIFR1cm4gaXQgb24gbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKyAxICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMyBjbGVhbnVwXG4iICkgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfVU5CTE9DSywgJiBuZXdfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNCBmaW5pc2hlZFxuIiApICk7CisKKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwICkgeworICAgICAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzUgdGVybWluYXRlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgLyogdGVybWluYXRlIHRoZSBPcGVuTVAgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgICAgICBmb3IgKGd0aWQgPSAxOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytndGlkKQorICAgICAgICAgICAgX19rbXBfdGVybWluYXRlX3RocmVhZCggZ3RpZCApOworCisgICAgICAgIF9fa21wX2NsZWFudXAoKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM2IHJhaXNlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKQorICAgICAgICAgICAgcmFpc2UoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKTsKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzcgZXhpdFxuIiApICk7CisKKyAgICByZXR1cm4gdGhyOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHViZXIgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworICAgICAgICB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgdGggKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJnRocmVhZF9hdHRyICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSggJiB0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGF0ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuICovCisgICAgICAgICAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogVCMlZCwgZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgZmluYWwgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKSApOworCisjIGlmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCBzdGFja19zaXplICk7CisjICBpZmRlZiBLTVBfQkFDS1VQX1NUS1NJWkUKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9zdGtzaXplICkgeworICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFICsgZ3RpZCAqIF9fa21wX3N0a29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3Rrc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRTsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCAoYmFja3VwKSBmaW5hbCBzdGFja3NpemUgPSAlbHUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJnRocmVhZF9hdHRyLCBzdGFja19zaXplICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGlmCisjICBlbmRpZiAvKiBLTVBfQkFDS1VQX1NUS1NJWkUgKi8KKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoYW5nZVdvcmtlclN0YWNrU2l6ZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisjIGVuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCAmIGhhbmRsZSwgJiB0aHJlYWRfYXR0ciwgX19rbXBfbGF1bmNoX3dvcmtlciwgKHZvaWQgKikgdGggKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgfHwgISBoYW5kbGUgKSB7IC8vID8/PyBXaHkgZG8gd2UgY2hlY2sgaGFuZGxlPz8KKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUlOVkFMICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEluY3JlYXNlV29ya2VyU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVOT01FTSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZVdvcmtlclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUFHQUlOICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBOb1Jlc291cmNlc0ZvcldvcmtlclRocmVhZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZV9OVU1fVEhSRUFEUyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisgICAgICAgIH0KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudERlc3Ryb3lUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IGRvbmUgY3JlYXRpbmcgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworCit9IC8vIF9fa21wX2NyZWF0ZV93b3JrZXIKKworCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIHB0aHJlYWRfdCAgICAgICAgICAgaGFuZGxlOworICAgIHB0aHJlYWRfYXR0cl90ICAgICAgdGhyZWFkX2F0dHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgICAgY2FsbGVyX2d0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGludCAgICAgICAgICAgICAgICAgYXV0b19hZGpfc2l6ZSA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAtMSApOyAvLyBXaWxsIHVzZSBpdCBmb3Igc3luY2hyb25pemF0aW9uIGEgYml0IGxhdGVyLgorICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgICAgICAgICAgYXV0b19hZGpfc2l6ZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZ0aHJlYWRfYXR0ciApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSggJiB0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGF0ZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCAmIHNpemUgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSIsIHN0YXR1cyApOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICAgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgICAgfQorICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfbW9uaXRvcjogZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsIgorICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKworICAgIHJldHJ5OgorCisgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKworICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IHNldHRpbmcgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIGlmICggYXV0b19hZGpfc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLCAgLy8gc2hvdWxkIHRoaXMgYmUgZmF0YWw/ICBCQgorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhY2tTaXplLCAobG9uZyBpbnQpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoYW5nZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworCisgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSggJmhhbmRsZSwgJiB0aHJlYWRfYXR0ciwgX19rbXBfbGF1bmNoX21vbml0b3IsICh2b2lkICopIHRoICk7CisKKyAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUlOVkFMICkgeworICAgICAgICAgICAgICAgIGlmICggYXV0b19hZGpfc2l6ZSAgJiYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCAoc2l6ZV90KTB4NDAwMDAwMDAgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBJbmNyZWFzZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVOT01FTSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgfTsgLy8gaWYKKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgICNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICAgICAgICAvLyBXYWl0IGZvciB0aGUgbW9uaXRvciB0aHJlYWQgaXMgcmVhbGx5IHN0YXJ0ZWQgYW5kIHNldCBpdHMgKnByaW9yaXR5Ki4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gc2l6ZW9mKCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICk7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNCgKKyAgICAgICAgICAgIChrbXBfdWludDMyIHZvbGF0aWxlICopICYgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIC0xLCAmIF9fa21wX25lcV80LCBOVUxMCisgICAgICAgICk7CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICAjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmIHRocmVhZF9hdHRyICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coICAgIC8vCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudERlc3Ryb3lUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJSMuOGx4XG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCit9IC8vIF9fa21wX2NyZWF0ZV9tb25pdG9yCisKK3ZvaWQKK19fa21wX2V4aXRfdGhyZWFkKAorICAgIGludCBleGl0X3N0YXR1cworKSB7CisgICAgcHRocmVhZF9leGl0KCAodm9pZCAqKSBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzLCBpOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgLy8gSWYgbW9uaXRvciBoYXMgYmVlbiBjcmVhdGVkLCBpdHMgdGlkIGFuZCBndGlkIHNob3VsZCBiZSBLTVBfR1RJRF9NT05JVE9SLgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSAwLCBpdCBtZWFucyB0aGUgbW9uaXRvciBkaWQgbm90IGV2ZXIgc3RhcnQuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIEtNUF9HVElEX0RORSwgdGhlIG1vbml0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9PSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgaWYgKCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICE9IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzLiAgVGhpcyBjb3VsZCBwcmV2ZW50IGEgaGFuZywKKyAgICAgICBidXQgaWYgdGhlIG1vbml0b3IgZGllcyBhZnRlciB0aGUgcHRocmVhZF9raWxsIGNhbGwgYW5kIGJlZm9yZSB0aGUgcHRocmVhZF9qb2luCisgICAgICAgY2FsbCwgaXQgd2lsbCBzdGlsbCBoYW5nLiAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9raWxsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDAgKTsKKyAgICBpZiAoc3RhdHVzID09IEVTUkNIKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkb2VzIG5vdCBleGlzdCwgcmV0dXJuaW5nXG4iKSApOworCisgICAgfSBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2pvaW4oIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgJiBleGl0X3ZhbCk7CisgICAgICAgIGlmIChleGl0X3ZhbCAhPSB0aCkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBSZWFwTW9uaXRvckVycm9yICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiBkb25lIHJlYXBpbmcgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworfQorCit2b2lkCitfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgdm9pZCAgICAgICAgKmV4aXRfdmFsOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHRyeSB0byByZWFwIFQjJWRcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyogRmlyc3QsIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB3b3JrZXIgdGhyZWFkIGV4aXN0cy4gIFRoaXMgY291bGQgcHJldmVudCBhIGhhbmcsCisgICAgICAgYnV0IGlmIHRoZSB3b3JrZXIgZGllcyBhZnRlciB0aGUgcHRocmVhZF9raWxsIGNhbGwgYW5kIGJlZm9yZSB0aGUgcHRocmVhZF9qb2luCisgICAgICAgY2FsbCwgaXQgd2lsbCBzdGlsbCBoYW5nLiAqLworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfa2lsbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwICk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVTUkNIKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB0cnkgdG8gam9pbiB3aXRoIHdvcmtlciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9qb2luKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICYgZXhpdF92YWwpOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIC8qIERvbid0IGV4cG9zZSB0aGVzZSB0byB0aGUgdXNlciB1bnRpbCB3ZSB1bmRlcnN0YW5kIHdoZW4gdGhleSB0cmlnZ2VyICovCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUmVhcFdvcmtlckVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGV4aXRfdmFsICE9IHRoICkgeworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkaWQgbm90IHJlYXAgcHJvcGVybHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0X3ZhbCA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgZXhpdF92YWwgKSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiBkb25lIHJlYXBpbmcgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKKworc3RhdGljIHZvaWQKK19fa21wX251bGxfaGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICAvLyAgRG8gbm90aGluZywgZm9yIGRvaW5nIFNJR19JR04tdHlwZSBhY3Rpb25zLgorfSAvLyBfX2ttcF9udWxsX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvKiBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogY2F1Z2h0IHNpZ25hbCA9ICVkXG4iLCBzaWdubyApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgc3dpdGNoICggc2lnbm8gKSB7CisgICAgICAgICAgICBjYXNlIFNJR0hVUCAgOgorICAgICAgICAgICAgY2FzZSBTSUdJTlQgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHUVVJVCA6CisgICAgICAgICAgICBjYXNlIFNJR0lMTCAgOgorICAgICAgICAgICAgY2FzZSBTSUdBQlJUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHRlBFICA6CisgICAgICAgICAgICBjYXNlIFNJR0JVUyAgOgorICAgICAgICAgICAgY2FzZSBTSUdTRUdWIDoKKyAgICAgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgICAgICBjYXNlIFNJR1NZUyA6CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgU0lHVEVSTSA6CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCwgc2lnbm8gKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogdW5rbm93biBzaWduYWwgdHlwZSIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKKworc3RhdGljCit2b2lkIF9fa21wX3NpZ2FjdGlvbiggaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqIG9sZGFjdCApIHsKKyAgICBpbnQgcmMgPSBzaWdhY3Rpb24oIHNpZ251bSwgYWN0LCBvbGRhY3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggInNpZ2FjdGlvbiIsIHJjICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIGludCBzaWcsIHNpZ19mdW5jX3QgaGFuZGxlcl9mdW5jLCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoICVkLCAuLi4sICVkIClcbiIsIHNpZywgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdGlvbjsKKyAgICAgICAgbmV3X2FjdGlvbi5zYV9oYW5kbGVyID0gaGFuZGxlcl9mdW5jOworICAgICAgICBuZXdfYWN0aW9uLnNhX2ZsYWdzICAgPSAwOworICAgICAgICBzaWdmaWxsc2V0KCAmIG5ld19hY3Rpb24uc2FfbWFzayApOworICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBuZXdfYWN0aW9uLCAmIG9sZF9hY3Rpb24gKTsKKyAgICAgICAgaWYgKCBvbGRfYWN0aW9uLnNhX2hhbmRsZXIgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdLnNhX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBzaWdhZGRzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBvbGRfYWN0aW9uLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgTlVMTCwgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkKK3sKKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggJWQgKVxuIiwgc2lnICkgKTsKKyAgICBpZiAoIHNpZ2lzbWVtYmVyKCAmIF9fa21wX3NpZ3NldCwgc2lnICkgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0sICYgb2xkICk7CisgICAgICAgIGlmICggKCBvbGQuc2FfaGFuZGxlciAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSAmJiAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX251bGxfaGFuZGxlciApICkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgdXNlcnMgc2lnbmFsIGhhbmRsZXIuCisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZCwgTlVMTCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzaWdkZWxzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIKKworCit2b2lkCitfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFscyggJWQgKVxuIiwgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBfX2ttcF9oYW5kbGVfc2lnbmFscyB8fCAhIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIC8vIElmICEgcGFyYWxsZWxfaW5pdCwgd2UgZG8gbm90IGluc3RhbGwgaGFuZGxlcnMsIGp1c3Qgc2F2ZSBvcmlnaW5hbCBoYW5kbGVycy4KKyAgICAgICAgLy8gTGV0IHVzIGRvIGl0IGV2ZW4gX19oYW5kbGVfc2lnbmFscyBpcyAwLgorICAgICAgICBzaWdlbXB0eXNldCggJiBfX2ttcF9zaWdzZXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSFVQLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdRVUlULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSUxMLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQlVTLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHU1lTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTWVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2VuZGlmIC8vIFNJR1NZUworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1BJUEUsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHUElQRQorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX2luc3RhbGxfc2lnbmFscworCisKK3ZvaWQKK19fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICkKK3sKKyAgICBpbnQgICAgc2lnOworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX3NpZ25hbHMoKVxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzLCBvbGRfc3RhdGU7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIG5ld19zdGF0ZSwgJiBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9zdGF0ZSA9PSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqIG9sZF9zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFLCBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfcHJlcGFyZSAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wYXJlbnQgKHZvaWQpCit7CisgICAgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKKy8qCisgICAgUmVzZXQgdGhlIGxpYnJhcnkgc28gZXhlY3V0aW9uIGluIHRoZSBjaGlsZCBzdGFydHMgImFsbCBvdmVyIGFnYWluIiB3aXRoCisgICAgY2xlYW4gZGF0YSBzdHJ1Y3R1cmVzIGluIGluaXRpYWwgc3RhdGVzLiAgRG9uJ3Qgd29ycnkgYWJvdXQgZnJlZWluZyBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgYnkgcGFyZW50LCBqdXN0IGFiYW5kb24gaXQgdG8gYmUgc2FmZS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX2NoaWxkICh2b2lkKQoreworICAgIC8qIFRPRE8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSByaWdodCBmb3IgbmVzdGVkL3NpYmxpbmcgKi8KKyAgICAvLyBBVFQ6ICBNZW1vcnkgbGVha3MgYXJlIGhlcmU/IFRPRE86IENoZWNrIGl0IGFuZCBmaXguCisgICAgLyogS01QX0FTU0VSVCggMCApOyAqLworCisgICAgKytfX2ttcF9mb3JrX2NvdW50OworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9tb25pdG9yID0gMDsKKyAgICBfX2ttcF9pbml0X3BhcmFsbGVsID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9taWRkbGUgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIF9fa21wX2luaXRfY29tbW9uID0gRkFMU0U7CisKKyAgICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA9IDA7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisKKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBUQ1dfNChfX2ttcF9udGgsIDApOworCisgICAgLyogTXVzdCBhY3R1YWxseSB6ZXJvIGFsbCB0aGUgKmNhY2hlIGFyZ3VtZW50cyBwYXNzZWQgdG8gX19rbXBjX3RocmVhZHByaXZhdGUgaGVyZQorICAgICAgIHNvIHRocmVhZHByaXZhdGUgZG9lc24ndCB1c2Ugc3RhbGUgZGF0YSAqLworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiBjaGVja2luZyBjYWNoZSBhZGRyZXNzIGxpc3QgJXBcbiIsCisgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCApICk7CisKKyAgICB3aGlsZSAoIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAhPSBOVUxMICkgeworCisgICAgICAgIGlmICggKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggNTAsICggIl9fa21wX2F0Zm9ya19jaGlsZDogemVyb2luZyBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgJigqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIpICkgKTsKKworICAgICAgICAgICAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gbmV4dDsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKworICAgIC8qIHJlc2V0IHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgbG9ja3MgKi8KKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9zdGRpb19sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIG5vIHN0YWxlIGRhdGEgaXMgbGVmdCBhcm91bmQgKi8KKyAgICAvKiBBQzogY3VzdG9tZXJzIGNvbXBsYWluIHRoYXQgd2UgdXNlIHVuc2FmZSByb3V0aW5lcyBpbiB0aGUgYXRmb3JrCisgICAgICAgaGFuZGxlci4gTWF0aHdvcmtzOiBkbHN5bSgpIGlzIHVuc2FmZS4gV2UgY2FsbCBkbHN5bSBhbmQgZGxvcGVuCisgICAgICAgaW4gZHluYW1pY19saW5rIHdoZW4gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHNoYXJlZCB0YmJtYWxsb2MgbGlicmFyeS4KKyAgICAgICBTdWdnZXN0aW9uIGlzIHRvIG1ha2UgdGhlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gbGF6aWVyLCBzaW1pbGFyCisgICAgICAgdG8gd2hhdCBkb25lIGZvciBfX2ttcGNfYmVnaW4oKS4gKi8KKyAgICAvLyBUT0RPOiBzeW5jaHJvbml6ZSBhbGwgc3RhdGljIGluaXRpYWxpemF0aW9ucyB3aXRoIHJlZ3VsYXIgbGlicmFyeQorICAgIC8vICAgICAgIHN0YXJ0dXA7IGxvb2sgYXQga21wX2dsb2JhbC5jIGFuZCBldGMuCisgICAgLy9fX2ttcF9pbnRlcm5hbF9iZWdpbiAoKTsKKworfQorCit2b2lkCitfX2ttcF9yZWdpc3Rlcl9hdGZvcmsodm9pZCkgeworICAgIGlmICggX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX2F0Zm9yayggX19rbXBfYXRmb3JrX3ByZXBhcmUsIF9fa21wX2F0Zm9ya19wYXJlbnQsIF9fa21wX2F0Zm9ya19jaGlsZCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXRmb3JrIiwgc3RhdHVzICk7CisgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrID0gRkFMU0U7CisgICAgfQorfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRhdHRyX2luaXQiLCBzdGF0dXMgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoIHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPD0gX19rbXBfZm9ya19jb3VudCApIHsKKyAgICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgICAgIHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZfX2ttcF9zdXNwZW5kX2NvbmRfYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgICoodm9sYXRpbGUgaW50KikmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9IF9fa21wX2ZvcmtfY291bnQgKyAxOworICAgIH07Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPiBfX2ttcF9mb3JrX2NvdW50KSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICAgICAgfTsKKyAgICAgICAgLS10aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50OworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPT0gX19rbXBfZm9ya19jb3VudCk7CisgICAgfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgKiBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgc3BpbiB2YXJpYWJsZSB0byB0cnVlLgorICovCisKK3ZvaWQKK19fa21wX3N1c3BlbmQoIGludCB0aF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwga21wX3VpbnQgY2hlY2tlciApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAga21wX3VpbnQgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZDogVCMlZCBlbnRlciBmb3Igc3BpbiA9ICVwXG4iLCB0aF9ndGlkLCBzcGlubmVyICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gS01QX1RFU1RfVEhFTl9PUjMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBzcGlubmVyLCAqc3Bpbm5lciApICk7CisKKyAgICBpZiAoIG9sZF9zcGluID09IGNoZWNrZXIgKSB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fQU5EMzIoICh2b2xhdGlsZSBrbXBfaW50MzIgKikgc3Bpbm5lciwgfihLTVBfQkFSUklFUl9TTEVFUF9TVEFURSkgKTsKKworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBmYWxzZSBhbGFybSwgcmVzZXQgc2xlZXAgYml0IGZvciBzcGluKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgc3Bpbm5lcikgKTsKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgc3Bpbm5lcik7CisgICAgICAgIHdoaWxlICggVENSXzQoICpzcGlubmVyICkgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCsrOworICAgICAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3N1c3BlbmQ6IHN1c3BlbmRpbmcgVCMlZDogJXNcbiIsIHRoX2d0aWQsIGJ1ZmZlciApOworI2VuZGlmCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgbm8gbG9uZ2VyIGFjdGl2ZQorICAgICAgICAgICAgLy8gKG9ubHkgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKworCisgICAgICAgICAgICB9CisKKyNpZiBVU0VfU1VTUEVORF9USU1FT1VUCisgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgIG5vdzsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICAgdHZhbDsKKyAgICAgICAgICAgIGludCBtc2VjczsKKworICAgICAgICAgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmbm93ICk7CisKKyAgICAgICAgICAgIG1zZWNzID0gKDQqX19rbXBfZGZsdF9ibG9ja3RpbWUpICsgMjAwOworICAgICAgICAgICAgbm93LnR2X3NlYyAgKz0gbXNlY3MgLyAxMDAwOworICAgICAgICAgICAgbm93LnR2X25zZWMgKz0gKG1zZWNzICUgMTAwMCkqMTAwMDsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0gcHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4LCAmIG5vdyApOworI2Vsc2UKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBhYm91dCB0byBwZXJmb3JtIHB0aHJlYWRfY29uZF93YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworCisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgIT0gMCkgJiYgKHN0YXR1cyAhPSBFSU5UUikgJiYgKHN0YXR1cyAhPSBFVElNRURPVVQpICkgeworICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX3dhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoKnNwaW5uZXIpICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSB7CisgICAgICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAxMDAsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgdGltZW91dCB3YWtldXBcbiIsIHRoX2d0aWQgKSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAyLCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHRpbWVvdXQgd2FrZXVwLCBzbGVlcCBiaXQgbm90IHNldCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoICgqc3Bpbm5lcikgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbgorICAgICAgICAvLyAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigKKyAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YpOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9zdXNwZW5kOiBUIyVkIGhhcyBhd2FrZW5lZDogJXNcbiIsIHRoX2d0aWQsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZDogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgKiBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBzcGluIGFyZ3VtZW50IHRvIEZBTFNFLgorICogVGhlIHRhcmdldCB0aHJlYWQgbXVzdCBhbHJlYWR5IGhhdmUgY2FsbGVkIF9fa21wX3N1c3BlbmQoKQorICovCisKK3ZvaWQKK19fa21wX3Jlc3VtZSggaW50IHRhcmdldF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3BpbiApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF91aW50IG9sZF9zcGluOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCAhPSB0YXJnZXRfZ3RpZCApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworICAgIGlmICggc3BpbiA9PSBOVUxMICkgeworICAgICAgICBzcGluID0gKHZvbGF0aWxlIGttcF91aW50ICopVENSX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgICAgICAgaWYgKCBzcGluID09IE5VTEwgKSB7CisgICAgICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2UgLSAgc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBzcGluICkgKTsKKworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbGRfc3BpbiA9IEtNUF9URVNUX1RIRU5fQU5EMzIoIChrbXBfaW50MzIgdm9sYXRpbGUgKikgc3BpbiwKKyAgICAgIH4oIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICkgKTsKKyAgICBpZiAoICggb2xkX3NwaW4gJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApID09IDAgKSB7CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZSAtICBzcGluKCVwKTogIgorICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3Bpbiwgb2xkX3NwaW4sICpzcGluICkgKTsKKworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGFib3V0IHRvIHdha2V1cCBUIyVkLCByZXNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApOiAiCisgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBzcGluLCBvbGRfc3BpbiwgKnNwaW4gKSApOworCisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfcmVzdW1lOiBUIyVkIHJlc3VtaW5nIFQjJWQ6ICVzXG4iLCBndGlkLCB0YXJnZXRfZ3RpZCwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWU6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQgJiYgX19rbXBfeWllbGRpbmdfb24pIHsKKyAgICAgICAgc2NoZWRfeWllbGQoKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldHNwZWNpZmljKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCAodm9pZCopKGd0aWQrMSkgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCBzdGF0dXMgKTsKK30KKworaW50CitfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpCit7CisgICAgaW50IGd0aWQ7CisgICAgaWYgKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShzaXplX3QpcHRocmVhZF9nZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIGlmICggZ3RpZCA9PSAwICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3RpZC0tOworICAgIH0KKyAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IGtleTolZCBndGlkOiVkXG4iLAorICAgICAgICAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgZ3RpZCApKTsKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZG91YmxlCitfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICkKK3sKKyAgICAvKmNsb2NrX3QgICB0OyovCisgICAgc3RydWN0IHRtcyAgYnVmZmVyOworCisgICAgLyp0ID0qLyAgdGltZXMoICYgYnVmZmVyICk7CisKKyAgICByZXR1cm4gKGJ1ZmZlci50bXNfdXRpbWUgKyBidWZmZXIudG1zX2N1dGltZSkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBydXNhZ2Ugcl91c2FnZTsKKworICAgIG1lbXNldCggaW5mbywgMCwgc2l6ZW9mKCAqaW5mbyApICk7CisKKyAgICBzdGF0dXMgPSBnZXRydXNhZ2UoIFJVU0FHRV9TRUxGLCAmcl91c2FnZSk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXRydXNhZ2UiLCBzdGF0dXMgKTsKKworICAgIGluZm8tPm1heHJzcyAgPSByX3VzYWdlLnJ1X21heHJzczsgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGluZm8tPm1pbmZsdCAgPSByX3VzYWdlLnJ1X21pbmZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSByX3VzYWdlLnJ1X21hamZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGluZm8tPm5zd2FwICAgPSByX3VzYWdlLnJ1X25zd2FwOyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGluZm8tPmluYmxvY2sgPSByX3VzYWdlLnJ1X2luYmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSByX3VzYWdlLnJ1X291YmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGluZm8tPm52Y3N3ICAgPSByX3VzYWdlLnJ1X252Y3N3OyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGluZm8tPm5pdmNzdyAgPSByX3VzYWdlLnJ1X25pdmNzdzsgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIChzdGF0dXMgIT0gMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X25zOworICAgIHN0cnVjdCB0aW1ldmFsICAgICAgdHZhbDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0b3A7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmc3RvcCApOworICAgIHRfbnMgPSBUUzJOUyhzdG9wKSAtIFRTMk5TKF9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0KTsKKyAgICAqZGVsdGEgPSAodF9ucyAqIDFlLTkpOworfQorCit2b2lkCitfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApCit7CisgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEJVSUxEX1RWCisKK3ZvaWQKK19fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwgdm9pZCAqdGhyZWFkX2FkZHIgKQoreworICAgIHN0cnVjdCB0dl9kYXRhICpwOworCisgICAgcCA9IChzdHJ1Y3QgdHZfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqcCApICk7CisKKyAgICBwLT51LnRwLmdsb2JhbF9hZGRyID0gZ2xvYmFsX2FkZHI7CisgICAgcC0+dS50cC50aHJlYWRfYWRkciA9IHRocmVhZF9hZGRyOworCisgICAgcC0+dHlwZSA9ICh2b2lkICopIDE7CisKKyAgICBwLT5uZXh0ID0gIHRoLT50aC50aF9sb2NhbC50dl9kYXRhOworICAgIHRoLT50aC50aF9sb2NhbC50dl9kYXRhID0gcDsKKworICAgIGlmICggcC0+bmV4dCA9PSAwICkgeworICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX3NldHNwZWNpZmljKCBfX2ttcF90dl9rZXksIHAgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgcmMgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitfX2ttcF9nZXRfeHByb2MoIHZvaWQgKSB7CisKKyAgICBpbnQgciA9IDA7CisKKyAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgciA9IHN5c2NvbmYoIF9TQ19OUFJPQ0VTU09SU19PTkxOICk7CisKKyAgICAjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgLy8gQnVnIEM3NzAxMSBIaWdoICJPcGVuTVAgVGhyZWFkcyBhbmQgbnVtYmVyIG9mIGFjdGl2ZSBjb3JlcyIuCisKKyAgICAgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLgorICAgICAgICBrZXJuX3JldHVybl90ICAgICAgICAgIHJjOworICAgICAgICBob3N0X2Jhc2ljX2luZm9fZGF0YV90IGluZm87CisgICAgICAgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgbnVtID0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UOworICAgICAgICByYyA9IGhvc3RfaW5mbyggbWFjaF9ob3N0X3NlbGYoKSwgSE9TVF9CQVNJQ19JTkZPLCAoaG9zdF9pbmZvX3QpICYgaW5mbywgJiBudW0gKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICYmIG51bSA9PSBIT1NUX0JBU0lDX0lORk9fQ09VTlQgKSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIEtBX1RSQUNFKCkgaGVyZSBiZWNhdXNlIHRoaXMgY29kZSB3b3JrcyBiZWZvcmUgdHJhY2Ugc3VwcG9ydCBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICByID0gaW5mby5hdmFpbF9jcHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENhbnRHZXROdW1BdmFpbENQVSApOworICAgICAgICAgICAgS01QX0lORk9STSggQXNzdW1lZE51bUNQVSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QKKworICAgICAgICBpbnQgbWliW10gPSB7IENUTF9IVywgSFdfTkNQVSB9OworICAgICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKCByICk7CisgICAgICAgIGlmICggc3lzY3RsKCBtaWIsIDIsICZyLCAmbGVuLCBOVUxMLCAwICkgPCAwICkgeworICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQ2FudEdldE51bUF2YWlsQ1BVICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBBc3N1bWVkTnVtQ1BVICk7CisgICAgICAgIH0KKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLiIKKworICAgICNlbmRpZgorCisgICAgcmV0dXJuIHIgPiAwID8gciA6IDI7IC8qIGd1ZXNzIHZhbHVlIG9mIDIgaWYgT1MgdG9sZCB1cyAwICovCisKK30gLy8gX19rbXBfZ2V0X3hwcm9jCisKK2ludAorX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyYiIpOworICAgIGlmICggZiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmVzdWx0ID0gdmZzY2FuZihmLCBmb3JtYXQsIGFyZ3MpOworICAgIGZjbG9zZShmKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7CisgICAgcHRocmVhZF9jb25kYXR0cl90ICBjb25kX2F0dHI7CisKKyAgICBpZiAoIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJl9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgX19rbXBfeHByb2MgPSBfX2ttcF9nZXRfeHByb2MoKTsKKworICAgIGlmICggc3lzY29uZiggX1NDX1RIUkVBRFMgKSApIHsKKworICAgICAgICAvKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IHN5c2NvbmYoIF9TQ19USFJFQURfVEhSRUFEU19NQVggKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA9PSAtMSApIHsKKyAgICAgICAgICAgIC8qIFVubGltaXRlZCB0aHJlYWRzIGZvciBOUFRMICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3N5c19tYXhfbnRoIDw9IDEgKSB7CisgICAgICAgICAgICAvKiBDYW4ndCB0ZWxsLCBqdXN0IHVzZSBQVEhSRUFEX1RIUkVBRFNfTUFYICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworICAgICAgICB9CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBzeXNjb25mKCBfU0NfVEhSRUFEX1NUQUNLX01JTiApOworICAgICAgICBpZiAoIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA8PSAxICkgeworICAgICAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKworCisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByYyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJiBfX2ttcF90dl9rZXksIDAgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfY3JlYXRlIiwgcmMgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfY3JlYXRlKCAmX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXgsICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kYXR0cl9pbml0KCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kYXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICYgX19rbXBfd2FpdF9jdi5jX2NvbmQsICYgY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIGlmICggISBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkby4KKyAgICB9OworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjaWZkZWYgQlVJTERfVFYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF90dl9rZXkgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICYgX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgIH0KKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworfQorCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCisvKiBOT1RFOiBub3QgY3VycmVudGx5IHVzZWQgYW55d2hlcmUgKi8KK3ZvaWQKK19fa21wX3RocmVhZF9zbGVlcCggaW50IG1pbGxpcyApCit7CisgICAgc2xlZXAoICAoIG1pbGxpcyArIDUwMCApIC8gMTAwMCApOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBpbnQgc3RhdHVzOworIyBpZmRlZiBGSVhfU0dJX0NMT0NLCisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgICAgc3RhdHVzID0gY2xvY2tfZ2V0dGltZSggQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmdHMgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImNsb2NrX2dldHRpbWUiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHRzLnR2X25zZWMgKiAoMS4wIC8gKGRvdWJsZSkgTlNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHRzLnR2X3NlYzsKKyMgZWxzZQorICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmIHR2LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHR2LnR2X3VzZWMgKiAoMS4wIC8gKGRvdWJsZSkgVVNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHR2LnR2X3NlYzsKKyMgZW5kaWYKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IDEgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworLyoKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLgorKi8KKworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKSB7CisKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByYzsKKworICAgICNpZiBLTVBfT1NfTElOVVgKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZAorICAgICAgICAgICAgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgKi8KKworICAgICAgICBjaGFyICogbmFtZSA9IF9fa21wX3N0cl9mb3JtYXQoICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgRklMRSAqIGZpbGUgID0gTlVMTDsKKworICAgICAgICBmaWxlID0gZm9wZW4oIG5hbWUsICJyIiApOworICAgICAgICBLTVBfQVNTRVJUKCBmaWxlICE9IE5VTEwgKTsKKworICAgICAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZvaWQgKiBiZWdpbm5pbmcgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqIGVuZGluZyAgICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICAgcGVybXNbIDUgXTsKKworICAgICAgICAgICAgcmMgPSBmc2NhbmYoIGZpbGUsICIlcC0lcCAlNHMgJSpbXlxuXVxuIiwgJiBiZWdpbm5pbmcsICYgZW5kaW5nLCBwZXJtcyApOworICAgICAgICAgICAgaWYgKCByYyA9PSBFT0YgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgPT0gMyAmJiBzdHJsZW4oIHBlcm1zICkgPT0gNCApOyAvLyBNYWtlIHN1cmUgYWxsIGZpZWxkcyBhcmUgcmVhZC4KKworICAgICAgICAgICAgLy8gRW5kaW5nIGFkZHJlc3MgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZWdpb24sIGJ1dCBiZWdpbm5pbmcgaXMuCisgICAgICAgICAgICBpZiAoICggYWRkciA+PSBiZWdpbm5pbmcgKSAmJiAoIGFkZHIgPCBlbmRpbmcgKSApIHsKKyAgICAgICAgICAgICAgICBwZXJtc1sgMiBdID0gMDsgICAgLy8gM3RoIGFuZCA0dGggY2hhcmFjdGVyIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICAgICAgICBpZiAoIHN0cmNtcCggcGVybXMsICJydyIgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgd2UgYXJlIGxvb2tpbmcgZm9yIHNob3VsZCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gRnJlZSByZXNvdXJjZXMuCisgICAgICAgIGZjbG9zZSggZmlsZSApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmFtZSApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBPUyBYKiwgL3Byb2MgcHNldWRvIGZpbGVzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZS4gVHJ5IHRvIHJlYWQgbWVtb3J5IHVzaW5nIHZtCisgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICAgICovCisKKyAgICAgICAgaW50ICAgICAgIGJ1ZmZlcjsKKyAgICAgICAgdm1fc2l6ZV90IGNvdW50OworICAgICAgICByYyA9CisgICAgICAgICAgICB2bV9yZWFkX292ZXJ3cml0ZSgKKyAgICAgICAgICAgICAgICBtYWNoX3Rhc2tfc2VsZigpLCAgICAgICAgICAgLy8gVGFzayB0byByZWFkIG1lbW9yeSBvZi4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggYWRkciApLCAgICAgLy8gQWRkcmVzcyB0byByZWFkIGZyb20uCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICAgICAgICAgICAgICAgICh2bV9hZGRyZXNzX3QpKCAmIGJ1ZmZlciApLCAvLyBBZGRyZXNzIG9mIGJ1ZmZlciB0byBzYXZlIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICAgICAgJiBjb3VudCAgICAgICAgICAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgdmFyIHRvIHNhdmUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyBNZW1vcnkgc3VjY2Vzc2Z1bGx5IHJlYWQuCisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxpZiBLTVBfT1NfRlJFRUJTRAorCisgICAgICAgIC8vIEZJWE1FKEZyZWVCU0QpOiBJbXBsZW1lbnQgdGhpcy4KKyAgICAgICAgZm91bmQgPSAxOworCisgICAgI2Vsc2UKKworICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisKKyAgICAjZW5kaWYKKworICAgIHJldHVybiBmb3VuZDsKKworfSAvLyBfX2ttcF9pc19hZGRyZXNzX21hcHBlZAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisKKyMgaWYgS01QX09TX0RBUldJTgorCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcm91bmRlZCB2YWx1ZSBvZiB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZQorLy8gZHVyaW5nIGdpdmVuIHRpbWUgaW50ZXJ2YWwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YKKy8vIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB2YXJpYWJsZSAoZGVmYXVsdCBpcyA2MCBzZWMsIG90aGVyIHZhbHVlcworLy8gbWF5IGJlIDMwMCBzZWMgb3IgOTAwIHNlYykuCisvLyBJdCByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIGRvdWJsZSBhdmVyYWdlc1szXTsKKyAgICBpbnQgcmV0X2F2ZyA9IDA7CisKKyAgICBpbnQgcmVzID0gZ2V0bG9hZGF2ZyggYXZlcmFnZXMsIDMgKTsKKworICAgIC8vQ2hlY2sgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIHRvIGRldGVybWluZSB3aGljaCBvZiBhdmVyYWdlcyB0byB1c2UuCisgICAgLy8gZ2V0bG9hZGF2ZygpIG1heSByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGxlc3MgdGhhbiByZXF1ZXN0ZWQgdGhhdCBpcworICAgIC8vIGxlc3MgdGhhbiAzLgorICAgIGlmICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgMTgwICYmICggcmVzID49IDEgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzBdOy8vIDEgbWluCisgICAgfSBlbHNlIGlmICggKCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPj0gMTgwCisgICAgICAgICAgICAgICAgICAmJiBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPCA2MDAgKSAmJiAoIHJlcyA+PSAyICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1sxXTsvLyA1IG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDYwMCApICYmICggcmVzID09IDMgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzJdOy8vIDE1IG1pbgorICAgIH0gZWxzZSB7Ly8gRXJyb3Igb2NjdXJyZWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXRfYXZnOworfQorCisjIGVsc2UgLy8gTGludXgqIE9TCisKKy8vIFRoZSBmdWN0aW9uIHJldHVybnMgbnVtYmVyIG9mIHJ1bm5pbmcgKG5vdCBzbGVlcGluZykgdGhyZWFkcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKy8vIEVycm9yIGNvdWxkIGJlIHJlcG9ydGVkIGlmIExpbnV4KiBPUyBrZXJuZWwgdG9vIG9sZCAod2l0aG91dCAiL3Byb2MiIHN1cHBvcnQpLgorLy8gQ291bnRpbmcgcnVubmluZyB0aHJlYWRzIHN0b3BzIGlmIG1heCBydW5uaW5nIHRocmVhZHMgZW5jb3VudGVyZWQuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIHN0YXRpYyBpbnQgcGVybWFuZW50X2Vycm9yID0gMDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgICAgICAgICAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgPSAwOyAgLyogVGhyZWFkIGJhbGFuY2UgYWxnb3JpdGhtIGNhbGwgdGltZSAqLworCisgICAgaW50IHJ1bm5pbmdfdGhyZWFkcyA9IDA7ICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uCisKKyAgICBESVIgICogICAgICAgICAgcHJvY19kaXIgICA9IE5VTEw7ICAgIC8vIEhhbmRsZSBvZiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHByb2NfZW50cnkgPSBOVUxMOworCisgICAga21wX3N0cl9idWZfdCAgIHRhc2tfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi8iIHBhdGguCisgICAgRElSICAqICAgICAgICAgIHRhc2tfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHRhc2tfZW50cnkgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICB0YXNrX3BhdGhfZml4ZWRfbGVuOworCisgICAga21wX3N0cl9idWZfdCAgIHN0YXRfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi9zdGF0IiBwYXRoLgorICAgIGludCAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9wYXRoX2ZpeGVkX2xlbjsKKworICAgIGludCB0b3RhbF9wcm9jZXNzZXMgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiBzeXN0ZW0uCisgICAgaW50IHRvdGFsX3RocmVhZHMgICA9IDA7ICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBpbiBzeXN0ZW0uCisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOworCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHRhc2tfcGF0aCApOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBzdGF0X3BhdGggKTsKKworICAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgZ2xiX2NhbGxfdGltZSA9IGNhbGxfdGltZTsKKworICAgIC8vIERvIG5vdCBzcGVuZCB0aW1lIG9uIHNjYW5uaW5nICIvcHJvYy8iIGlmIHdlIGhhdmUgYSBwZXJtYW5lbnQgZXJyb3IuCisgICAgaWYgKCBwZXJtYW5lbnRfZXJyb3IgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gT3BlbiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgcHJvY19kaXIgPSBvcGVuZGlyKCAiL3Byb2MiICk7CisgICAgaWYgKCBwcm9jX2RpciA9PSBOVUxMICkgeworICAgICAgICAvLyBDYW5ub3Qgb3BlbiAiL3Bycm9jLyIuIFByb2JhYmx5IHRoZSBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBpdC4gUmV0dXJuIGFuIGVycm9yIG5vdyBhbmQKKyAgICAgICAgLy8gaW4gc3Vic2VxdWVudCBjYWxscy4KKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH07IC8vIGlmCisKKyAgICAvLyBJbml0aWFsaXplIGZpeGVkIHBhcnQgb2YgdGFza19wYXRoLiBUaGlzIHBhcnQgd2lsbCBub3QgY2hhbmdlLgorICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHRhc2tfcGF0aCwgIi9wcm9jLyIsIDYgKTsKKyAgICB0YXNrX3BhdGhfZml4ZWRfbGVuID0gdGFza19wYXRoLnVzZWQ7ICAgIC8vIFJlbWVtYmVyIG51bWJlciBvZiB1c2VkIGNoYXJhY3RlcnMuCisKKyAgICBwcm9jX2VudHJ5ID0gcmVhZGRpciggcHJvY19kaXIgKTsKKyAgICB3aGlsZSAoIHByb2NfZW50cnkgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gUHJvYyBlbnRyeSBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LiBBc3N1bWUgaXQgaXMgYSBwcm9jZXNzJworICAgICAgICAvLyBkaXJlY3RvcnkuCisgICAgICAgIGlmICggcHJvY19lbnRyeS0+ZF90eXBlID09IERUX0RJUiAmJiBpc2RpZ2l0KCBwcm9jX2VudHJ5LT5kX25hbWVbIDAgXSApICkgeworCisgICAgICAgICAgICArKyB0b3RhbF9wcm9jZXNzZXM7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaW5pdCBwcm9jZXNzIGlzIHRoZSB2ZXJ5IGZpcnN0IGluICIvcHJvYyIsIHNvIHdlIGNhbiByZXBsYWNlCisgICAgICAgICAgICAvLyBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCB3aXRoIHNpbXBsZXIgdG90YWxfcHJvY2Vzc2VzID09IDEuCisgICAgICAgICAgICAvLyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgdGhhdCB0b3RhbF9wcm9jZXNzZXMgPT0gMSA9PiBkX25hbWUgPT0gIjEiIGlzIHRydWUgKHdoZXJlCisgICAgICAgICAgICAvLyAiPT4iIGlzIGltcGxpY2F0aW9uKS4gU2luY2UgQysrIGRvZXMgbm90IGhhdmUgPT4gb3BlcmF0b3IsIGxldCB1cyByZXBsYWNlIGl0IHdpdGggaXRzCisgICAgICAgICAgICAvLyBlcXVpdmFsZW50OiBhID0+IGIgPT0gISBhIHx8IGIuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbF9wcm9jZXNzZXMgIT0gMSB8fCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApOworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGFza19wYXRoLgorICAgICAgICAgICAgdGFza19wYXRoLnVzZWQgPSB0YXNrX3BhdGhfZml4ZWRfbGVuOyAgICAvLyBSZXNldCB0YXNrX3BhdGggdG8gIi9wcm9jLyIuCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsIHByb2NfZW50cnktPmRfbmFtZSwgc3RybGVuKCBwcm9jX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCAiL3Rhc2siLCA1ICk7CisKKyAgICAgICAgICAgIHRhc2tfZGlyID0gb3BlbmRpciggdGFza19wYXRoLnN0ciApOworICAgICAgICAgICAgaWYgKCB0YXNrX2RpciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY2FuIGZpbmlzaCBiZXR3ZWVuIHJlYWRpbmcgIi9wcm9jLyIgZGlyZWN0b3J5IGVudHJ5IGFuZCBvcGVuaW5nIHByb2Nlc3MnCisgICAgICAgICAgICAgICAgLy8gInRhc2svIiBkaXJlY3RvcnkuIFNvLCBpbiBnZW5lcmFsIGNhc2Ugd2Ugc2hvdWxkIG5vdCBjb21wbGFpbiwgYnV0IGhhdmUgdG8gc2tpcAorICAgICAgICAgICAgICAgIC8vIHRoaXMgcHJvY2VzcyBhbmQgcmVhZCB0aGUgbmV4dCBvbmUuCisgICAgICAgICAgICAgICAgLy8gQnV0IG9uIHN5c3RlbXMgd2l0aCBubyAidGFzay8iIHN1cHBvcnQgd2Ugd2lsbCBzcGVuZCBsb3Qgb2YgdGltZSB0byBzY2FuICIvcHJvYy8iCisgICAgICAgICAgICAgICAgLy8gdHJlZSBhZ2FpbiBhbmQgYWdhaW4gd2l0aG91dCBhbnkgYmVuZWZpdC4gImluaXQiIHByb2Nlc3MgKGl0cyBwaWQgaXMgMSkgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gZXhpc3QgYWx3YXlzLCBzbywgaWYgd2UgY2Fubm90IG9wZW4gIi9wcm9jLzEvdGFzay8iIGRpcmVjdG9yeSwgaXQgbWVhbnMgInRhc2svIgorICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBzdXBwb3J0ZWQgYnkga2VybmVsLiBSZXBvcnQgYW4gZXJyb3Igbm93IGFuZCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgICAgIGlmICggc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGZpeGVkIHBhcnQgb2Ygc3RhdCBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jbGVhciggJiBzdGF0X3BhdGggKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsIHRhc2tfcGF0aC5zdHIsIHRhc2tfcGF0aC51c2VkICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiLyIsIDEgKTsKKyAgICAgICAgICAgICAgICBzdGF0X3BhdGhfZml4ZWRfbGVuID0gc3RhdF9wYXRoLnVzZWQ7CisKKyAgICAgICAgICAgICAgICB0YXNrX2VudHJ5ID0gcmVhZGRpciggdGFza19kaXIgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHRhc2tfZW50cnkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9jX2VudHJ5LT5kX3R5cGUgPT0gRFRfRElSICYmIGlzZGlnaXQoIHRhc2tfZW50cnktPmRfbmFtZVsgMCBdICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrIHRvdGFsX3RocmVhZHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnNydWN0IGNvbXBsZXRlIHN0YXQgZmlsZSBwYXRoLiBFYXNpZXN0IHdheSB3b3VsZCBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHN0YXRfcGF0aCwgIiVzLyVzL3N0YXQiLCB0YXNrX3BhdGguc3RyLCB0YXNrX2VudHJ5LT5kX25hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBzZXJpYWUgb2YgX19rbXBfc3RyX2J1Zl9jYXQgd29ya3MgYSBiaXQgZmFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9wYXRoLnVzZWQgPSBzdGF0X3BhdGhfZml4ZWRfbGVuOyAgICAvLyBSZXNldCBzdGF0IHBhdGggdG8gaXRzIGZpeGVkIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsIHRhc2tfZW50cnktPmRfbmFtZSwgc3RybGVuKCB0YXNrX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiL3N0YXQiLCA1ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IExvdy1sZXZlbCBBUEkgKG9wZW4vcmVhZC9jbG9zZSkgaXMgdXNlZC4gSGlnaC1sZXZlbCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3Blbi9mY2xvc2UpICB3b3JrcyB+IDMwICUgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gb3Blbiggc3RhdF9wYXRoLnN0ciwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdF9maWxlID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW4gZXJyb3IgYmVjYXVzZSB0YXNrICh0aHJlYWQpIGNhbiB0ZXJtaW5hdGUganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBvZiAic3RhdCIgZmlsZSBsb29rcyBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDI4NSAocHJvZ3JhbSkgUyAuLi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpbmdsZSBsaW5lIChpZiBwcm9ncmFtIG5hbWUgZG9lcyBub3QgaW5jbHVkZSBmYW5ueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKS4gRmlyc3QgbnVtYmVyIGlzIGEgdGhyZWFkIGlkLCB0aGVuIG5hbWUgb2YgZXhlY3V0YWJsZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gcGFyZXRoZXNlcywgdGhlbiBzdGF0ZSBvZiB0aGUgdGhyZWFkLiBXZSBuZWVkIGp1c3QgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2QgbmV3czogTGVuZ3RoIG9mIHByb2dyYW0gbmFtZSBpcyAxNSBjaGFyYWN0ZXJzIG1heC4gTG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgd2UgbmVlZCByYXRoZXIgc2hvcnQgYnVmZmVyOiAxNSBjaGFycyBmb3IgcHJvZ3JhbSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBwYXJlbnRoZXNpcywgKyAzIHNwYWNlcyArIH43IGRpZ2l0cyBvZiBwaWQgPSAzNy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWQgbmV3czogUHJvZ3JhbSBuYW1lIG1heSBjb250YWluIHNwZWNpYWwgc3ltYm9scyBsaWtlIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzLCBvciBldmVuIG5ldyBsaW5lLiBUaGlzIG1ha2VzIHBhcnNpbmcgInN0YXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbm90IDEwMCAlIHJlbGlhYmxlLiBJbiBjYXNlIG9mIGZhbm55IHByb2dyYW0gbmFtZXMgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmFpbCAocmVwb3J0IGluY29ycmVjdCB0aHJlYWQgc3RhdGUpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgInN0YXR1cyIgZmlsZSBsb29rcyBtb3JlIHByb21pc3NpbmcgKGR1ZSB0byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzdHJ1Y3R1cmUgYW5kIGVzY2FwaW5nIHNwZWNpYWwgc3ltYm9scykgYnV0IHJlYWRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgb2YgInN0YXR1cyIgZmlsZSB3b3JrcyBzbG93ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWyA2NSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZCggc3RhdF9maWxlLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWyBsZW4gXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHNjYW5mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3NjYW5mKCBidWZmZXIsICIlKmQgKCUqcykgJWMgIiwgJiBzdGF0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3b3JrcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjbG9zZV9wYXJlbnQgPSBzdHJzdHIoIGJ1ZmZlciwgIikgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNsb3NlX3BhcmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZSA9ICogKCBjbG9zZV9wYXJlbnQgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09ICdSJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgdGFza19kaXIgPSBOVUxMOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vCisgICAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgICAvLyBjb2RlIGdldCBza2lwcGVkIGluIHRoZSBsb2FkIGJhbGFuY2UsIGFuZCBydW5uaW5nX3RocmVhZHMgaXMgMC4KKyAgICAvLyBBc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkcyBvbmx5ISEhCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPD0gMCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgICB9CisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICAgICAgICBpZiAoIHByb2NfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggcHJvY19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHRhc2tfcGF0aCApOworICAgICAgICBpZiAoIHRhc2tfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHN0YXRfcGF0aCApOworICAgICAgICBpZiAoIHN0YXRfZmlsZSAhPSAtMSApIHsKKyAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vIF9fa21wX2dldF9sb2FkX2JhbGFuY2UKKworIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBVU0VfTE9BRF9CQUxBTkNFCisKKworI2lmIEtNUF9DT01QSUxFUl9HQ0MgJiYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorCitpbnQgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCB0aWQsIGludCBhcmdjLAorICAgICAgICB2b2lkICpwX2FyZ3ZbXSApCit7CisgICAgaW50IGFyZ2NfZnVsbCA9IGFyZ2MgKyAyOworICAgIGludCBpOworICAgIGZmaV9jaWYgY2lmOworICAgIGZmaV90eXBlICp0eXBlc1thcmdjX2Z1bGxdOworICAgIHZvaWQgKmFyZ3NbYXJnY19mdWxsXTsKKyAgICB2b2lkICppZHBbMl07CisKKyAgICAvKiBXZSdyZSBvbmx5IHBhc3NpbmcgcG9pbnRlcnMgdG8gdGhlIHRhcmdldC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY19mdWxsOyBpKyspCisgICAgICAgIHR5cGVzW2ldID0gJmZmaV90eXBlX3BvaW50ZXI7CisKKyAgICAvKiBVZ2x5IGRvdWJsZS1pbmRpcmVjdGlvbiwgYnV0IHRoYXQncyBob3cgaXQgZ29lcy4uLiAqLworICAgIGlkcFswXSA9ICZndGlkOworICAgIGlkcFsxXSA9ICZ0aWQ7CisgICAgYXJnc1swXSA9ICZpZHBbMF07CisgICAgYXJnc1sxXSA9ICZpZHBbMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgICAgICBhcmdzWzIgKyBpXSA9ICZwX2FyZ3ZbaV07CisKKyAgICBpZiAoZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgYXJnY19mdWxsLAorICAgICAgICAgICAgICAgICZmZmlfdHlwZV92b2lkLCB0eXBlcykgIT0gRkZJX09LKQorICAgICAgICBhYm9ydCgpOworCisgICAgZmZpX2NhbGwoJmNpZiwgKHZvaWQgKCopKHZvaWQpKXBrZm4sIE5VTEwsIGFyZ3MpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvLyBLTVBfQ09NUElMRVJfR0NDICYmICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbSBiL3JjMS9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViMGIxYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KQEAgLTAsMCArMSwxNjEzIEBACis7ICB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc206ICAtIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkKKzsgICAgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBydW5uaW5nIFdpbmRvd3MqIE9TCis7ICAkUmV2aXNpb246IDQyNDg3ICQKKzsgICREYXRlOiAyMDEzLTA3LTA4IDA4OjExOjIzIC0wNTAwIChNb24sIDA4IEp1bCAyMDEzKSAkCisKKzsKKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOy8vCis7Ly8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorOy8vCis7Ly8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorOy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorOy8vCis7Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKzsKKworICAgICAgICBUSVRMRSAgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbQorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElBLTMyIGFyY2hpdGVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PQoraWZkZWYgX01fSUEzMgorCisgICAgICAgIC41ODZQCisKK2lmIEBWZXJzaW9uIGd0IDUxMAorICAgICAgICAubW9kZWwgSFVHRQorZWxzZQorX1RFWFQgICBTRUdNRU5UIFBBUkEgVVNFMzIgUFVCTElDICdDT0RFJworX1RFWFQgICBFTkRTCitfREFUQSAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdEQVRBJworX0RBVEEgICBFTkRTCitDT05TVCAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdDT05TVCcKK0NPTlNUICAgRU5EUworX0JTUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnQlNTJworX0JTUyAgICBFTkRTCiskJFNZTUJPTFMgICAgICAgU0VHTUVOVCBCWVRFIFVTRTMyICdERUJTWU0nCiskJFNZTUJPTFMgICAgICAgRU5EUworJCRUWVBFUyBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlRZUCcKKyQkVFlQRVMgRU5EUworX1RMUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnVExTJworX1RMUyAgICBFTkRTCitGTEFUICAgIEdST1VQIF9EQVRBLCBDT05TVCwgX0JTUworICAgICAgICBBU1NVTUUgIENTOiBGTEFULCBEUzogRkxBVCwgU1M6IEZMQVQKK2VuZGlmCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X3BhdXNlCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkKKzsKKworUFVCTElDICBfX19rbXBfeDg2X3BhdXNlCitfcCQgPSA0CitfZCQgPSA4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fX2ttcF94ODZfcGF1c2UgUFJPQyBORUFSCisKKyAgICAgICAgZGIgICAgICAwZjNICisgICAgICAgIGRiICAgICAgMDkwSCAgICA7OyBwYXVzZQorICAgICAgICByZXQKKworX19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3g4Nl9jcHVpZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfbW9kZSQgID0gOAorX21vZGUyJCA9IDEyCitfcCQgICAgID0gMTYKK19lYXgkICAgPSAwCitfZWJ4JCAgID0gNAorX2VjeCQgICA9IDgKK19lZHgkICAgPSAxMgorCitfX19rbXBfeDg2X2NwdWlkIFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlY3gKKyAgICAgICAgcHVzaCAgICAgIGVkeAorCisgICAgICAgIG1vdgkgIGVheCwgRFdPUkQgUFRSIF9tb2RlJFtlYnBdCisgICAgICAgIG1vdgkgIGVjeCwgRFdPUkQgUFRSIF9tb2RlMiRbZWJwXQorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisJbW92IAkgIERXT1JEIFBUUiBfZWF4JFsgZWRpIF0sIGVheAorCW1vdiAJICBEV09SRCBQVFIgX2VieCRbIGVkaSBdLCBlYngKKwltb3YgCSAgRFdPUkQgUFRSIF9lY3gkWyBlZGkgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiBfZWR4JFsgZWRpIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICBlZHgKKyAgICAgICAgcG9wICAgICAgIGVjeAorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgICBlZGkKKworICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KK2xvY2sgICAgeGFkZCAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBhbCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVheCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX2N2X2hpZ2gkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVieCwgRFdPUkQgUFRSIF9zdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9zdl9oaWdoJFtlYnBdCitsb2NrICAgIGNtcHhjaGc4YiBRV09SRCBQVFIgW2VkaV0KKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVkeDplYXggPT0gW2VkaV0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfZml4ZWQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsICBCWVRFIFBUUiBfZCRbZXNwXQorbG9jayAgICB4Y2hnICAgICAgQllURSBQVFIgW2VjeF0sIGFsCisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCAgV09SRCBQVFIgIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbZWN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX3JlYWwzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfZCQgPSAxMgorX29sZF92YWx1ZSQgPSAtNAorCitfX19rbXBfeGNoZ19yZWFsMzIgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgNAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgW2VzaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgPGFkZHI+CisgICAgICAgIGZzdCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0b3JlIGludG8gb2xkX3ZhbHVlCisKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfZCRbZWJwXQorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtlc2ldLCBlYXgKKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyByZXR1cm4gb2xkX3ZhbHVlCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorOworOyBrbXBfaW50NjQKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2N2X2xvdyQgPSAxMgorX2N2X2hpZ2gkID0gMTYKK19zdl9sb3ckID0gMjAKK19zdl9oaWdoJCA9IDI0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBwb3AgICAgICAgZWRpCisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworOworCitQVUJMSUMgIF9fX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfYWRkciQgPSA4CitfZGF0YSQgPSAxMgorX29sZF92YWx1ZSQgPSAtNAorX25ld192YWx1ZSQgPSAtOAorCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIgUFJPQyBORUFSCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDgKKyAgICAgICAgcHVzaCAgICBlc2kKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgbW92ICAgICBlc2ksIERXT1JEIFBUUiBfYWRkciRbZWJwXQorJEwyMjoKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgW2VzaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgPGFkZHI+CisgICAgICAgIGZzdCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0b3JlIGludG8gb2xkX3ZhbHVlCisgICAgICAgIGZhZGQgICAgRFdPUkQgUFRSIF9kYXRhJFtlYnBdCisgICAgICAgIGZzdHAgICAgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGRhdGEKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgb2xkX3ZhbHVlCisgICAgICAgIG1vdiAgICAgZWJ4LCBEV09SRCBQVFIgX25ld192YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgbG9hZCBuZXdfdmFsdWUKKworbG9jayAgICBjbXB4Y2hnIERXT1JEIFBUUiBbZXNpXSwgZWJ4CisgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb21wYXJlIEVBWCB3aXRoIDxhZGRyPi4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOzsgWkYgYW5kIGxvYWQgRUJYIGludG8gPGFkZHI+LiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVBWC4KKyAgICAgICAgam56ICAgICBTSE9SVCAkTDIyCisKKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyByZXR1cm4gb2xkX3ZhbHVlCisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0ICAgICAwCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19hZGRyJCA9IDgKK19kYXRhJCA9IDEyCitfb2xkX3ZhbHVlJCA9IC04CitfbmV3X3ZhbHVlJCA9IC0xNgorCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQgUFJPQyBORUFSCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDE2CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIG1vdiAgICAgZXNpLCBEV09SRCBQVFIgX2FkZHIkW2VicF0KKyRMNDQ6CisgICAgICAgIGZsZCAgICAgUVdPUkQgUFRSIFtlc2ldCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIDxhZGRyPgorICAgICAgICBmc3QgICAgIFFXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorICAgICAgICBmYWRkICAgIFFXT1JEIFBUUiBfZGF0YSRbZWJwXQorICAgICAgICBmc3RwICAgIFFXT1JEIFBUUiBfbmV3X3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkYXRhCisKKyAgICAgICAgbW92ICAgICBlZHgsIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnArNF0KKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIG9sZF92YWx1ZQorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicCs0XQorICAgICAgICBtb3YgICAgIGVieCwgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgbmV3X3ZhbHVlCisKK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZXNpXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgQ29tcGFyZSBFRFg6RUFYIHdpdGggPGFkZHI+LiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7OyBaRiBhbmQgbG9hZCBFQ1g6RUJYIGludG8gPGFkZHI+LiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVEWDpFQVguCisgICAgICAgIGpueiAgICAgU0hPUlQgJEw0NAorCisKKyAgICAgICAgZmxkICAgICBRV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3AgICAgIGVkeAorICAgICAgICBwb3AgICAgIGVjeAorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZsZGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZnN0Y3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorOworOyB2b2lkCis7IF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKzsKKworUFVCTElDICBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIFBST0MgTkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9pbnZva2VfbWljcm90YXNrCis7Cis7IHR5cGVkZWYgdm9pZCAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworOworOyBpbnQKKzsgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApCis7CisKK1BVQkxJQyAgX19fa21wX2ludm9rZV9taWNyb3Rhc2sKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3BrZm4kID0gOAorX2d0aWQkID0gMTIKK190aWQkID0gMTYKK19hcmdjJCA9IDIwCitfYXJndiQgPSAyNAorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQorOyBMaW5lIDExNAorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmdjJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlYXgKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbGVhICAgICBlZHgsIERXT1JEIFBUUiBbZWF4KjQrOF0KKwltb3YgICAgIGVjeCwgZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIEVDWAorCW1vdgllYXgsZWR4CQk7IFNhdmUgdGhlIHNpemUgb2YgdGhlIGFyZ3MgaW4gZWF4CisJc3ViCWVjeCxlZHgJCTsgZXNwLSgoI2FyZ3MrMikqNCkgLT4gZWN4IC0tIHdpdGhvdXQgbW9kcywgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3YJZWR4LGVjeAkJOyBTYXZlIHRvIGVkeAorCWFuZAllY3gsLTEyOAk7IE1hc2sgb2ZmIDcgYml0cworCXN1YgllZHgsZWN4CQk7IEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIGVzcAorCXN1Ygllc3AsZWR4CQk7IFByZXBhcmUgc3RhY2sgcHRyLS0gTm93IGl0IHdpbGwgYmUgYWxpZ25lZCBvbiAxMjgtYnl0ZSBib3VuZGFyeSBhdCB0aGUgY2FsbAorCisJYWRkCWVkeCxlYXgJCTsgQ2FsY3VsYXRlIHRvdGFsIHNpemUgb2YgdGhlIHN0YWNrIGRlY3JlbWVudC4KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3N0a19hZGokW2VicF0sIGVkeAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM3CiskTDIyMjM4OgorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIHN1YiAgICAgZWN4LCAxCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlY3gKKyRMMjIyMzc6CisgICAgICAgIGNtcCAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCAwCisgICAgICAgIGpsZSAgICAgU0hPUlQgJEwyMjIzOQorOyBMaW5lIDExNgorICAgICAgICBtb3YgICAgIGVkeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2FyZ3YkW2VicF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBbZWF4K2VkeCo0LTRdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF92cHRyJFtlYnBdLCBlY3gKKzsgTGluZSAxMjMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDEyNAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDEyNworICAgICAgICBqbXAgICAgIFNIT1JUICRMMjIyMzgKKyRMMjIyMzk6Cis7IExpbmUgMTI5CisgICAgICAgIGxlYSAgICAgZWR4LCBEV09SRCBQVFIgX3RpZCRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWR4Cis7IExpbmUgMTMwCisgICAgICAgIGxlYSAgICAgZWF4LCBEV09SRCBQVFIgX2d0aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3FwdHIkW2VicF0sIGVheAorOyBMaW5lIDE0MworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF92cHRyJFtlYnBdCis7IExpbmUgMTQ0CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ1CisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3FwdHIkW2VicF0KKzsgTGluZSAxNDYKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxNDcKKyAgICAgICAgY2FsbCAgICBEV09SRCBQVFIgX3BrZm4kW2VicF0KKzsgTGluZSAxNDgKKyAgICAgICAgYWRkICAgICBlc3AsIERXT1JEIFBUUiBfc3RrX2FkaiRbZWJwXQorOyBMaW5lIDE1MgorICAgICAgICBtb3YgICAgIGVheCwgMQorOyBMaW5lIDE1MworICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEludGVsKFIpIDY0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lmZGVmIF9NX0FNRDY0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeDg2X3BhdXNlCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkKKzsKKworUFVCTElDICBfX2ttcF94ODZfcGF1c2UKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeDg2X3BhdXNlIFBST0MgO05FQVIKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIDsgcGF1c2UKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwltb2RlOgkJZWN4Cis7CW1vZGUyOgkJZWR4Cis7CWNwdWlkX2J1ZmZlcjogCXI4CisKK1BVQkxJQyAgX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeDg2X2NwdWlkIFBST0MgRlJBTUUgO05FQVIKKworICAgICAgICBwdXNoICAgICAgcmJwCisgICAgICAgIC5wdXNocmVnICByYnAKKyAgICAgICAgbW92ICAgICAgIHJicCwgcnNwCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgcHVzaCAgICAgIHJieAkJCQk7IGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIC5wdXNocmVnICByYngKKyAgICAgICAgLkVORFBST0xPRworCisJbW92CSAgcjEwLCByOCAgICAgICAgICAgICAgICAgICAgICAgOyBwIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlYXgsIGVjeAkJCTsgbW9kZSBwYXJhbWV0ZXIKKyAgICAgICAgbW92CSAgZWN4LCBlZHggICAgICAgICAgICAgICAgICAgICAgOyBtb2RlMiBwYXJhbWV0ZXIKKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92IAkgIERXT1JEIFBUUiAwWyByMTAgXSwgZWF4CTsgc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdiAJICBEV09SRCBQVFIgNFsgcjEwIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgOFsgcjEwIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgMTJbIHIxMCBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICAgIHJzcCwgcmJwCisgICAgICAgIHBvcCAgICAgICByYnAKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICByYXgsIHJkeAorbG9jayAgICB4YWRkICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisgICAgICAgIHJldAorCitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBhbCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgZWF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIHJheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWRsCis7Cis7IHJldHVybjogCWFsCisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgIGR4Citsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbcmN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgllZHgKKzsKKzsgcmV0dXJuOiAJZWF4CisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIGVkeAorbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbcmN4XSwgZWF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyA7TkVBUgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJYWwKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4IFBST0MgO05FQVIKKyRfX2ttcF9sb29wOgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIGp6ICAgICAJU0hPUlQgJF9fa21wX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9sb29wCisKKyRfX2ttcF9zdWNjZXNzOgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsgICAgICAgZDoJeG1tMSAobG93ZXIgNCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA0IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDY0IFBST0MgO05FQVIKKworCW1vdmQJcmF4LCB4bW0xCQk7IGxvYWQgImQiCisKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorCisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CWFkZHI6CXJjeAorOwlkYXRhOgl4bW0xIChsb3dlciA0IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiBQUk9DIDtORUFSCiskX19rbXBfcmVhbDMyX2xvb3A6CisgICAgICAgIG1vdnNzICAgeG1tMCwgRFdPUkQgUFRSIFtyY3hdCTsgbG9hZCB2YWx1ZSBhdCA8YWRkcj4KKwltb3ZkCWVheCwgeG1tMAkJOyBzYXZlIG9sZCB2YWx1ZSBhdCA8YWRkcj4KKworCWFkZHNzCXhtbTAsIHhtbTEJCTsgbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAllZHgsIHhtbTAJCTsgbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCitsb2NrICAgIGNtcHhjaGcgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGV4Y2hhbmdlIEVEWCB3aXRoIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVBWC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfcmVhbDMyX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9yZWFsMzJfbG9vcAorCiskX19rbXBfcmVhbDMyX3N1Y2Nlc3M6CisJbW92ZAl4bW0wLCBlYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CWFkZHI6CXJjeAorOwlkYXRhOgl4bW0xIChsb3dlciA4IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDggYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCBQUk9DIDtORUFSCiskX19rbXBfcmVhbDY0X2xvb3A6CisgICAgICAgIG1vdmxwZCAgeG1tMCwgUVdPUkQgUFRSIFtyY3hdCTsgbG9hZCB2YWx1ZSBhdCA8YWRkcj4KKwltb3ZkCXJheCwgeG1tMAkJOyBzYXZlIG9sZCB2YWx1ZSBhdCA8YWRkcj4KKworCWFkZHNkCXhtbTAsIHhtbTEJCTsgbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAlyZHgsIHhtbTAJCTsgbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCitsb2NrICAgIGNtcHhjaGcgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBSQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGV4Y2hhbmdlIFJEWCB3aXRoIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIFJBWC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfcmVhbDY0X3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9yZWFsNjRfbG9vcAorCiskX19rbXBfcmVhbDY0X3N1Y2Nlc3M6CisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbGRjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOworCitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKKzsKKworUFVCTElDICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworOworOyAgICAgKCpwa2ZuKSAoICZndGlkLCAmdGlkLCBhcmd2WzBdLCAuLi4gKTsKKzsgICAgIHJldHVybiAxOworOyB9Cis7Cis7IG5vdGU6Cis7ICAgICAganVzdCBiZWZvcmUgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSByc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICByY3g6ICAgcGtmbgkxNltyYnBdCis7ICAgICAgZWR4OiAgIGd0aWQJMjRbcmJwXQorOyAgICAgIHI4ZDogICB0aWQJMzJbcmJwXQorOyAgICAgIHI5ZDogICBhcmdjCTQwW3JicF0KKzsgICAgICBbc3RdOiAgcF9hcmd2CTQ4W3JicF0KKzsKKzsgcmVnIHRlbXBzOgorOyAgICAgIHJheDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJkeDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJjeDogICB1c2VkIGFzIGFyZ3VtZW50IGNvdW50ZXIgZm9yIHB1c2ggcGFybXMgbG9vcAorOyAgICAgIHIxMDogICB1c2VkIHRvIGhvbGQgcGtmbiBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50Cis7Cis7IHJldHVybjogICAgICBlYXggICAgKGFsd2F5cyAxL1RSVUUpCis7CisKKyRfcGtmbiAgID0gMTYKKyRfZ3RpZCAgID0gMjQKKyRfdGlkICAgID0gMzIKKyRfYXJnYyAgID0gNDAKKyRfcF9hcmd2ID0gNDgKKworUFVCTElDICBfX2ttcF9pbnZva2VfbWljcm90YXNrCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIEZSQU1FIDtORUFSCisJbW92CVFXT1JEIFBUUiAxNltyc3BdLCByZHgJOyBob21lIGd0aWQgcGFyYW1ldGVyCisJbW92IAlRV09SRCBQVFIgMjRbcnNwXSwgcjgJOyBob21lIHRpZCBwYXJhbWV0ZXIKKyAgICAgICAgcHVzaCAgICByYnAJCTsgc2F2ZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnB1c2hyZWcgcmJwCisJc3ViCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIGVuZCBwcm9sb2cKKworICAgICAgICBsZWEgICAgIHJicCwgUVdPUkQgUFRSIFtyc3BdICAgCTsgZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICAuRU5EUFJPTE9HCisJbW92CXIxMCwgcmN4CTsgc2F2ZSBwa2ZuIHBvaW50ZXIgZm9yIGxhdGVyCisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBtb3YgICAgIHJheCwgcjkJCTsgcmF4IDw9IGFyZ2MKKyAgICAgICAgY21wICAgICByYXgsIDIKKyAgICAgICAgamdlICAgICBTSE9SVCAkX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ24KKyAgICAgICAgbW92ICAgICByYXgsIDIgICAgICAgICAgOyBzZXQgNCBob21lcyBpZiBsZXNzIHRoYW4gMiBwYXJtcworJF9rbXBfaW52b2tlX3N0YWNrX2FsaWduOgorCWxlYSAgICAgcmR4LCBRV09SRCBQVFIgW3JheCo4KzE2XSA7IHJheCA8PSAoYXJnYyArIDIpICogOAorCW1vdiAgICAgcmF4LCByc3AgICAgICAgIDsgU2F2ZSBjdXJyZW50IFNQIGludG8gcmF4CisJc3ViCXJheCwgcmR4CTsgcnNwIC0gKChhcmdjKzIpKjgpIC0+IHJheAorCQkJCTsgd2l0aG91dCBhbGlnbiwgcnNwIHdvdWxkIGJlIHRoaXMKKwlhbmQgICAgIHJheCwgLTEyOCAgICAgICA7IE1hc2sgb2ZmIDcgYml0cyAoMTI4LWJ5dGUgYWxpZ24pCisJYWRkICAgICByYXgsIHJkeCAgICAgICAgOyBhZGQgc3BhY2UgZm9yIHB1c2gncyBpbiBhIGxvb3AgYmVsb3cKKwltb3YgICAgIHJzcCwgcmF4ICAgICAgICA7IFByZXBhcmUgdGhlIHN0YWNrIHB0cgorCQkJCTsgTm93IGl0IHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYXQgdGhlIGNhbGwKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAJCQk7IHNldHVwIHBrZm4gcGFyYW1ldGVyIHN0YWNrCisJbW92CXJheCwgcjkJCTsgcmF4IDw9IGFyZ2MKKwlzaGwJcmF4LCAzCQk7IHJheCA8PSBhcmdjKjgKKwltb3YJcmR4LCBRV09SRCBQVFIgJF9wX2FyZ3ZbcmJwXQk7IHJkeCA8PSBwX2FyZ3YKKwlhZGQJcmR4LCByYXgJOyByZHggPD0gJnBfYXJndlthcmdjXQorCW1vdglyY3gsIHI5CQk7IHJjeCA8PSBhcmdjCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3Bhc3NfcGFybXMJOyBub3RoaW5nIHRvIHB1c2ggaWYgYXJnYz0wCisJY21wCWVjeCwgMQkJOyBpZiBhcmdjPTEgYnJhbmNoIGFoZWFkCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX29uZV9wYXJtCisJc3ViCWVjeCwgMgkJOyBpZiBhcmdjPTIgYnJhbmNoIGFoZWFkLCBzdWJ0cmFjdCB0d28gZnJvbQorCWplCVNIT1JUICRfa21wX2ludm9rZV90d29fcGFybXMKKworJF9rbXBfaW52b2tlX3B1c2hfcGFybXM6CTsgcHVzaCBsYXN0IC0gNXRoIHBhcm1zIHRvIHBrZm4gb24gc3RhY2sKKwlzdWIJcmR4LCA4CQk7IGRlY3JlbWVudCBwX2FyZ3YgcG9pbnRlciB0byBwcmV2aW91cyBwYXJtCisJbW92IAlyOCwgUVdPUkQgUFRSIFtyZHhdIDsgcjggPD0gcF9hcmd2W3JjeC0xXQorCXB1c2gJcjgJCTsgcHVzaCBwX2FyZ3ZbcmN4LTFdIG9udG8gc3RhY2sgKHJldmVyc2Ugb3JkZXIpCisJc3ViCWVjeCwgMQorCWplY3h6CVNIT1JUICRfa21wX2ludm9rZV90d29fcGFybXMKKwlqbXAJU0hPUlQgJF9rbXBfaW52b2tlX3B1c2hfcGFybXMKKworJF9rbXBfaW52b2tlX3R3b19wYXJtczoKKwlzdWIJcmR4LCA4CQk7IHB1dCA0dGggcGFybSB0byBwa2ZuIGluIHI5CisJbW92CXI5LCBRV09SRCBQVFIgW3JkeF0gOyByOSA8PSBwX2FyZ3ZbMV0KKworJF9rbXBfaW52b2tlX29uZV9wYXJtOgorICAgICAgICBzdWIJcmR4LCA4CQk7IHB1dCAzcmQgcGFybSB0byBwa2ZuIGluIHI4CisJbW92CXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbMF0KKworJF9rbXBfaW52b2tlX3Bhc3NfcGFybXM6CTsgcHV0IDFzdCAmIDJuZCBwYXJtcyB0byBwa2ZuIGluIHJlZ2lzdGVycworCWxlYQlyZHgsIFFXT1JEIFBUUiAkX3RpZFtyYnBdICA7IHJkeCA8PSAmdGlkICgybmQgcGFybSB0byBwa2ZuKQorCWxlYQlyY3gsIFFXT1JEIFBUUiAkX2d0aWRbcmJwXSA7IHJjeCA8PSAmZ3RpZCAoMXN0IHBhcm0gdG8gcGtmbikKKyAgICAgICAgc3ViICAgICByc3AsIDMyICAgICAgICAgOyBhZGQgc3RhY2sgc3BhY2UgZm9yIGZpcnN0IGZvdXIgcGFybXMKKwltb3YJcmF4LCByMTAJOyByYXggPD0gcGtmbgorCWNhbGwJcmF4CQk7IGNhbGwgKCpwa2ZuKSgpCisJbW92CXJheCwgMQkJOyBtb3ZlIDEgaW50byByZXR1cm4gcmVnaXN0ZXI7CisKKyAgICAgICAgbGVhICAgICByc3AsIFFXT1JEIFBUUiBbcmJwXQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCis7CWFkZAlyc3AsIDAJCTsgbm8gZml4ZWQgYWxsb2NhdGlvbiBuZWNlc3NhcnkgLSBzdGFydCBlcGlsb2cKKyAgICAgICAgcG9wICAgICByYnAJCTsgcmVzdG9yZSBmcmFtZSBwb2ludGVyCisgICAgICAgIHJldAorX19rbXBfaW52b2tlX21pY3JvdGFzayBFTkRQCitfVEVYVCAgIEVORFMKKworZW5kaWYKKworRU5ECmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMgYi9yYzEvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliZDk2YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIHpfV2luZG93c19OVC01ODZfdXRpbC5jIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKy8qIE9ubHkgMzItYml0ICJhZGQtZXhjaGFuZ2UiIGluc3RydWN0aW9uIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBjYXVzZXMgdXMgdG8KKyAqIHVzZSBjb21wYXJlX2FuZF9zdG9yZSBmb3IgdGhlc2Ugcm91dGluZXMKKyAqLworCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2lmIEtNUF9BUkNIX1g4Ngora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fb3I2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS9zcmMvel9XaW5kb3dzX05UX3V0aWwuYyBiL3JjMS9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTkxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS9zcmMvel9XaW5kb3dzX05UX3V0aWwuYwpAQCAtMCwwICsxLDE5NzUgQEAKKy8qCisgKiB6X1dpbmRvd3NfTlRfdXRpbC5jIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICogJFJldmlzaW9uOiA0MjgxNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0xMSAxNTozMzozNyAtMDYwMCAoTW9uLCAxMSBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBjb2RlIGlzIHJlbGF0ZWQgdG8gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gCisgICBpcyB1c2VkIGluIHRoZSBMb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGZvciBPTVBfRFlOQU1JQz10cnVlIHRvIGZpbmQgdGhlIAorICAgbnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLiAqLworCisjaW5jbHVkZSA8bnRzdGF0dXMuaD4KKyNpbmNsdWRlIDxudHNlY2FwaS5oPiAgIC8vIFVOSUNPREVfU1RSSU5HCisKK2VudW0gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTIHsKKyAgICBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24gPSA1Cit9OyAvLyBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MKKworc3RydWN0IENMSUVOVF9JRCB7CisgICAgSEFORExFIFVuaXF1ZVByb2Nlc3M7CisgICAgSEFORExFIFVuaXF1ZVRocmVhZDsKK307IC8vIHN0cnVjdCBDTElFTlRfSUQKKworZW51bSBUSFJFQURfU1RBVEUgeworICAgIFN0YXRlSW5pdGlhbGl6ZWQsCisgICAgU3RhdGVSZWFkeSwKKyAgICBTdGF0ZVJ1bm5pbmcsCisgICAgU3RhdGVTdGFuZGJ5LAorICAgIFN0YXRlVGVybWluYXRlZCwKKyAgICBTdGF0ZVdhaXQsCisgICAgU3RhdGVUcmFuc2l0aW9uLAorICAgIFN0YXRlVW5rbm93bgorfTsgLy8gZW51bSBUSFJFQURfU1RBVEUKKworc3RydWN0IFZNX0NPVU5URVJTIHsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtWaXJ0dWFsU2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFZpcnR1YWxTaXplOworICAgIFVMT05HICAgICAgICAgUGFnZUZhdWx0Q291bnQ7CisgICAgU0laRV9UICAgICAgICBQZWFrV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBXb3JraW5nU2V0U2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha1BhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha05vblBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFBhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQZWFrUGFnZWZpbGVVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFByaXZhdGVQYWdlQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgVk1fQ09VTlRFUlMKKworc3RydWN0IFNZU1RFTV9USFJFQUQgeworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRUaW1lOworICBMUFZPSUQgICAgICAgICAgU3RhcnRBZGRyZXNzOworICBDTElFTlRfSUQgICAgICAgQ2xpZW50SWQ7CisgIERXT1JEICAgICAgICAgICBQcmlvcml0eTsKKyAgTE9ORyAgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgVUxPTkcgICAgICAgICAgIENvbnRleHRTd2l0Y2hDb3VudDsKKyAgVEhSRUFEX1NUQVRFICAgIFN0YXRlOworICBVTE9ORyAgICAgICAgICAgV2FpdFJlYXNvbjsKK307IC8vIFNZU1RFTV9USFJFQUQKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIEtlcm5lbFRpbWUgKSA9PSAwICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcyApID09IDI4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXRlICAgICAgICApID09IDUyICk7CisjZWxzZQorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAzMiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA2OCApOworI2VuZGlmCisKK3N0cnVjdCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiB7CisgIFVMT05HICAgICAgICAgICBOZXh0RW50cnlPZmZzZXQ7CisgIFVMT05HICAgICAgICAgICBOdW1iZXJPZlRocmVhZHM7CisgIExBUkdFX0lOVEVHRVIgICBSZXNlcnZlZFsgMyBdOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgVU5JQ09ERV9TVFJJTkcgIEltYWdlTmFtZTsKKyAgRFdPUkQgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgSEFORExFICAgICAgICAgIFByb2Nlc3NJZDsKKyAgSEFORExFICAgICAgICAgIFBhcmVudFByb2Nlc3NJZDsKKyAgVUxPTkcgICAgICAgICAgIEhhbmRsZUNvdW50OworICBVTE9ORyAgICAgICAgICAgUmVzZXJ2ZWQyWyAyIF07CisgIFZNX0NPVU5URVJTICAgICBWTUNvdW50ZXJzOworICBJT19DT1VOVEVSUyAgICAgSU9Db3VudGVyczsKKyAgU1lTVEVNX1RIUkVBRCAgIFRocmVhZHNbIDEgXTsKK307IC8vIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OCit0eXBlZGVmIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICogUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OOworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIE5leHRFbnRyeU9mZnNldCApID09ICAwICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIENyZWF0ZVRpbWUgICAgICApID09IDMyICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEltYWdlTmFtZSAgICAgICApID09IDU2ICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgNjggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA3NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gIDg4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAxMzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDE4NCApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFByb2Nlc3NJZCAgICAgICApID09ICA4MCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSGFuZGxlQ291bnQgICAgICkgPT0gIDk2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBWTUNvdW50ZXJzICAgICAgKSA9PSAxMTIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMgICAgICApID09IDIwOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVGhyZWFkcyAgICAgICAgICkgPT0gMjU2ICk7CisjZW5kaWYKKwordHlwZWRlZiBOVFNUQVRVUyAoTlRBUEkgKk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSggU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTLCBQVk9JRCwgVUxPTkcsIFBVTE9ORyApOworTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworSE1PRFVMRSBudGRsbCA9IE5VTEw7CisKKy8qIEVuZCBvZiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKS1yZWxhdGVkIGNvZGUgKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NAorc3RhdGljIEhNT0RVTEUga2VybmVsMzIgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvLyBXaHkgZG8gd2UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgX19rbXBfc3RhdGljX2RlbGF5KCkgYW5kIF9fa21wX3N0YXRpY195aWVsZCgpIGluIG1hbnkgZmlsZXM/CisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKSB7CisgICAgLyogV29yayBhcm91bmQgd2VpcmQgY29kZS1nZW4gYnVnIHRoYXQgY2F1c2VzIGFzc2VydCB0byB0cmlwICovCisgICAgI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyAgICAjZWxzZQorICAgICAgICBLTVBfQVNTRVJUKCBhcmcgPj0gMCApOworICAgICNlbmRpZgorfQorCisjZWxzZQorCisgICAgI2RlZmluZSBfX2ttcF9zdGF0aWNfZGVsYXkoIGFyZyApICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgdHlwZWRlZiB2b2lkICAgICgqIHNpZ19mdW5jX3QgKSggaW50ICk7CisgICAgc3RhdGljIHNpZ19mdW5jX3QgIF9fa21wX3NpZ2hsZHJzWyBOU0lHIF07CisgICAgc3RhdGljIGludCAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgTlNJRyBdOworI2VuZGlmCisKK3N0YXRpYyBIQU5ETEUgICBfX2ttcF9tb25pdG9yX2V2Oworc3RhdGljIGttcF9pbnQ2NCBfX2ttcF93aW4zMl90aW1lOworZG91YmxlIF9fa21wX3dpbjMyX3RpY2s7CisKK2ludCBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK0NSSVRJQ0FMX1NFQ1RJT04gX19rbXBfd2luMzJfc2VjdGlvbjsKKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfaW5pdCgga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIG14LT5jcywgIkNyaXRpY2FsIFNlY3Rpb24iICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfbG9jaygga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2luaXQoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBjdi0+d2FpdGVyc19jb3VudF8gICAgICAgICA9IDA7CisgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8gPSAwOworICAgIGN2LT5yZWxlYXNlX2NvdW50XyAgICAgICAgID0gMDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBfX2ttcF93aW4zMl9tdXRleF9pbml0KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAvKiBDcmVhdGUgYSBtYW51YWwtcmVzZXQgZXZlbnQuICovCisgICAgY3YtPmV2ZW50XyA9IENyZWF0ZUV2ZW50KCBOVUxMLCAgICAgLy8gbm8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgICAvLyBtYW51YWwtcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgICAvLyBub24tc2lnbmFsZWQgaW5pdGlhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7ICAgLy8gdW5uYW1lZAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCBjdi0+ZXZlbnRfLCAiRXZlbnQiICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2Rlc3Ryb3koIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisgICAgX19rbXBfZnJlZV9oYW5kbGUoIGN2LT5ldmVudF8gKTsKKyAgICBtZW1zZXQoIGN2LCAnXDAnLCBzaXplb2YoICpjdiApICk7Cit9CisKKy8qIFRPRE8gYXNzb2NpYXRlIGN2IHdpdGggYSB0ZWFtIGluc3RlYWQgb2YgYSB0aHJlYWQgc28gYXMgdG8gb3B0aW1pemUKKyAqIHRoZSBjYXNlIHdoZXJlIHdlIHdha2UgdXAgYSB3aG9sZSB0ZWFtICovCisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfd2FpdCgga21wX3dpbjMyX2NvbmRfdCAqY3YsIGttcF93aW4zMl9tdXRleF90ICpteCwga21wX2luZm9fdCAqdGgsIGludCBuZWVkX2RlY3JlYXNlX2xvYWQgKQoreworICAgIGludCBteV9nZW5lcmF0aW9uOworICAgIGludCBsYXN0X3dhaXRlcjsKKworICAgIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucyAqLworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgLyogSW5jcmVtZW50IGNvdW50IG9mIHdhaXRlcnMgKi8KKyAgICBjdi0+d2FpdGVyc19jb3VudF8rKzsKKworICAgIC8qIFN0b3JlIGN1cnJlbnQgZ2VuZXJhdGlvbiBpbiBvdXIgYWN0aXZhdGlvbiByZWNvcmQuICovCisgICAgbXlfZ2VuZXJhdGlvbiA9IGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soIG14ICk7CisKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHdhaXRfZG9uZTsKKworICAgICAgICAvKiBXYWl0IHVudGlsIHRoZSBldmVudCBpcyBzaWduYWxlZCAqLworICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBjdi0+ZXZlbnRfLCBJTkZJTklURSApOworCisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgICAgIC8qIEV4aXQgdGhlIGxvb3Agd2hlbiB0aGUgPGN2LT5ldmVudF8+IGlzIHNpZ25hbGVkIGFuZAorICAgICAgICAgKiB0aGVyZSBhcmUgc3RpbGwgd2FpdGluZyB0aHJlYWRzIGZyb20gdGhpcyA8d2FpdF9nZW5lcmF0aW9uPgorICAgICAgICAgKiB0aGF0IGhhdmVuJ3QgYmVlbiByZWxlYXNlZCBmcm9tIHRoaXMgd2FpdCB5ZXQuICAgICAgICAgICAgICAqLworICAgICAgICB3YWl0X2RvbmUgPSAoIGN2LT5yZWxlYXNlX2NvdW50XyA+IDAgKSAmJgorICAgICAgICAgICAgICAgICAgICAoIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfICE9IG15X2dlbmVyYXRpb24gKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisKKyAgICAgICAgLyogdGhlcmUgdXNlZCB0byBiZSBhIHNlbWljb2xvbiBhZnRlciB0aGUgaWYgc3RhdGVtZW50LAorICAgICAgICAgKiBpdCBsb29rZWQgbGlrZSBhIGJ1Zywgc28gaSByZW1vdmVkIGl0ICovCisgICAgICAgIGlmKCB3YWl0X2RvbmUgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggbXggKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGN2LT53YWl0ZXJzX2NvdW50Xy0tOworICAgIGN2LT5yZWxlYXNlX2NvdW50Xy0tOworCisgICAgbGFzdF93YWl0ZXIgPSAgKCBjdi0+cmVsZWFzZV9jb3VudF8gPT0gMCApOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGlmKCBsYXN0X3dhaXRlciApIHsKKyAgICAgICAgLyogV2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRvIGJlIG5vdGlmaWVkLCBzbyByZXNldCB0aGUgbWFudWFsIGV2ZW50LiAqLworICAgICAgICBSZXNldEV2ZW50KCBjdi0+ZXZlbnRfICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2Jyb2FkY2FzdCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgaWYoIGN2LT53YWl0ZXJzX2NvdW50XyA+IDAgKSB7CisgICAgICAgIFNldEV2ZW50KCBjdi0+ZXZlbnRfICk7CisgICAgICAgIC8qIFJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzIGluIHRoaXMgZ2VuZXJhdGlvbi4gKi8KKworICAgICAgICBjdi0+cmVsZWFzZV9jb3VudF8gPSBjdi0+d2FpdGVyc19jb3VudF87CisKKyAgICAgICAgLyogU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbi4gKi8KKyAgICAgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8rKzsKKyAgICB9CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX3NpZ25hbCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KCBjdiApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9lbmFibGUoIGludCBuZXdfc3RhdGUgKQoreworICAgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKK30KKwordm9pZAorX19rbXBfZGlzYWJsZSggaW50ICpvbGRfc3RhdGUgKQoreworICAgICpvbGRfc3RhdGUgPSAwOworCisgICAgaWYgKF9fa21wX2luaXRfcnVudGltZSkKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIC8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoICEgVENSXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQgKSApIHsKKyAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfaW5pdCggICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgICAgVENXXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQsIFRSVUUgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggVENSXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQgKSApIHsKKyAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgIF9fa21wX3dpbjMyX2NvbmRfZGVzdHJveSggJiB0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveSggJiB0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgVENXXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQsIEZBTFNFICk7CisgICAgfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgKiBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgc3BpbiB2YXJpYWJsZSB0byB0cnVlLgorICovCisKK3ZvaWQKK19fa21wX3N1c3BlbmQoIGludCB0aF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwga21wX3VpbnQgY2hlY2tlciApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAga21wX3VpbnQgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZDogVCMlZCBlbnRlciBmb3Igc3BpbiA9ICVwXG4iLCB0aF9ndGlkLCBzcGlubmVyICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gS01QX1RFU1RfVEhFTl9PUjMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgc3Bpbm5lciwgKnNwaW5uZXIgKSApOworCisgICAgaWYgKCBvbGRfc3BpbiA9PSBjaGVja2VyICkgeworICAgICAgICBLTVBfVEVTVF9USEVOX0FORDMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIpICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyNlbmRpZgorCisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgc3Bpbm5lcik7CisgICAgICAgIHdoaWxlICggVENSXzQoICpzcGlubmVyICkgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBrbXBfd2luMzJfY29uZF93YWl0KClcbiIsCisgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIG5vIGxvbmdlciBhY3RpdmUKKyAgICAgICAgICAgIC8vIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICgqc3Bpbm5lcikgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisJfSAvLyB3aGlsZQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBhY3RpdmUgYWdhaW4KKyAgICAgICAgLy8gKGlmIGl0IHdhcyBwcmV2aW91cyBtYXJrZWQgYXMgaW5hY3RpdmUpCisgICAgICAgIC8vCisgICAgICAgIGlmICggZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpICkgeworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kOiBUIyVkIGV4aXRcbiIsIHRoX2d0aWQgKSApOworfQorCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgKiBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBzcGluIGFyZ3VtZW50IHRvIEZBTFNFCisgKi8KK3ZvaWQKK19fa21wX3Jlc3VtZSggaW50IHRhcmdldF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3BpbiApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF91aW50MzIgb2xkX3NwaW47CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIHdhbnRzIHRvIHdha2V1cCBUIyVkIGVudGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgaWYgKCBzcGluID09IE5VTEwgKSB7CisgICAgICAgIHNwaW4gPSAodm9sYXRpbGUga21wX3VpbnQgKilUQ1JfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MpOworICAgICAgICBpZiAoIHNwaW4gPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZSAtICBzcGluKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIHNwaW4gKSApOworCisgICAgICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVENXX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKyAgICBvbGRfc3BpbiA9IEtNUF9URVNUX1RIRU5fQU5EMzIoIChrbXBfaW50MzIgdm9sYXRpbGUgKikgc3BpbiwgfiggS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSApOworCisgICAgaWYgKCAoIG9sZF9zcGluICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSA9PSAwICkgeworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2UgLSBzcGluKCVwKTogIgorICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3Bpbiwgb2xkX3NwaW4sICpzcGluICkgKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGFib3V0IHRvIHdha2V1cCBUIyVkLCByZXNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3BpbikgKTsKKworCisgICAgX19rbXBfd2luMzJfY29uZF9zaWduYWwoICAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZTogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQpCisgICAgICAgIFNsZWVwKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogVCMlZCBrZXk6JWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBpZiggISBUbHNTZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKExQVk9JRCkoZ3RpZCsxKSkgKQorICAgICAgICBLTVBfRkFUQUwoIFRMU1NldFZhbHVlRmFpbGVkICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKy8vCisvLyBPbmx5IDEgRFdPUkQgaW4gdGhlIG1hc2sgc2hvdWxkIGhhdmUgYW55IHByb2NzIHNldC4KKy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisvLworaW50CitfX2ttcF9nZXRfcHJvY19ncm91cCgga21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayApCit7CisgICAgaW50IGk7CisgICAgaW50IGdyb3VwID0gLTE7CisgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIG5ld19nYSwgcHJldl9nYTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hc2tbaV0gPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyb3VwID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBncm91cCA9IGk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHZhbGlkIG1hc2suCisgICAgICAgIC8vCisgICAgICAgIHN0cnVjdCBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgaW50IGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoIG1hc2sgKTsKKyAgICAgICAgaWYgKGdyb3VwIDwgMCkgeworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJpdCB2ZWN0b3IgaW50byBhIEdST1VQX0FGRklOSVRZIHN0cnVjdAorICAgICAgICAvLyBhbmQgbWFrZSB0aGUgc3lzdGVtIGNhbGwgdG8gc2V0IGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBnYS5ncm91cCA9IGdyb3VwOworICAgICAgICBnYS5tYXNrID0gbWFza1tncm91cF07CisgICAgICAgIGdhLnJlc2VydmVkWzBdID0gZ2EucmVzZXJ2ZWRbMV0gPSBnYS5yZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGlmICghU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCBHZXRDdXJyZW50VGhyZWFkKCksICptYXNrICkpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZEFmZk1hc2sgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisKKyAgICAgICAgaWYgKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiR2V0VGhyZWFkR3JvdXBBZmZpbml0eSgpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGdhLmdyb3VwIDwgMCkgfHwgKGdhLmdyb3VwID4gX19rbXBfbnVtX3Byb2NfZ3JvdXBzKQorICAgICAgICAgIHx8IChnYS5tYXNrID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtYXNrW2dhLmdyb3VwXSA9IGdhLm1hc2s7CisgICAgfQorICAgIGVsc2UKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgeworICAgICAgICBrbXBfYWZmaW5fbWFza190IG5ld01hc2ssIHN5c01hc2ssIHJldHZhbDsKKworICAgICAgICBpZiAoIUdldFByb2Nlc3NBZmZpbml0eU1hc2soR2V0Q3VycmVudFByb2Nlc3MoKSwgJm5ld01hc2ssICZzeXNNYXNrKSkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSBTZXRUaHJlYWRBZmZpbml0eU1hc2soR2V0Q3VycmVudFRocmVhZCgpLCBuZXdNYXNrKTsKKyAgICAgICAgaWYgKCEgcmV0dmFsKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIlNldFRocmVhZEFmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIHJldHZhbCk7CisgICAgICAgIGlmICghIG5ld01hc2spIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqbWFzayA9IHJldHZhbDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKCBpbnQgcHJvYyApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gdGhlIEdST1VQX0FGRklOSVRZIHN0cnVjdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gZmlsbGluZworICAgICAgICAvLyBvdXQgYSBiaXQgdmVjdG9yIGFuZCBjYWxsaW5nIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKS4KKyAgICAgICAgLy8KKyAgICAgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChwcm9jID49IDApICYmIChwcm9jIDwgKF9fa21wX251bV9wcm9jX2dyb3VwcworICAgICAgICAgICAqIENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKSk7CisgICAgICAgIGdhLmdyb3VwID0gcHJvYyAvIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgZ2EubWFzayA9IDEgPDwgKHByb2MgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSkpOworICAgICAgICBnYS5yZXNlcnZlZFswXSA9IGdhLnJlc2VydmVkWzFdID0gZ2EucmVzZXJ2ZWRbMl0gPSAwOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EsIE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeyAvLyBBQzogY29udGludWUgc2lsZW50bHkgaWYgbm90IHZlcmJvc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbWFzazsKKyAgICAgICAgS01QX0NQVV9aRVJPKCZtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgJm1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCZtYXNrLCBUUlVFKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICkKK3sKKyAgICAvLworICAgIC8vIEFsbCB2ZXJzaW9ucyBvZiBXaW5kb3dzKiBPUyAoc2luY2UgV2luICc5NSkgc3VwcG9ydCBTZXRUaHJlYWRBZmZpbml0eU1hc2soKS4KKyAgICAvLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gX19rbXBfbnVtX3Byb2NfZ3JvdXBzICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpOworI2Vsc2UKKyAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBzaXplb2Yoa21wX2FmZmluX21hc2tfdCk7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKAorICAgICAgICAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICJXaW5kb3dzKiBPUyBhZmZpbml0eSBpbnRlcmZhY2UgZnVuY3Rpb25hbCAobWFzayBzaXplID0gJSIgS01QX1NJWkVfVF9TUEVDICIpLlxuIiwKKyAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplCisgICAgKSApOworfQorCitkb3VibGUKK19fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKQoreworICAgIEZJTEVUSU1FICAgIENyZWF0aW9uVGltZSwgRXhpdFRpbWUsIEtlcm5lbFRpbWUsIFVzZXJUaW1lOworICAgIGludCAgICAgICAgIHN0YXR1czsKKyAgICBkb3VibGUgICAgICBjcHVfdGltZTsKKworICAgIGNwdV90aW1lID0gMDsKKworICAgIHN0YXR1cyA9IEdldFByb2Nlc3NUaW1lcyggR2V0Q3VycmVudFByb2Nlc3MoKSwgJkNyZWF0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeGl0VGltZSwgJktlcm5lbFRpbWUsICZVc2VyVGltZSApOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBkb3VibGUgIHNlYyA9IDA7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHNlYyArPSBVc2VyVGltZS5kd0hpZ2hEYXRlVGltZTsKKworICAgICAgICAvKiBTaGlmdCBsZWZ0IGJ5IDMyIGJpdHMgKi8KKyAgICAgICAgc2VjICo9IChkb3VibGUpICgxIDw8IDE2KSAqIChkb3VibGUpICgxIDw8IDE2KTsKKworICAgICAgICBzZWMgKz0gS2VybmVsVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKworICAgICAgICBjcHVfdGltZSArPSAoc2VjICogMTAwLjApIC8gTlNFQ19QRVJfU0VDOworICAgIH0KKworICAgIHJldHVybiBjcHVfdGltZTsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbmZvLT5tYXhyc3MgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgaW5mby0+bWluZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgaW5mby0+aW5ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgaW5mby0+bml2Y3N3ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBTWVNURU1fSU5GTyBpbmZvOworICAgIGttcF9zdHJfYnVmX3QgcGF0aDsKKyAgICBVSU5UIHBhdGhfc2l6ZTsKKworICAgIGlmICggX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfTsKKworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24sICJDcml0aWNhbCBTZWN0aW9uIiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisKKyAgICAjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgISBkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMgCisgICAgICAgIC8vIFdpbmRvd3MqIE9TLCBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgLyoKKyAgICAgICAgICAgIE5ldyB0aHJlYWQgbWF5IHVzZSBzdGFjayBzcGFjZSBwcmV2aW91c2x5IHVzZWQgYnkgYW5vdGhlciB0aHJlYWQsIGN1cnJlbnRseSB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgT24gV2luZG93cyogT1MsIGluIGNhc2Ugb2Ygc3RhdGljIGxpbmtpbmcsIHdlIGRvIG5vdCBrbm93IHRoZSBtb21lbnQgb2YgdGhyZWFkIHRlcm1pbmF0aW9uLAorICAgICAgICAgICAgYW5kIG91ciBzdHJ1Y3R1cmVzIChfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290IGFycmF5cykgYXJlIHN0aWxsIGtlZXAgaW5mbyBhYm91dCBkZWFkCisgICAgICAgICAgICB0aHJlYWRzLiBUaGlzIGxlYWRzIHRvIHByb2JsZW0gaW4gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKSBmdW5jdGlvbjogaXQgd3JvbmdseQorICAgICAgICAgICAgZmluZHMgZ3RpZCAoYnkgc2VhcmNoaW5nIHRocm91Z2ggc3RhY2sgYWRkcmVzc2VzIG9mIGFsbCBrbm93biB0aHJlYWRzKSBmb3IgdW5yZWdpc3RlcmVkCisgICAgICAgICAgICBmb3JlaWduIHRyZWFkLgorCisgICAgICAgICAgICBTZXR0aW5nIF9fa21wX3Rsc19ndGlkX21pbiB0byAwIHdvcmthcm91bmRzIHRoaXMgcHJvYmxlbTogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorICAgICAgICAgICAgZG9lcyBub3Qgc2VhcmNoIHRocm91Z2ggc3RhY2tzLCBidXQgZ2V0IGd0aWQgZnJvbSBUTFMgaW1tZWRpYXRlbGx5LgorCisgICAgICAgICAgICAtLWxuCisgICAgICAgICovCisgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IDA7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKyAgICAjZW5kaWYKKworICAgIC8qIGZvciB0aGUgc3RhdGljIGxpYnJhcnkgKi8KKyAgICBpZiAoICFfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID0gVGxzQWxsb2MoKTsKKyAgICAgICAgaWYoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPT0gVExTX09VVF9PRl9JTkRFWEVTICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBUTFNPdXRPZkluZGV4ZXMgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8KKyAgICAvLyBMb2FkIG50ZGxsLmRsbC4KKyAgICAvLworICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKCAibnRkbGwuZGwiICkKKyAgICAgICAgaXMgbm90IHN1aXRhYmxlIGR1ZSB0byBzZWN1cml0eSBpc3N1ZSAoc2VlCisgICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L3NlY3VyaXR5L2Fkdmlzb3J5LzIyNjk2MzcubXNweCkuIFdlIGhhdmUgdG8gc3BlY2lmeSBmdWxsCisgICAgICAgIHBhdGggdG8gdGhlIGxpYnJhcnkuCisgICAgKi8KKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhdGhfc2l6ZSA+IDAgKTsKKyAgICBpZiAoIHBhdGhfc2l6ZSA+PSBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1ZmZlciBpcyB0b28gc2hvcnQuICBFeHBhbmQgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aF9zaXplICk7CisgICAgICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXRoX3NpemUgPiAwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBOb3cgd2UgaGF2ZSBzeXN0ZW0gZGlyZWN0b3J5IG5hbWUgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8gQXBwZW5kIGJhY2tzbGFzaCBhbmQgbmFtZSBvZiBkbGwgdG8gZm9ybSBmdWxsIHBhdGgsCisgICAgICAgIC8vCisgICAgICAgIHBhdGgudXNlZCA9IHBhdGhfc2l6ZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiXFwlcyIsICJudGRsbC5kbGwiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IGxvYWQgbnRkbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgICAgICAvLworICAgICAgICBudGRsbCA9IEdldE1vZHVsZUhhbmRsZSggcGF0aC5zdHIgKTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGRsbCAhPSBOVUxMICk7CisgICAgaWYgKCBudGRsbCAhPSBOVUxMICkgeworICAgICAgICBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSAoTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QpIEdldFByb2NBZGRyZXNzKCBudGRsbCwgIk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiIgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uICE9IE5VTEwgKTsKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gTG9hZCBrZXJuZWwzMi5kbGwuCisgICAgLy8gU2FtZSBjYXZlYXQgLSBtdXN0IHVzZSBmdWxsIHN5c3RlbSBwYXRoIG5hbWUuCisgICAgLy8KKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgYnVmZmVyIGJhY2sgdG8ganVzdCB0aGUgc3lzdGVtIHBhdGggbGVuZ3RoLAorICAgICAgICAvLyBkaXNjYXJkaW5nICJcXG50ZGxsLmRsbCIsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCAia2VybmVsMzIuZGxsIi4KKyAgICAgICAgLy8KKyAgICAgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICJcXCVzIiwgImtlcm5lbDMyLmRsbCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbCB1c2luZyBmdWxsIHBhdGguCisgICAgICAgIC8vCisgICAgICAgIGtlcm5lbDMyID0gR2V0TW9kdWxlSGFuZGxlKCBwYXRoLnN0ciApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExvYWQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGtlcm5lbDMyLmRsbCByb3V0aW5lcworICAgICAgICAvLyB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAvLworICAgICAgICBpZiAoIGtlcm5lbDMyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IChrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisgICAgICAgICAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIlNldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTZWUgaWYgZ3JvdXAgYWZmaW5pdHkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAgICAgLy8gSWYgc28sIGNhbGN1bGF0ZSB0aGUgI2dyb3VwcyBhbmQgI3Byb2NzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEdyb3VwIGFmZmluaXR5IHdhcyBpbnRyb2R1Y2VkIHdpdGggV2luZG93cyogNyBPUyBhbmQgCisgICAgICAgICAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIgMjAwOCBSMiBPUy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggKCBfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgICAgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KCkgKSA+IDEgKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBPUyBwcm9jcy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogJWQgcHJvY2Vzc29yIGdyb3VwcyBkZXRlY3RlZFxuIiwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzICkgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCggaSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBwcm9jIGdyb3VwICVkIHNpemUgPSAlZFxuIiwgaSwgc2l6ZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzIDw9IDEgKSB7CisgICAgICAgIEdldFN5c3RlbUluZm8oICYgaW5mbyApOworICAgICAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisgICAgfQorI2Vsc2UKKyAgICBHZXRTeXN0ZW1JbmZvKCAmIGluZm8gKTsKKyAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgICAvLworICAgIC8vIElmIHRoZSBPUyBzYWlkIHRoZXJlIHdlcmUgMCBwcm9jcywgdGFrZSBhIGd1ZXNzIGFuZCB1c2UgYSB2YWx1ZSBvZiAyLgorICAgIC8vIFRoaXMgaXMgZG9uZSBmb3IgTGludXgqIE9TLCBhbHNvLiAgRG8gd2UgbmVlZCBlcnJvciAvIHdhcm5pbmc/CisgICAgLy8KKyAgICBpZiAoIF9fa21wX3hwcm9jIDw9IDAgKSB7CisgICAgICAgIF9fa21wX3hwcm9jID0gMjsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggNSwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHRvdGFsIHByb2Nlc3NvcnMgPSAlZFxuIiwgX19rbXBfeHByb2MpICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgcGF0aCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9pbml0aWFsaXplKCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gVFJVRTsKK30gLy8gX19rbXBfcnVudGltZV9pbml0aWFsaXplCisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaWYgKCAhIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8qIHdlIGNhbid0IERlbGV0ZUNyaXRpY2Fsc2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7ICovCisgICAgLyogZHVlIHRvIHRoZSBLWF9UUkFDRSgpIGNvbW1hbmRzICovCisgICAgS0FfVFJBQ0UoIDQwLCAoIl9fa21wX3J1bnRpbWVfZGVzdHJveVxuIiApKTsKKworICAgIGlmKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBUbHNGcmVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSAwOworICAgIH0KKworICAgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7CisKKyAgICBudGRsbCA9IE5VTEw7CisgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIGtlcm5lbDMyID0gTlVMTDsKKyAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCit2b2lkCitfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYoICF0aCApIHJldHVybjsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworCisgICAgaWYgKFRlcm1pbmF0ZVRocmVhZCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAoRFdPUkQpIC0xKSA9PSBGQUxTRSkgeworICAgICAgICAvKiBJdCdzIE9LLCB0aGUgdGhyZWFkIG1heSBoYXZlIGV4aXRlZCBhbHJlYWR5ICovCisgICAgfQorICAgIF9fa21wX2ZyZWVfaGFuZGxlKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKQoreworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgdGltZTsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiB0aW1lICk7CisgICAgX19rbXBfd2luMzJfdGltZSA9IChrbXBfaW50NjQpIHRpbWUuUXVhZFBhcnQ7Cit9CisKK3ZvaWQKK19fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soIHZvaWQgKQoreworICAgIHsKKyAgQk9PTCBzdGF0dXM7CisgIExBUkdFX0lOVEVHRVIgZnJlcTsKKworICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCkiICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICB9CisgIGVsc2UgeworICAgICAgX19rbXBfd2luMzJfdGljayA9ICgoZG91YmxlKSAxLjApIC8gKGRvdWJsZSkgZnJlcS5RdWFkUGFydDsKKyAgfQorICAgIH0KK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiBub3cgKTsKKyAgICAqdCA9ICgoZG91YmxlKSBub3cuUXVhZFBhcnQpICogX19rbXBfd2luMzJfdGljazsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZF90aWNrKCBkb3VibGUgKnQgKQoreworICAgICp0ID0gX19rbXBfd2luMzJfdGljazsKK30KKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisKKyAgICBpZiAoZGVsdGEgIT0gTlVMTCkgeworICAgICAgICBCT09MIHN0YXR1czsKKyAgICAgICAgTEFSR0VfSU5URUdFUiBub3c7CisKKyAgICAgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisKKyAgICAgICAgKmRlbHRhID0gKChkb3VibGUpICgoKGttcF9pbnQ2NCkgbm93LlF1YWRQYXJ0KSAtIF9fa21wX3dpbjMyX3RpbWUpKQorICAgICogX19rbXBfd2luMzJfdGljazsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGFuZ2UgdGhyZWFkIHRvIHRoZSBhZmZpbml0eSBtYXNrIHBvaW50ZWQgdG8gYnkgYWZmaW5fbWFzayBhcmd1bWVudAorICogYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9sZCB2YWx1ZSBpbiB0aGUgb2xkX21hc2sgYXJndW1lbnQsIGlmIGFyZ3VtZW50CisgKiBpcyBub24tTlVMTC4KKyAqLworCit2b2lkCitfX2ttcF9jaGFuZ2VfdGhyZWFkX2FmZmluaXR5X21hc2soIGludCBndGlkLCBrbXBfYWZmaW5fbWFza190ICpuZXdfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2sgKQoreworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICpuZXdfbWFzayAhPSAwICk7CisKKyAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICpvbGRfbWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayggdGggLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWQsICpuZXdfbWFzayApOworCisgICAgICAgIGlmICghICpvbGRfbWFzayApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIENoYW5nZUFmZk1hc2ssICJLTVBfQUZGSU5JVFkgKEJpbmQpIiwgZ3RpZCwgKm9sZF9tYXNrLCAqbmV3X21hc2sgKTsKKworICAgIC8qIE1ha2Ugc3VyZSBvbGQgdmFsdWUgaXMgY29ycmVjdCBpbiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX21hc2sgIT0gTlVMTCAmJiAqb2xkX21hc2sgPT0gKih0aCAtPiB0aC50aF9hZmZpbl9tYXNrICkpOworCisgICAgS01QX0NQVV9DT1BZKHRoIC0+IHRoLnRoX2FmZmluX21hc2ssIG5ld19tYXNrKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICphcmcgKQoreworICAgIHZvbGF0aWxlIHZvaWQgKnN0YWNrX2RhdGE7CisgICAgdm9pZCAqZXhpdF92YWw7CisgICAgdm9pZCAqcGFkZGluZyA9IDA7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisgICAgaW50IGd0aWQ7CisKKyAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IF9hbGxvY2EoIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSApOworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIFRSVUUgKTsKKworICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8IDIgKSB7IC8vIGNoZWNrIHN0YWNrIG9ubHkgaWYgaXQgaXMgdXNlZCB0byBnZXQgZ3RpZAorICAgICAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgJnN0YWNrX2RhdGEpOworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyA9PSBGQUxTRSApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aGlzX3RociApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKyAgICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQoIHRoaXNfdGhyICk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gZXhpdF92YWw7Cit9CisKKworLyogVGhlIG1vbml0b3IgdGhyZWFkIGNvbnRyb2xzIGFsbCBvZiB0aGUgdGhyZWFkcyBpbiB0aGUgY29tcGxleCAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfbW9uaXRvciggdm9pZCAqYXJnICkKK3sKKyAgICBEV09SRCAgICAgICAgd2FpdF9zdGF0dXM7CisgICAga21wX3RocmVhZF90IG1vbml0b3I7CisgICAgaW50ICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgaW50ZXJ2YWw7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfbW9uaXRvcik7CisgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMiApOyAgICAvLyBBQzogU2lnbmFsIHRoZSBsaWJyYXJ5IHRoYXQgbW9uaXRvciBoYXMgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGlkZSAiMiIgaW4gZW51bSAobGlrZSB7dHJ1ZSxmYWxzZSxzdGFydGVkfSkKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IGxhdW5jaGVkXG4iICkgKTsKKworICAgIG1vbml0b3IgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisKKyAgICAvKiBzZXQgdGhyZWFkIHByaW9yaXR5ICovCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUICk7CisgICAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRQcmlvcml0eSApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgLyogcmVnaXN0ZXIgdXMgYXMgbW9uaXRvciAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAjZXJyb3IgIlRoaXMgZGVmaW5lIGNhdXNlcyBwcm9ibGVtcyB3aXRoIExvYWRMaWJyYXJ5KCkgKyBkZWNsc3BlYyh0aHJlYWQpICIgXAorICAgICAgICAib24gV2luZG93cyogT1MuICBTZWUgQ1E1MDU2NCwgdGVzdHMga21wX2xvYWRfbGlicmFyeSouYyBhbmQgdGhpcyBNU0ROICIgXAorICAgICAgICAicmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODgxNiIKKyAgICAvL19fa21wX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIGludGVydmFsID0gKCAxMDAwIC8gX19rbXBfbW9uaXRvcl93YWtldXBzICk7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworCisgICAgd2hpbGUgKCEgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAvKiAgVGhpcyB0aHJlYWQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKi8KKworICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2xhdW5jaF9tb25pdG9yOiB1cGRhdGVcbiIgKSApOworCisgICAgICAgIHdhaXRfc3RhdHVzID0gV2FpdEZvclNpbmdsZU9iamVjdCggX19rbXBfbW9uaXRvcl9ldiwgaW50ZXJ2YWwgKTsKKworICAgICAgICBpZiAod2FpdF9zdGF0dXMgPT0gV0FJVF9USU1FT1VUKSB7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBmaW5pc2hlZFxuIiApICk7CisKKyAgICBzdGF0dXMgPSBTZXRUaHJlYWRQcmlvcml0eSggbW9uaXRvciwgVEhSRUFEX1BSSU9SSVRZX05PUk1BTCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICE9IDApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgICovCisgICAgICAgIC8qIHRoZSB2YWx1ZSBvZiB0X2Fib3J0IGlzIHRoZSBzaWduYWwgd2UgY2F1Z2h0ICovCisKKyAgICAgICAgaW50IGd0aWQ7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiB0ZXJtaW5hdGUgc2lnPSVkXG4iLCAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgU2xlZXAoIDAgKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHJhaXNlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA+IDApIHsKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKworICAgIEtNUF9NQigpOworICAgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQKK19fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKQoreworICAgIGttcF90aHJlYWRfdCAgIGhhbmRsZTsKKyAgICBEV09SRCAgICAgICAgICBpZFRocmVhZDsKKyAgICAKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgCisgICAgaWYgKCBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworICAgICAgICBpbnQgICAgIHN0YWNrX2RhdGE7CisKKyAgICAgICAgLyogVE9ETzogR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgaXMgdW5zdWl0YWJsZSBmb3Igb3RoZXIgdGhyZWFkcyB0byB1c2UuCisgICAgICAgICAgIElzIGl0IGFwcHJvcHJpYXRlIHRvIGp1c3QgdXNlIEdldEN1cnJlbnRUaHJlYWQ/ICBXaGVuIHNob3VsZCB3ZSBjbG9zZSB0aGlzIGhhbmRsZT8gIFdoZW4KKyAgICAgICAgICAgdW5yZWdpc3RlcmluZyB0aGUgcm9vdD8KKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgQk9PTCByYzsKKyAgICAgICAgICAgIHJjID0gRHVwbGljYXRlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCIgX19rbXBfY3JlYXRlX3dvcmtlcjogUk9PVCBIYW5kbGUgZHVwbGljYXRlZCwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCl0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgICAgIC8qIHdlIHdpbGwgZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBzdGFjayByYW5nZSBpZiBndGlkX21vZGUgPT0gMSAqLworICAgICAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICAgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IHN0YWNrX3NpemUgPSAlIiBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXNcbiIsIHN0YWNrX3NpemUgKSApOworICAgICAgICAKKyAgICAgICAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworICAgICAgICAKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKyAgICAgICAgCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogKGJlZm9yZSkgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICImaWRUaHJlYWQgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChTSVpFX1QpIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgJiBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsICZpZFRocmVhZCApICk7CisgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKyAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBoYW5kbGUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudENyZWF0ZVRocmVhZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKyAgICAKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7Cit9CisKK2ludAorX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCkgeworICAgIHJldHVybiAoV0FJVF9USU1FT1VUID09IFdhaXRGb3JTaW5nbGVPYmplY3QoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCkpOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGttcF90aHJlYWRfdCAgICAgICAgaGFuZGxlOworICAgIERXT1JEICAgICAgICAgICAgICAgaWRUaHJlYWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpZGVhbCwgbmV3X2lkZWFsOworICAgIGludCAgICAgY2FsbGVyX2d0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9tb25pdG9yX2V2ID0gQ3JlYXRlRXZlbnQoIE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMICk7CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX2V2ID09IE5VTEwgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggX19rbXBfbW9uaXRvcl9ldiwgIkV2ZW50IiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworCisgICAgLy8gRklYTUUgLSBvbiBXaW5kb3dzKiBPUywgaWYgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMCwgZmlndXJlIG91dCBob3cKKyAgICAvLyB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBzdGFja3NpemUgYmFzZWQgb24gQ3JlYXRlVGhyZWFkIGVycm9yIGNvZGUuCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogcmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKworICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF9tb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKK30KKworLyoKKyAgQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4KKworICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5CisgICAgICAgICByZXR1cm4gU1RJTExfQUxJVkUgaW4gZXhpdF92YWwgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuCisqLworCitpbnQKK19fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKQoreworICAgIERXT1JEIHJjOworICAgIHJjID0gR2V0RXhpdENvZGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgZXhpdF92YWwgKTsKKyAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJHZXRFeGl0Q29kZVRocmVhZCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gKCAqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICk7Cit9CisKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBFeGl0VGhyZWFkKCBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisvKgorICAgIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF9jb21tb24oIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgRFdPUkQgZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyoKKyAgICAgICAgMjAwNi0xMC0xOToKKworICAgICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisKKyAgICAgICAgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZCBleGl0cyBmcm9tIHRocmVhZAorICAgICAgICAgICAgICAgZnVuY3Rpb24uIChGb3IgZXhhbXBsZSwgc2VlIEM3MDc3MC9RMzk0MjgxICJ1bmxvYWRpbmcgb2YgZGxsIGJhc2VkIG9uIE9NUCBpcyB2ZXJ5CisgICAgICAgICAgICAgICBzbG93Ii4pCisgICAgICAgICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqIGRzX2FsaXZlIHJlc2V0dGluZy4KKworICAgICovCisKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZSBLTVBfV0FJVF9ZSUVMRCB0bworICAgICAgICAvLyBjb3ZlciB0aGlzIHVzYWdlIGFsc28uCisgICAgICAgIHZvaWQgKiBvYmogPSBOVUxMOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIHNwaW5zOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopICYgdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgICAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBfX2ttcF9zdGF0aWNfZGVsYXkoIFRSVUUgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgICAgICB9IHdoaWxlICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICYmIFRDUl80KCB0aC0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSApICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSApIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19DQU5DRUwoIG9iaiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisKKyAgICAvKgorICAgICAqIE5PVEU6ICBUaGUgRXhpdFByb2Nlc3MoY29kZSkgc3lzdGVtIGNhbGwgY2F1c2VzIGFsbCB0aHJlYWRzIHRvIFRlcm1pbmF0ZQorICAgICAqICAgICAgICB3aXRoIGEgZXhpdF92YWwgPSBjb2RlLiAgQmVjYXVzZSBvZiB0aGlzIHdlIGNhbiBub3QgcmVseSBvbgorICAgICAqICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICovCisgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogdGhyZWFkIHN0aWxsIGFjdGl2ZS5cbiIgKSApOworICAgIH0gZWxzZSBpZiAoICh2b2lkICopIGV4aXRfdmFsICE9ICh2b2lkICopIHRoKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogRXhpdFByb2Nlc3MgLyBUZXJtaW5hdGVUaHJlYWQgdXNlZD9cbiIgKSApOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsCisgICAgICAgICgKKyAgICAgICAgICAgICJfX2ttcF9yZWFwX2NvbW1vbjogZG9uZSByZWFwaW5nICglZCksIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQKKyAgICAgICAgKQorICAgICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgICAgPSAwOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgICAgICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gMDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIC8vIElmIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIHRpZCBhbmQgZ3RpZCBzaG91bGQgYmUgS01QX0dUSURfTU9OSVRPUi4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgMCwgaXQgbWVhbnMgdGhlIG1vbml0b3IgZGlkIG5vdCBldmVyIHN0YXJ0LgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSBLTVBfR1RJRF9ETkUsIHRoZSBtb25pdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPT0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgIGlmICggdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgc3RhdHVzID0gU2V0RXZlbnQoIF9fa21wX21vbml0b3JfZXYgKTsKKyAgICBpZiAoIHN0YXR1cyA9PSBGQUxTRSApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEV2ZW50ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX21vbml0b3I6IHJlYXBpbmcgdGhyZWFkICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIF9fa21wX3JlYXBfY29tbW9uKCB0aCApOworCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIF9fa21wX21vbml0b3JfZXYgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqIHRoICkKK3sKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiByZWFwaW5nIHRocmVhZCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBfX2ttcF9yZWFwX2NvbW1vbiggdGggKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDAgKSB7CisgICAgICAgIC8vIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMuCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9Cit9IC8vIF9fa21wX3RlYW1faGFuZGxlcgorCisKKworc3RhdGljCitzaWdfZnVuY190IF9fa21wX3NpZ25hbCggaW50IHNpZ251bSwgc2lnX2Z1bmNfdCBoYW5kbGVyICkgeworICAgIHNpZ19mdW5jX3Qgb2xkID0gc2lnbmFsKCBzaWdudW0sIGhhbmRsZXIgKTsKKyAgICBpZiAoIG9sZCA9PSBTSUdfRVJSICkgeworICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJzaWduYWwiICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcigKKyAgICBpbnQgICAgICAgICAgIHNpZywKKyAgICBzaWdfZnVuY190ICAgIGhhbmRsZXIsCisgICAgaW50ICAgICAgICAgICBwYXJhbGxlbF9pbml0CispIHsKKyAgICBzaWdfZnVuY190IG9sZDsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQl9UUkFDRSggNjAsICgiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgaGFuZGxlciApOworICAgICAgICAvLyBTSUdfREZMIG9uIFdpbmRvd3MqIE9TIGluIE5VTEwgb3IgMC4KKyAgICAgICAgaWYgKCBvbGQgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdICkgeworICAgICAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlL2tlZXAgdXNlcidzIGhhbmRsZXIgaWYgb25lIHByZXZpb3VzbHkgaW5zdGFsbGVkLgorICAgICAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNhdmUgaW5pdGlhbC9zeXN0ZW0gc2lnbmFsIGhhbmRsZXJzIHRvIHNlZSBpZiB1c2VyIGhhbmRsZXJzIGluc3RhbGxlZC4KKyAgICAgICAgLy8gMjAwOS0wOS0yMzogSXQgaXMgYSBkZWFkIGNvZGUuIE9uIFdpbmRvd3MqIE9TIF9fa21wX2luc3RhbGxfc2lnbmFscyBjYWxsZWQgb25jZSB3aXRoCisgICAgICAgIC8vIHBhcmFsbGVsX2luaXQgPT0gVFJVRS4KKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIFNJR19ERkwgKTsKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gb2xkOworICAgICAgICBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30gLy8gX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkgeworICAgIGlmICggX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSApIHsKKyAgICAgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBjYWxsZWQ6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApOworICAgICAgICBpZiAoIG9sZCAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gTlVMTDsKKyAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDA7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyCisKKwordm9pZAorX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgaWYgKCAhIF9fa21wX2hhbmRsZV9zaWduYWxzICkgeworICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFsczogS01QX0hBTkRMRV9TSUdOQUxTIGlzIGZhbHNlIC0gaGFuZGxlcnMgbm90IGluc3RhbGxlZFxuIiApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lMTCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0ZQRSwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1RFUk0sIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworfSAvLyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMKKworCit2b2lkCitfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApCit7CisgICAgaW50IHNpZzsKKyAgICBLQl9UUkFDRSggMTAsICgiX19rbXBfcmVtb3ZlX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIERXT1JEIHN0YXR1czsKKworICAgIHN0YXR1cyA9IFNsZWVwRXgoIChEV09SRCkgbWlsbGlzLCBGQUxTRSApOworICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiU2xlZXBFeCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorfQorCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLiAqLworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKQoreworICAgIERXT1JEIHN0YXR1czsKKyAgICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbHBCdWZmZXI7CisgICAgU0laRV9UIGR3TGVuZ3RoOworCisgICAgZHdMZW5ndGggPSBzaXplb2YoTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OKTsKKworICAgIHN0YXR1cyA9IFZpcnR1YWxRdWVyeSggYWRkciwgJmxwQnVmZmVyLCBkd0xlbmd0aCApOworCisgICAgcmV0dXJuICEoKCggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX1JFU0VSVkUpIHx8ICggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX0ZSRUUgKSkgfHwKKyAgICAgICAoKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfTk9BQ0NFU1MgKSB8fCAoIGxwQnVmZmVyLlByb3RlY3QgPT0gUEFHRV9FWEVDVVRFICkpKTsKK30KKwora21wX3VpbnQ2NAorX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCit7CisgICAga21wX3VpbnQ2NCByID0gMDsKKworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikgJnIpOworICAgIHJldHVybiByOworfQorCisvKiBGcmVlIGhhbmRsZSBhbmQgY2hlY2sgdGhlIGVycm9yIGNvZGUgKi8KK3ZvaWQKK19fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApCit7CisvKiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgdHlwZSBIQU5ETEUgYWxzbywgdGh1cyBzdXBwb3NlIGttcF90aHJlYWRfdCBkZWZpbmVkIGFzIEhBTkRMRSAqLworICAgIEJPT0wgcmM7CisgICAgcmMgPSBDbG9zZUhhbmRsZSggdEhhbmRsZSApOworICAgIGlmICggIXJjICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2xvc2VIYW5kbGUgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworaW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkgeworCisgICAgc3RhdGljIFVMT05HIGdsYl9idWZmX3NpemUgPSAxMDAgKiAxMDI0OworCisgICAgc3RhdGljIGludCAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgICAgICAgID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorICAgIE5UU1RBVFVTICBzdGF0dXMgICAgICAgID0gMDsKKyAgICBVTE9ORyAgICAgYnVmZl9zaXplICAgICA9IDA7CisgICAgVUxPTkcgICAgIGluZm9fc2l6ZSAgICAgPSAwOworICAgIHZvaWQgKiAgICBidWZmZXIgICAgICAgID0gTlVMTDsKKyAgICBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gc3BpID0gTlVMTDsKKyAgICBpbnQgZmlyc3RfdGltZSAgICAgICAgICA9IDE7CisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOyAvL3N0YXJ0LCBmaW5pc2g7CisKKyAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBydW5uaW5nIGFsZ29yaXRobSBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID09IE5VTEwgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgZG8geworCisgICAgICAgIGlmICggZmlyc3RfdGltZSApIHsKKyAgICAgICAgICAgIGJ1ZmZfc2l6ZSA9IGdsYl9idWZmX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSAyICogYnVmZl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgYnVmZl9zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oIFN5c3RlbVByb2Nlc3NJbmZvcm1hdGlvbiwgYnVmZmVyLCBidWZmX3NpemUsICYgaW5mb19zaXplICk7CisgICAgICAgIGZpcnN0X3RpbWUgPSAwOworCisgICAgfSB3aGlsZSAoIHN0YXR1cyA9PSBTVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0ggKTsKKyAgICBnbGJfYnVmZl9zaXplID0gYnVmZl9zaXplOworCisgICAgI2RlZmluZSBDSEVDSyggY29uZCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjb25kICk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgKCBjb25kICkgKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgIENIRUNLKCBidWZmX3NpemUgPj0gaW5mb19zaXplICk7CisgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCBidWZmZXIgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSB1aW50cHRyX3QoIHNwaSApIC0gdWludHB0cl90KCBidWZmZXIgKTsKKyAgICAgICAgQ0hFQ0soIDAgPD0gb2Zmc2V0ICYmIG9mZnNldCArIHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSA8IGluZm9fc2l6ZSApOworICAgICAgICBIQU5ETEUgcGlkID0gc3BpLT5Qcm9jZXNzSWQ7CisgICAgICAgIFVMT05HIG51bSA9IHNwaS0+TnVtYmVyT2ZUaHJlYWRzOworICAgICAgICBDSEVDSyggbnVtID49IDEgKTsKKyAgICAgICAgc2l6ZV90IHNwaV9zaXplID0gc2l6ZW9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiApICsgc2l6ZW9mKCBTWVNURU1fVEhSRUFEICkgKiAoIG51bSAtIDEgKTsKKyAgICAgICAgQ0hFQ0soIG9mZnNldCArIHNwaV9zaXplIDwgaW5mb19zaXplICk7ICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcm9jZXNzIGluZm8gcmVjb3JkIGZpdHMgdGhlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCAhPSAwICkgeworICAgICAgICAgICAgQ0hFQ0soIHNwaV9zaXplIDw9IHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7ICAgLy8gQW5kIGRvIG5vdCBvdmVybGFwIHdpdGggdGhlIG5leHQgcmVjb3JkLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAvLyBwaWQgPT0gMCBjb3JyZXNwb25kcyB0byB0aGUgU3lzdGVtIElkbGUgUHJvY2Vzcy4gSXQgYWx3YXlzIGhhcyBydW5uaW5nIHRocmVhZHMKKyAgICAgICAgLy8gb24gYWxsIGNvcmVzLiBTbywgd2UgZG9uJ3QgY29uc2lkZXIgdGhlIHJ1bm5pbmcgdGhyZWFkcyBvZiB0aGlzIHByb2Nlc3MuCisgICAgICAgIGlmICggcGlkICE9IDAgKSB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBudW07ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgVEhSRUFEX1NUQVRFIHN0YXRlID0gc3BpLT5UaHJlYWRzWyBpIF0uU3RhdGU7CisgICAgICAgICAgICAgICAgLy8gQ291bnQgdGhyZWFkcyB0aGF0IGhhdmUgUmVhZHkgb3IgUnVubmluZyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogV2h5IGNvbW1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvZGU/Pz8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09IFN0YXRlUnVubmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgKysgcnVubmluZ190aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGNvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBpZiB0aGUgbnVtYmVyIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgICAgICAgICAgICAgIGlmICggcnVubmluZ190aHJlYWRzID49IG1heCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgfSAvLyBpZgorICAgICAgICBpZiAoIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCB1aW50cHRyX3QoIHNwaSApICsgc3BpLT5OZXh0RW50cnlPZmZzZXQgKTsKKyAgICB9OyAvLyBmb3JldmVyCisKKyAgICAjdW5kZWYgQ0hFQ0sKKworICAgIGZpbmlzaDogLy8gQ2xlYW4gdXAgYW5kIGV4aXQuCisKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICBnbGJfcnVubmluZ190aHJlYWRzID0gcnVubmluZ190aHJlYWRzOworCisgICAgICAgIHJldHVybiBydW5uaW5nX3RocmVhZHM7CisKK30gLy9fX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCkKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvYnVpbGQucGwgYi9yYzEvcnVudGltZS90b29scy9idWlsZC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDU2NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvYnVpbGQucGwKQEAgLTAsMCArMSw3NzAgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgUHJhZ21hcy4KK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKKyMgU3RhbmRhcmQgbW9kdWxlcy4KK3VzZSBEYXRhOjpEdW1wZXI7ICAgICMgTm90IGFjdHVhbGx5IHVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBkdW1wcy4KKworIyBFbmFibGUgYGxpYm9tcC90b29scy9saWIvJyBtb2R1bGUgZGlyZWN0b3J5LgordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKKyMgTElCT01QIG1vZHVsZXMuCit1c2UgQnVpbGQ7Cit1c2UgTGliT01QOwordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgVW5hbWU7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAxNyI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW1wb3J0YW50IHZhcmlhYmxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJHJvb3RfZGlyICA9ICRFTlZ7IExJQk9NUF9XT1JLIH07CisKK215ICVtYWtlZmlsZXMgPSAoCisgICAgcnRsICAgICAgID0+IGNhdF9maWxlKCAkcm9vdF9kaXIsICJzcmMiLCAgICAgICAgICAgICAgICAgICAgICAgIm1ha2VmaWxlLm1rIiApLAorICAgIHRpbWVsaW1pdCA9PiBjYXRfZmlsZSggJHJvb3RfZGlyLCAidG9vbHMiLCAic3JjIiwgInRpbWVsaW1pdCIsICJtYWtlZmlsZS5tayIgKSwKKyk7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBvc3NpYmxlIG9wdGlvbnMuCisjICAgICAqIHRhcmdldHM6IGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMgdGhlIG9wdGlvbiBoYXMgbWVhbmluZyBmb3IuIEZvciBleGFtcGxlLAorIyAgICAgICAgICJ2ZXJzaW9uIiBvcHRpb24gKDQgb3IgNSkgaGFzIGEgbWVhbmluZyBvbmx5IGZvciAicnRsIiB0YXJnZXQsIHdoaWxlICJtb2RlIiBvcHRpb24gaGFzCisjICAgICAgICAgbWVhbmluZyBmb3IgYWxsIHRhcmdldHMuCisjICAgICAqIGJhc2U6IElmIGJhc2UgaXMgdHJ1ZSB0aGlzIGlzIGEgYmFzZSBvcHRpb24uIEFsbCB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGJhc2Ugb3B0aW9ucyBhcmUKKyMgICAgICAgICBpdGVyYXRlZCBpZiAiLS1hbGwiIG9wdGlvbiBpcyBzcGVjaWZpZWQuIElmIGJhc2UgaXMgMCwgdGhpcyBpcyBhbiBleHRyYSBvcHRpb24uCisjICAgICAqIHBhcmFtczogQSBoYXNoIG9mIHBvc3NpYmxlIG9wdGlvbiB2YWx1ZXMuICIqIiBkZW5vdGVzIGRlZmF1bHQgb3B0aW9uIHZhbHVlLiBGb3IgZXhhbXBsZSwKKyMgICAgICAgICBpZiAidmVyc2lvIiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgIi0tdmVyc2lvbj01IiB3aWxsIGJlIHVzZWQgaW1wbGljaXRseS4KKyMgICAgICogc3VmZnV4OiBPbmx5IGZvciBleHRyYSBvcHRpb25zLiBTdWJyb3V0aW5lIHJldHVybmluZyBzdWZmaXggZm9yIGJ1aWxkIGFuZCBvdXRwdXQKKyMgICAgICAgICBkaXJlY3Rvcmllcy4KK215ICRvcHRzID0geworICAgICJ0YXJnZXQiICAgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAiIiwgICAgICAgICAgICAgICAgICBiYXNlID0+IDEsIHBhcm1zID0+IHsgbWFwKCAoICRfID0+ICIiICksIGtleXMoICVtYWtlZmlsZXMgKSApLCBydGwgPT4gIioiIH0sIH0sCisgICAgInZlcnNpb24iICAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMSwgcGFybXMgPT4geyA1ICAgICAgID0+ICIqIiwgNCAgICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCB9LAorICAgICJsaWItdHlwZSIgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDEsIHBhcm1zID0+IHsgbm9ybWFsICA9PiAiKiIsIHN0dWJzID0+ICIiICAgICAgICAgICAgICAgICAgfSwgfSwKKyAgICAibGluay10eXBlIiAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAxLCBwYXJtcyA9PiB7IGR5bmFtaWMgPT4gIioiLCBzdGF0aWMgICAgPT4gIiIgICAgICAgICAgICAgIH0sIH0sCisgICAgInRhcmdldC1jb21waWxlciIgPT4geyB0YXJnZXRzID0+ICJydGwsZHNsIiwgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyAxMiAgICAgID0+ICIqIiwgMTEgICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXTsgICAgICAgICAgICAgICAgICAgICAgIH0gfSwKKyAgICAibW9kZSIgICAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCxkc2wsdGltZWxpbWl0IiwgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IHJlbGVhc2UgPT4gIioiLCBkaWFnICAgICAgPT4gIiIsIGRlYnVnID0+ICIiIH0sIHN1ZmZpeCA9PiBzdWIgeyBzdWJzdHIoICRfWyAwIF0sIDAsIDMgKTsgICAgICAgfSB9LAorICAgICJvbXAtdmVyc2lvbiIgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgNDAgPT4gIioiLCAzMCA9PiAiIiwgMjUgPT4gIiIgfSwgc3VmZml4ID0+IHN1YiB7ICRfWyAwIF07IH0gfSwKKyAgICAiY292ZXJhZ2UiICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IG9mZiAgICAgPT4gIioiLCBvbiAgICAgICAgPT4gIiIgICAgICAgICAgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyAkX1sgMCBdIGVxICJvbiIgPyAiYzEiIDogImMwIjsgfSB9LAorICAgICJ0Y2hlY2siICAgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgMCAgICAgICA9PiAiKiIsIDEgICAgICAgICA9PiAiIiwgMiA9PiAiIiAgICAgfSwgc3VmZml4ID0+IHN1YiB7ICJ0IiAuICRfWyAwIF07ICAgICAgICAgICAgICAgICB9IH0sCisgICAgIm1pYy1hcmNoIiAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyBrbmYgICAgID0+ICIqIiwga25jICAgICAgID0+ICIiLCBrbmwgPT4gIiIgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXTsgICAgICAgICAgICAgICAgICAgICAgIH0gfSwKKyAgICAibWljLW9zIiAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IGJzZCAgICAgPT4gIioiLCBsaW4gICAgICAgPT4gIiIgICAgICAgICAgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyAkX1sgMCBdOyAgICAgICAgICAgICAgICAgICAgICAgfSB9LAorICAgICJtaWMtY29tcCIgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgbmF0aXZlICA9PiAiKiIsIG9mZmxvYWQgICA9PiAiIiAgICAgICAgICAgICAgfSwgc3VmZml4ID0+IHN1YiB7IHN1YnN0ciggJF9bIDAgXSwgMCwgMyApOyAgICAgICB9IH0sCit9OworbXkgJHN5bm9ueW1zID0geworICAgICJkZWJ1ZyIgPT4gWyBxd3sgZGJnIGRlYmcgfSBdLAorfTsKKyMgVGhpcyBhcnJheSBzcGVjaWZpZXMgb3JkZXIgb2Ygb3B0aW9ucyB0byBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBrZXlzKCAlJG9wdHMgKS4KK215IEBhbGxfb3B0cyAgID0gcXd7IHRhcmdldCB2ZXJzaW9uIGxpYi10eXBlIGxpbmstdHlwZSB0YXJnZXQtY29tcGlsZXIgbW9kZSBvbXAtdmVyc2lvbiBjb3ZlcmFnZSB0Y2hlY2sgbWljLWFyY2ggbWljLW9zIG1pYy1jb21wIH07CisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgYmFzZSBvcHRpb25zLgorbXkgQGJhc2Vfb3B0cyAgPSBncmVwKCAkb3B0cy0+eyAkXyB9LT57IGJhc2UgfSA9PSAxLCBAYWxsX29wdHMgKTsKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiBleHRyYSBvcHRpb25zLgorbXkgQGV4dHJhX29wdHMgPSBncmVwKCAkb3B0cy0+eyAkXyB9LT57IGJhc2UgfSA9PSAwLCBAYWxsX29wdHMgKTsKKworc3ViIHN1ZmZpeCgkJCQpIHsKKyAgICBteSAoICRvcHQsICR2YWx1ZSwgJHNraXBfaWZfZGVmYXVsdCApID0gQF87CisgICAgbXkgJHN1ZmZpeCA9ICIiOworICAgIGlmICggbm90ICRza2lwX2lmX2RlZmF1bHQgb3IgJHZhbHVlIG5lICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0gKSB7CisgICAgICAgICRzdWZmaXggPSAkb3B0cy0+eyAkb3B0IH0tPnsgc3VmZml4IH0tPiggJHZhbHVlICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3VmZml4OworfTsgIyBzdWIgc3VmZml4CisKK215ICRzY3V0cyA9IHt9OyAgICAgIyBTaG9ydGN1dHMuIFdpbGwgaGVscCB0byBsb2NhdGUgcHJvcGVyIGl0ZW0gaW4gJG9wdHMuCitmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsKKyAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICBpZiAoICRwYXJtICF+IG17XEEoPzpbMDEyXXxvbnxvZmYpXHp9ICkgeworICAgICAgICAgICAgJHNjdXRzLT57ICRwYXJtIH0gPSAkb3B0cy0+eyAkb3B0IH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9IGVxICIqIiApIHsKKyAgICAgICAgICAgICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0gPSAkcGFybTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkcGFybQorfTsgIyBmb3JlYWNoICRvcHQKKworc3ViIHBhcnNlX29wdGlvbihAKSB7CisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGV2ZXJ5IG9wdGlvbi4gJG5hbWUgaXMgb3B0aW9uIG5hbWUsICR2YWx1ZSBpcyBvcHRpb24gdmFsdWUuCisgICAgIyBGb3IgYm9vbGVhbiBvcHRpb25zICR2YWx1ZSBpcyBlaXRoZXIgMSBvciAwLAorICAgIG15ICggJG5hbWUsICR2YWx1ZSApID0gQF87CisgICAgaWYgKCAkbmFtZSBlcSAiYWxsIiBvciAkbmFtZSBlcSAiQUxMIiApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzLT57ICRvcHQgfS0+eyBiYXNlIH0gb3IgJG5hbWUgZXEgIkFMTCIgKSB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSA9IDE7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkb3B0CisgICAgICAgIHJldHVybjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBleGlzdHMoICRvcHRzLT57ICRuYW1lIH0gKSApIHsKKyAgICAgICAgIyBTdXBwb3NlIGl0IGlzIG9wdGlvbiB3aXRoIGV4cGxpY2l0IHZhbHVlLCBsaWtlICJ0YXJnZXQ9bm9ybWFsIi4KKyAgICAgICAgaWYgKCAkdmFsdWUgZXEgImFsbCIgKSB7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSA9IDE7CisgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNpZiAoIGV4aXN0cyggJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57ICR2YWx1ZSB9ICkgKSB7CisgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJHZhbHVlIH0gPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2lmICggJHZhbHVlIGVxICIiIGFuZCBleGlzdHMoICRvcHRzLT57ICRuYW1lIH0tPnsgcGFybXMgfS0+eyBvbiB9ICkgKSB7CisgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgb24gfSA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRsaW5lX2Vycm9yKCAiSWxsZWdhbCB2YWx1ZSBvZiBcIiRuYW1lXCIgb3B0aW9uOiBcIiR2YWx1ZVwiIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgICMgT2ssIGl0IGlzIG5vdCBhbiBvcHRpb24gd2l0aCBleHBsaWNpdCB2YWx1ZS4gVHJ5IHRvIHRyZWF0IGlzIGFzIGEgYm9vbGVhbiBvcHRpb24uCisgICAgaWYgKCBleGlzdHMoICRzY3V0cy0+eyAkbmFtZSB9ICkgKSB7CisgICAgICAgICggJHZhbHVlIGVxICIxIiBvciAkdmFsdWUgZXEgIjAiICkgb3IgZGllICJJbnRlcm5hbCBlcnJvcjsgc3RvcHBlZCI7CisgICAgICAgICRzY3V0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJG5hbWUgfSA9ICR2YWx1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH07ICMgaWYKKyAgICAjIE5vLCBpdCBpcyBub3QgYSB2YWxpZCBvcHRpb24gYXQgYWxsLgorICAgIGNtZGxpbmVfZXJyb3IoICJJbGxlZ2FsIG9wdGlvbjogXCIkbmFtZVwiIiApOworfTsgIyBzdWIgcGFyc2Vfb3B0aW9uCisKK215ICRjbGVhbiAgICAgICAgPSAwOworbXkgJGNsZWFuX2NvbW1vbiA9IDA7CitteSAkY2xvYmJlciAgICAgID0gMDsKK215ICR0ZXN0X2RlcHMgICAgPSAxOworbXkgJHRlc3RfdG91Y2ggICA9IDE7CitteSBAZ29hbHM7CisKK3N1YiBzeW5vbnltcygkKSB7CisgICAgbXkgKCAkb3B0ICkgPSBAXzsKKyAgICByZXR1cm4gZXhpc3RzKCAkc3lub255bXMtPnsgJG9wdCB9ICkgPyAifCIgLiBqb2luKCAifCIsIEB7ICRzeW5vbnltcy0+eyAkb3B0IH0gfSApIDogIiI7Cit9OyAjIHN1YiBzeW5vbnltcworCitteSBAc3BlY3MgPSAoCisgICAgbWFwKCAoICIkXyIgLiBzeW5vbnltcyggJF8gKSAuICI9cyIgPT4gXCZwYXJzZV9vcHRpb24gKSwga2V5cyggJSRvcHRzICApICksCisgICAgbWFwKCAoICIkXyIgLiBzeW5vbnltcyggJF8gKSAuICIhIiAgPT4gXCZwYXJzZV9vcHRpb24gKSwga2V5cyggJSRzY3V0cyApICksCispOworbXkgJGFuc3dlcjsKK2dldF9vcHRpb25zKAorICAgIEBzcGVjcywKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYWxsIiAgICAgICAgICAgPT4gXCZwYXJzZV9vcHRpb24sCisgICAgIkFMTCIgICAgICAgICAgID0+IFwmcGFyc2Vfb3B0aW9uLAorICAgICJhbnN3ZXI9cyIgICAgICA9PiBcJGFuc3dlciwKKyAgICAidGVzdC1kZXBzISIgICAgPT4gXCR0ZXN0X2RlcHMsCisgICAgInRlc3QtdG91Y2ghIiAgID0+IFwkdGVzdF90b3VjaCwKKyAgICAidmVyc2lvbnx2ZXI6cyIgPT4KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSB0cmlja3kgb3B0aW9uLiBJdCBzcGVjaWZpZXMgbGlicmFyeSB2ZXJzaW9uIHRvIGJ1aWxkIGFuZCBpdCBpcyBhbHNvIGEgc3RhbmRhcmQKKyAgICAgICAgICAgICMgb3B0aW9uIHRvIHJlcXVlc3QgdG9vbCB2ZXJzaW9uLgorICAgICAgICAgICAgaWYgKCAkX1sgMSBdIGVxICIiICkgeworICAgICAgICAgICAgICAgICMgTm8gYXJndW1lbnRzID0+IHZlcnNpb24gcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBwcmludCggIiR0b29sIHZlcnNpb24gJFZFUlNJT05cbiIgKTsKKyAgICAgICAgICAgICAgICBleGl0KCAwICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICMgQXJndW1lbnRzID0+IHZlcnNpb24gdG8gYnVpbGQuCisgICAgICAgICAgICAgICAgcGFyc2Vfb3B0aW9uKCBAXyApCisgICAgICAgICAgICB9OworICAgICAgICB9LAorKTsKK0Bnb2FscyA9IEBBUkdWOworaWYgKCBncmVwKCAkXyBlcSAiY2xvYmJlciIsIEBnb2FscyApICkgeworICAgICRjbG9iYmVyID0gMTsKK307ICMgaWYKK2lmICggZ3JlcCggJF8gZXEgImNsZWFuIiwgQGdvYWxzICkgKSB7CisgICAgJGNsZWFuID0gMTsKK307ICMgaWYKKworIyBPaywgbm93ICRvcHRzIGlzIGZ1bGZpbGxlZCB3aXRoIDAsIDEgKGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSB1c2VyKSBhbmQgIiIgYW5kICIqIiAob3JpZ2luYWwKKyMgdmFsdWVzKS4gSW4gZWFjaCBvcHRpb24gYXQgbGVhc3Qgb25lIDEgc2hvdWxkIGJlIHByZXNlbnQgKG90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGJ1aWxkKS4KK2ZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkb3B0cyApICkgeworICAgIGlmICggbm90IGdyZXAoICRfIGVxICIxIiwgdmFsdWVzKCAleyAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfSB9ICkgKSApIHsKKyAgICAgICAgIyBObyBleHBsaWNpdCAiMSIgZm91bmQuIEVuYWJsZSBkZWZhdWx0IGNob2ljZSBieSByZXBsYWNpbmcgIioiIHdpdGggIjEiLgorICAgICAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9IGVxICIqIiApIHsKKyAgICAgICAgICAgICAgICAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9ID0gMTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoICRvcHQKKworIyBDbGVhciAkb3B0cy4gTGVhdmUgb25seSAiMSIuCitmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsKKyAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICBpZiAoICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9LT57ICRwYXJtIH0gbmUgIjEiICkgeworICAgICAgICAgICAgZGVsZXRlKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9ICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHBhcm0KK307ICMgZm9yZWFjaCAkb3B0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsbCBqb2IgcXVldWUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBlbnF1ZXVlX2pvYnMoJCRAKTsKK3N1YiBlbnF1ZXVlX2pvYnMoJCRAKSB7CisgICAgbXkgKCAkam9icywgJHNldCwgQHJlc3QgKSA9IEBfOworICAgIGlmICggQHJlc3QgKSB7CisgICAgICAgIG15ICRvcHQgPSBzaGlmdCggQHJlc3QgKTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgZXhpc3RzKCAkc2V0LT57IHRhcmdldCB9ICkKKyAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgJG9wdHMtPnsgJG9wdCB9LT57IHRhcmdldHMgfSAhfiBteyg/OlxBfCwpJHNldC0+eyB0YXJnZXQgfSg/Oix8XHopfQorICAgICAgICApIHsKKyAgICAgICAgICAgICMgVGhpcyBvcHRpb24gZG9lcyBub3QgaGF2ZSBtZWFuYW5pbmcgZm9yIHRoZSB0YXJnZXQsCisgICAgICAgICAgICAjIGRvIG5vdCBpdGVyYXRlLCBqdXN0IHVzZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgZW5xdWV1ZV9qb2JzKCAkam9icywgeyAkb3B0ID0+ICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0sICUkc2V0IH0sIEByZXN0ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRwYXJtICggc29ydCgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgKSB7CisgICAgICAgICAgICAgICAgZW5xdWV1ZV9qb2JzKCAkam9icywgeyAkb3B0ID0+ICRwYXJtLCAlJHNldCB9LCBAcmVzdCApOworICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBteSAkbWFrZWZpbGUgID0gJG1ha2VmaWxlc3sgJHNldC0+eyB0YXJnZXQgfSB9OworICAgICAgICBteSBAYmFzZSAgICAgID0gbWFwKCBzdWJzdHIoICRzZXQtPnsgJF8gfSwgMCwgMyApLCBAYmFzZV9vcHRzICk7CisgICAgICAgIG15IEBleHRyYSAgICAgPSBtYXAoIHN1ZmZpeCggJF8sICRzZXQtPnsgJF8gfSwgMCApLCBAZXh0cmFfb3B0cyApOworICAgICAgICBteSBAZXggICAgICAgID0gZ3JlcCggJF8gbmUgIiIsIG1hcCggc3VmZml4KCAkXywgJHNldC0+eyAkXyB9LCAxICksIEBleHRyYV9vcHRzICkgKTsKKyAgICAgICAgICAgICMgU2hvcnRlbmVkIHZlcnNpb24gb2YgQGV4dHJhIC0tIG9ubHkgbm9uLWRlZmF1bHQgdmFsdWVzLgorICAgICAgICBteSAkc3VmZml4ICAgID0gKCBAZXh0cmEgPyAiLiIgLiBqb2luKCAiLiIsIEBleHRyYSApIDogIiIgKTsKKyAgICAgICAgbXkgJGtuaWdodHMgICA9IGluZGV4KCAkc3VmZml4LCAia24iICkgLSAxOworICAgICAgICBpZiAoICR0YXJnZXRfcGxhdGZvcm0gIX4gImxyYiIgYW5kICRrbmlnaHRzID4gMCApIHsKKyAgICAgICAgICAgICRzdWZmaXggPSBzdWJzdHIoICRzdWZmaXgsIDAsICRrbmlnaHRzICk7CisgICAgICAgIH0KKyAgICAgICAgbXkgJHN1ZiAgICAgICA9ICggQGV4ID8gIi4iIC4gam9pbiggIi4iLCBAZXggKSA6ICIiICk7CisgICAgICAgICAgICAjIFNob3J0ZW5lZCB2ZXJzaW9uIG9mICRzaWZmaXggLS0gb25seSBub24tZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIG15ICRidWlsZF9kaXIgPSBqb2luKCAiLSIsICR0YXJnZXRfcGxhdGZvcm0sIGpvaW4oICJfIiwgQGJhc2UgKSAuICRzdWZmaXgsIFVuYW1lOjpob3N0X25hbWUoKSApOworICAgICAgICBteSAkb3V0X2FyY2hfZGlyID0gY2F0X2RpciggJEVOVnsgTElCT01QX0VYUE9SVFMgfSwgJHRhcmdldF9wbGF0Zm9ybSAuICRzdWYgKTsKKyAgICAgICAgbXkgJG91dF9jbW5fZGlyICA9IGNhdF9kaXIoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0sICJjb21tb24iICk7CisgICAgICAgIHB1c2goCisgICAgICAgICAgICBAJGpvYnMsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFrZWZpbGUgPT4gJG1ha2VmaWxlLAorICAgICAgICAgICAgICAgIG1ha2VfYXJncyA9PiBbCisgICAgICAgICAgICAgICAgICAgICJvcz0iICAgLiAkdGFyZ2V0X29zLAorICAgICAgICAgICAgICAgICAgICAiYXJjaD0iIC4gJHRhcmdldF9hcmNoLAorICAgICAgICAgICAgICAgICAgICAiTUlDX09TPSIgLiAkc2V0LT57ICJtaWMtb3MiIH0sCisgICAgICAgICAgICAgICAgICAgICJNSUNfQVJDSD0iIC4gJHNldC0+eyAibWljLWFyY2giIH0sCisgICAgICAgICAgICAgICAgICAgICJNSUNfQ09NUD0iIC4gJHNldC0+eyAibWljLWNvbXAiIH0sCisgICAgICAgICAgICAgICAgICAgICJkYXRlPSIgLiBCdWlsZDo6dHN0ciggJEJ1aWxkOjpzdGFydCApLAorICAgICAgICAgICAgICAgICAgICAiVEVTVF9ERVBTPSIgLiAoICR0ZXN0X2RlcHMgICA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiVEVTVF9UT1VDSD0iIC4gKCAkdGVzdF90b3VjaCA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiQ1BMVVNQTFVTPW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIkNPVkVSQUdFPSIgLiAkc2V0LT57IGNvdmVyYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uICJtb2RlIiBjb250cm9scyAzIG1ha2UgZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICMgICAgIGRlYnVnICAgPT4gRnVsbCBkZWJ1Z2dpbmcgICA6ICAgIGRpYWdub3N0aWNzLCAgICBkZWJ1ZyBpbmZvLCBubyBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICMgICAgIGRpYWcgICAgPT4gT25seSBkaWFnbm9zdGljcyA6ICAgIGRpYWdub3N0aWNzLCAgICBkZWJ1ZyBpbmZvLCAgICBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICMgICAgIHJlbGVhc2UgPT4gUHJvZHVjdGlvbiBidWlsZCA6IG5vIGRpYWdub3N0aWNzLCBubyBkZWJ1ZyBpbmZvLCAgICBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICJERUJVR19JTkZPPSIgLiAgICggJHNldC0+eyBtb2RlIH0gbmUgInJlbGVhc2UiID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJESUFHPSIgLiAgICAgICAgICggJHNldC0+eyBtb2RlIH0gbmUgInJlbGVhc2UiID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJPUFRJTUlaQVRJT049IiAuICggJHNldC0+eyBtb2RlIH0gbmUgImRlYnVnIiAgID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJMSUJfVFlQRT0iIC4gc3Vic3RyKCAkc2V0LT57ICJsaWItdHlwZSIgfSwgMCwgNCApLAorICAgICAgICAgICAgICAgICAgICAiTElOS19UWVBFPSIgLiBzdWJzdHIoICRzZXQtPnsgImxpbmstdHlwZSIgfSwgMCwgNCApLAorICAgICAgICAgICAgICAgICAgICAiT01QX1ZFUlNJT049IiAuICRzZXQtPnsgIm9tcC12ZXJzaW9uIiB9LAorICAgICAgICAgICAgICAgICAgICAiVVNFX1RDSEVDSz0iIC4gJHNldC0+eyB0Y2hlY2sgfSwKKyAgICAgICAgICAgICAgICAgICAgIlZFUlNJT049IiAuICRzZXQtPnsgdmVyc2lvbiB9LAorICAgICAgICAgICAgICAgICAgICAiVEFSR0VUX0NPTVBJTEVSPSIgLiAkc2V0LT57ICJ0YXJnZXQtY29tcGlsZXIiIH0sCisgICAgICAgICAgICAgICAgICAgICJzdWZmaXg9IiAuICRzdWYsCisgICAgICAgICAgICAgICAgICAgIEBnb2FscywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGJ1aWxkX2RpciAgPT4gJGJ1aWxkX2RpcgorICAgICAgICAgICAgfQorICAgICAgICApOyAjIHB1c2gKKyAgICB9OyAjIGlmCit9OyAjIHN1YiBlbnF1ZXVlX2pvYnMKKworbXkgQGpvYnM7CitlbnF1ZXVlX2pvYnMoIFxAam9icywge30sIEBhbGxfb3B0cyApOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERvIHRoZSB3b3JrLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkZXhpdCA9IDA7CisKK0J1aWxkOjppbml0KCk7CisKK2lmICggJGNsb2JiZXIgKSB7CisgICAgbXkgQGRpcnMgPSAoICRFTlZ7IExJQk9NUF9UTVAgfSwgJEVOVnsgTElCT01QX0VYUE9SVFMgfSwgY2F0X2RpciggJHJvb3RfZGlyLCAidG9vbHMiLCAiYmluIiAgKSApOworICAgIG15ICRyYyA9IDA7CisgICAgcXVlc3Rpb24oCisgICAgICAgICJDbG9iYmVyICIgLiBqb2luKCAiLCAiLCBtYXAoICJcIiIgLiBCdWlsZDo6c2hvcnRlciggJF8gKSAuICJcIiIsIEBkaXJzICkgKSAuICIgZGlycz8gIiwKKyAgICAgICAgJGFuc3dlciwKKyAgICAgICAgcXJ7XEEoeXx5ZXN8bnxubylcen1pCisgICAgKTsKKyAgICBpZiAoICRhbnN3ZXIgPX4gbXtcQXl9aSApIHsKKyAgICAgICAgaW5mbyggIkNsb2JiZXJpbmcuLi4iICk7CisgICAgICAgICRyYyA9IEJ1aWxkOjpjbGVhbiggQGRpcnMgKTsKKyAgICAgICAgaW5mbyggQnVpbGQ6OnJzdHIoICRyYyApICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJHJjICE9IDAgKSB7CisgICAgICAgICRleGl0ID0gMzsKKyAgICB9OyAjIGlmCit9IGVsc2UgeyAjIEJ1aWxkIG9yIGNsZWFuLgorICAgIGlmICggQGpvYnMgKSB7CisgICAgICAgIG15ICR0b3RhbCA9IEBqb2JzOyAgICAjIFRvdGFsIG51bWJlciBvZiBqb2JzLgorICAgICAgICBteSAkbiAgICAgPSAwOyAgICAgICAgIyBDdXJyZW50IGpvYiBudW1iZXIuCisgICAgICAgIEJ1aWxkOjpwcm9ncmVzcyggIiIsICIiICk7ICAgICAjIE91dHB1dCBlbXB0eSBsaW5lIHRvIGxvZyBmaWxlLgorICAgICAgICBteSAkZ29hbHMgPSBqb2luKCAiICIsIEBnb2FscyApOworICAgICAgICBCdWlsZDo6cHJvZ3Jlc3MoICJHb2FscyIsICRnb2FscyBlcSAiIiA/ICIoYWxsKSIgOiAkZ29hbHMgKTsKKyAgICAgICAgQnVpbGQ6OnByb2dyZXNzKCAiQ29uZmlndXJhdGlvbnMiLCBzY2FsYXIoIEBqb2JzICkgKTsKKyAgICAgICAgZm9yZWFjaCBteSAkam9iICggQGpvYnMgKSB7CisgICAgICAgICAgICArKyAkbjsKKyAgICAgICAgICAgIG15ICRiYXNlID0gZ2V0X2ZpbGUoICRqb2ItPnsgYnVpbGRfZGlyIH0gKTsKKyAgICAgICAgICAgIEJ1aWxkOjpwcm9ncmVzcyggIk1ha2luZyIsICIlM2Qgb2YgJTNkIDogJXMiLCAkbiwgJHRvdGFsLCAkYmFzZSApOworICAgICAgICAgICAgJGpvYi0+eyByYyB9ID0gQnVpbGQ6Om1ha2UoICRqb2IsICRjbGVhbiwgc3ByaW50ZiggIiVkLyVkIiwgJG4sICR0b3RhbCApICk7CisgICAgICAgIH07ICMgbXkgJGpvYgorICAgICAgICBteSAkZmFpbHVyZXMgPSBCdWlsZDo6c3VtbWFyeSgpOworICAgICAgICBpZiAoICRmYWlsdXJlcyA+IDAgKSB7CisgICAgICAgICAgICAkZXhpdCA9IDM7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvKCAiTm90aGluZyB0byBkby4iICk7CisgICAgfTsgIyBpZgorfTsgIyBpZgorCisjIEFuZCBleGl0LgorZXhpdCggJGV4aXQgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKKworQjxidWlsZC5wbD4gLS0gQnVpbGQgb25lIG9yIG1vcmUgY29uZmlndXJhdGlvbnMgb2YgT01QIFJUTCBsaWJyYXJpZXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGJ1aWxkLnBsPiBJPG9wdGlvbj4uLi4gW0I8LS0+XSBJPG1ha2Utb3B0aW9uPi4uLiBJPHZhcmlhYmxlPi4uLiBJPGdvYWw+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hbGw+CisKK0J1aWxkIGFsbCBiYXNlIGNvbmZpZ3VyYXRpb25zLgorCis9aXRlbSBCPC0tQUxMPgorCitCdWlsZCByZWFsbHkgYWxsIGNvbmZpZ3VyYXRpb25zLCBpbmNsdWRpbmcgZXh0cmEgb25lcy4KKworPWl0ZW0gQjwtLWFuc3dlcj0+STxzdHI+CisKK1VzZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGRlZmF1bHQgYW5zd2VyIHRvIGFsbCBxdWVzdGlvbnMuCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIGJ1aWxkLiBEZWZhdWx0IGlzIGFyY2hpdGVjdHVyZSBvZiBob3N0IG1hY2hpbmUuIEk8YXJjaD4gY2FuIGJlIEM8MzI+LAorQzwzMmU+LCBvciBvbmUgb2Yga25vd24gYWxpYXNlcyBsaWtlIEM8SUEzMj4uCisKK0lmIGFyY2hpdGVjdHVyZSBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuCitJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwgaG9zdCBhcmNoaXRlY3R1cmUgZGV0ZWN0ZWQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuIERlZmF1bHQgaXMgT1Mgb2YgaG9zdCBtYWNoaW5lLiBJPG9zPiBjYW4gYmUgQzxsaW4+LCBDPGxyYj4sIEM8bWFjPiwgQzx3aW4+LAorb3Igb25lIG9mIGtub3duIGFsaWFzZXMgbGlrZSBDPExpbnV4PiwgQzxXaW5OVD4sIGV0Yy4KKworPWl0ZW0gQjwtLW1pYy1vcz0+STxvcz4KKworU3BlY2lmeSBPUyBvbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgY2FyZC4gRGVmYXVsdCBpcyBDPGJzZD4uIEk8b3M+IGNhbiBiZSBDPGJzZD4sIEM8bGluPi4KKworPWl0ZW0gQjwtLW1pYy1hcmNoPT5JPGFyY2g+CisKK1NwZWNpZnkgYXJjaGl0ZWN0dXJlIG9mIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBjYXJkLiBEZWZhdWx0IGlzIEM8a25mPi4gSTxhcmNoPiBjYW4gYmUgQzxrbmY+LCBDPGtuYz4sIEM8a25sPi4KKworPWl0ZW0gQjwtLW1pYy1jb21wPT5JPGNvbXBpbGVyLXR5cGU+CisKK1NwZWNpZnkgd2hldGhlciB0aGUgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQ29tcGlsZXIgaXMgbmF0aXZlIG9yIG9mZmxvYWQuIERlZmF1bHQgaXMgQzxuYXRpdmU+LgorSTxjb21waWxlci10eXBlPiBjYW4gYmUgQzxuYXRpdmU+IG9yIEM8b2ZmbG9hZD4uCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHRlc3QtZGVwcz4KKworRW5hYmxlIG9yIGRpc2FibGUgQzx0ZXN0LWRlcHM+LiBUaGUgdGVzdCBydW5zIGluIGFueSBjYXNlLCBidXQgcmVzdWx0IG9mIGRpc2FibGVkIHRlc3QgaXMgaWdub3JlZC4KK0J5IGRlZmF1bHQsIHRlc3QgaXMgZW5hYmxlZC4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8dGVzdC10b3VjaD4KKworRW5hYmxlIG9yIGRpc2FibGUgQzx0ZXN0LXRvdWNoPi4gVGhlIHRlc3QgcnVucyBpbiBhbnkgY2FzZSwgYnV0IHJlc3VsdCBvZiBkaXNhYmxlZCB0ZXN0IGlzIGlnbm9yZWQuCitCeSBkZWZhdWx0LCB0ZXN0IGlzIGVuYWJsZWQuCisKKz1pdGVtIEJhc2UgQ29uZmlndXJhdGlvbiBTZWxlY3Rpb24gT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tdGFyZ2V0PT5JPHRhcmdldD4KKworQnVpbGQgc3BlY2lmaWVkIHRhcmdldCwgZWl0aGVyIEM8cnRsPiAoT01QIFJ1bnRpbWUgTGlicmFyeTsgZGVmYXVsdCksCitvciBDPHRpbWVsaW1pdD4gKHByb2dyYW0gdXNlZCBpbiB0ZXN0aW5nKSwgb3IgQzxhbGw+LgorCis9aXRlbSBCPC0tbGliLXR5cGU9Pkk8bGliPgorCitCdWlsZCBzcGVjaWZpZWQgbGlicmFyeSwgZWl0aGVyIEM8bm9ybWFsPiAoZGVmYXVsdCksIG9yIEM8c3R1YnM+LCBvciBDPGFsbD4uCisKKz1pdGVtIEI8LS1saW5rLXR5cGU9Pkk8dHlwZT4KKworQnVpbGQgc3BlY2lmaWVkIGxpbmsgdHlwZSwgZWl0aGVyIEM8ZHluYW1pYz4gKGRlZmF1bHQpIG9yIEM8YWxsPi4KKworPWJhY2sKKworPWl0ZW0gRXh0cmEgQ29uZmlndXJhdGlvbiBTZWxlY3Rpb24gT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tY292ZXI9Pkk8c3dpdGNoPgorCitCdWlsZCBmb3IgY29kZSBjb3ZlcmFnZSBkYXRhIGNvbGxlY3Rpb24uIEk8c3dpdGNoPiBjYW4gYmUgQzxvZmY+IChkZWZhdWx0KSwgQzxvbj4KK29yIEM8YWxsPi4KKworPWl0ZW0gQjwtLW1vZGU9Pkk8bW9kZT4KKworQnVpbGQgbGlicmFyeSBvZiBzcGVjaWZpZWQgSTxtb2RlPiwgZWl0aGVyIEM8ZGVidWc+LCBDPGRpYWc+LCBDPHJlbGVhc2U+IChkZWZhdWx0KSwgb3IgQzxhbGw+LgorTW9kZSBjb250cm9scyAzIGZlYXR1cmVzOgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZmVhdHVyZS9tb2RlICAgICAgICAgICAgICAgICAgIGRlYnVnICBkaWFnICByZWxlYXNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVidWcgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgbyAgICAgIG8KKyAgICBkaWFnbm9zdGljcyAoYXNzZXJ0cywgdHJhY2VzKSAgICBvICAgICAgbworICAgIGNvZGUgb3B0aW1pemF0aW9uICAgICAgICAgICAgICAgICAgICAgICBvICAgICAgbworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBCPC0tdGFyZ2V0LWNvbXBpbGVyPT5JPHZlcnNpb24+CisKK0J1aWxkIGZpbGVzIGZvciBzcGVjaWZpZWQgdGFyZ2V0IGNvbXBpbGVyLCBDPDExPiBvciBDPDEyPi4KKworPWJhY2sKKworPWl0ZW0gU2hvcnRjdXRzCisKK0lmIG9wdGlvbiB3aXRoIEM8bm8+IHByZWZpeCBpcyB1c2VkLCBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gd2lsbCBCPG5vdD4gYmUgYnVpbHQuCitVc2VmdWwgZm9yIGV4Y2x1ZGluZyBzb21lIGNvbmZpZ3VyYXRpb25zIGlmIG9uZSBvciBtb3JlIG90aGVyIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggQzxhbGw+Cit2YWx1ZSAoc2VlIEV4YW1wbGVzKS4KKworPW92ZXIKKworPWl0ZW0gQjwtLT5bQjxubz5dQjwxMT4KKworQnVpbGQgZmlsZXMgZm9yIGNvbXBpbGVyIEM8MTE+LgorCis9aXRlbSBCPC0tPltCPG5vPl1CPDEyPgorCitCdWlsZCBmaWxlcyBmb3IgY29tcGlsZXIgQzwxMj4uCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGVidWc+CisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGViZz4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkYmc+CisKK0J1aWxkIGRlYnVnZ2FibGUgbGlicmFyeS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkaWFnPgorCitCdWlsZCBsaWJyYXJ5IHdpdGggZGlhZ25vc3RpY3MgZW5hYmxlZC4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkeW5hbWljPgorCitCdWlsZCBkeW5hbWljIGxpYnJhcnkgKGRlZmF1bHQpLgorCis9aXRlbSBCPC0tPltCPG5vPl1CPG5vcm1hbD4KKworQnVpbGQgbm9ybWFsIGxpYnJhcnkgKGRlZmF1bHQpLgorCis9aXRlbSBCPC0tPltCPG5vPl1CPHJlbGVhc2U+CisKK0J1aWxkIHJlbGVhc2UgbGlicmFyeSAoZGVmYXVsdCkuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8cnRsPgorCitCdWlsZCBPTVAgUlRMIChkZWZhdWx0KS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxzdHVicz4KKworQnVpbGQgc3R1YnMgbGlicmFyeS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjx0aW1lbGltaXQ+CisKK0J1aWxkIHRpbWVsaW1pdCB1dGlsaXR5IHByb2dyYW0uCisKKz1iYWNrCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPG1ha2Utb3B0aW9uPgorCitBbnkgb3B0aW9uIGZvciBtYWtlZmlsZSwgZm9yIGV4YW1wbGUgQzwtaz4gb3IgQzwtbj4uIElmIHlvdSBwYXNzIHNvbWUgb3B0aW9ucyB0byBtYWtlZmlsZSwgQzwtLT4KK2RlbGltaXRlciBpcyBtYW5kYXRvcnksIG90aGVyd2lzZSBDPGJ1aWxkLnBsPiBwcm9jZXNzZXMgYWxsIHRoZSBvcHRpb25zIGludGVybmFsbHkuCisKKz1pdGVtIEk8dmFyaWFibGU+CisKK0RlZmluZSBtYWtlZmlsZSB2YXJpYWJsZSBpbiBmb3JtIEk8bmFtZT5CPD0+STx2YWx1ZT4uIE1vc3QgbWFrZWZpbGUgY2FwYWJpbGl0aWVzIGFyZQorYWNjZXNzaWJsZSB0aHJvdWdoIEM8YnVpbGQucGw+IG9wdGlvbnMsIHNvIHRoZXJlIGlzIG5vIG5lZWQgaW4gZGVmaW5pbmcgbWFrZSB2YXJpYWJsZXMgaW4gY29tbWFuZAorbGluZS4KKworPWl0ZW0gSTxnb2FsPgorCitNYWtlZmlsZSBnb2FsIHRvIGJ1aWxkIChvciBjbGVhbikuCisKKz1vdmVyCisKKz1pdGVtIEI8YWxsPgorCitCdWlsZCBDPGxpYj4sIEM8dGVzdHM+LCBDPGluYz4uCisKKz1pdGVtIEI8Y29tbW9uPgorCitCdWlsZCBjb21tb24gKGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCkgZmlsZXMuIENvbW1vbiBmaWxlcyBhcmUgbm90IGNvbmZpZ3VyYXRpb24tZGVwZW5kZW50LCBzbwordGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVpbGRpbmcgaXQgZm9yIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiAodGhvdWdodCBpdCBpcyBoYXJtbGVzcykuCitIb3dldmVyLCBkbyBub3QgYnVpbGQgY29tbW9uIGZpbGVzIG9uIG1hbnkgbWFjaGluZXMgc2ltdWx0YW5lb3VzbHkuCisKKz1pdGVtIEI8Y2xlYW4+CisKK0RlbGV0ZSB0aGUgZXhwb3J0IGZpbGVzIGFuZCBjbGVhbiBidWlsZCBkaXJlY3Rvcnkgb2YgY29uZmlndXJhdGlvbihzKSBzcGVjaWZpZWQgYnkgb3B0aW9ucy4gTm90ZQordGhhdCBDPGNsZWFuPiBnb2FsIGNhbm5vdCBiZSBtaXhlZCB3aXRoIG90aGVyIGdvYWxzIChleGNlcHQgZm9yIEM8Y2xlYW4tY29tbW9uPikuCisKKz1pdGVtIEI8Y2xlYW4tY29tbW9uPgorCitEZWxldGUgdGhlIGNvbW1vbiBmaWxlcyBpbiBGPGV4cG9ydHMvPiBkaXJlY3RvcnkuCisKKz1pdGVtIEI8Y2xvYmJlcj4KKworQ2xlYW4gRjxleHBvcnQvPiBhbmQgRjx0bXAvPiBkaXJlY3Rvcmllcy4gSWYgQzxjbG9iYmVyPiBpcyBzcGVjaWZpZWQsIG90aGVyIGdvYWxzIGFuZC9vciBvcHRpb25zCitkbyBub3QgbWF0dGVyLgorCitOb3RlOiBDbG9iYmVyaW5nIGlzIHBvdGVudGlhbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbiwgYmVjYXVzZSBpdCBkZWxldGVzIGNvbnRlbnQgb2YgZGlyZWN0b3J5Citwb2ludGVkIGJ5IElmIEM8TElCT01QX1RNUD4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIEM8YnVpbGQucGw+IGFza3MgYSBjb25maXJtYXRpb24gYmVmb3JlCitjbG9iYmVyaW5nLiBUbyBzdXBwcmVzcyB0aGUgcXVlc3Rpb24sIHVzZSBvcHRpb24gQzwtLWFuc3dlcj15ZXM+LgorCis9aXRlbSBCPGZhdD4KKworQzxtYWNfMzJlPiBvbmx5OiBCdWlsZCBmYXQgbGlicmFyaWVzIGZvciBib3RoIG1hY18zMiBhbmQgbWFjXzMyZS4gU2hvdWxkIGJlIHJ1biB3aGVuIEM8bGliPgorZ29hbCBpcyBidWlsdCBvbiBib3RoIEM8bWFjXzMyPiBhbmQgQzxtYWNfMzJlPi4KKworPWl0ZW0gSTxmaWxlLm8+CisKKyhXaW5kb3dzKiBPUzogSTxmaWxlLm9iaj4pIEJ1aWxkIHNwZWNpZmllZCBvYmplY3QgZmlsZSBvbmx5LgorCis9aXRlbSBJPGZpbGUuaT4KKworQ3JlYXRlIHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZS4KKworPWl0ZW0gQjxmb3JjZS10ZXN0cz4KKworRm9yY2UgcGVyZm9ybWluZyB0ZXN0cy4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LWRlcHM+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1kZXBzLgorCis9aXRlbSBCPGZvcmNlLXRlc3QtaW5zdHI+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1pbnN0ci4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LXJlbG8+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1yZWxvLgorCis9aXRlbSBCPGZvcmNlLXRlc3QtdG91Y2g+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC10b3VjaC4KKworPWl0ZW0gQjxpbmM+CisKK0J1aWxkIEZvcnRyYW4gaW5jbHVkZSBmaWxlcywgb21wX2xpYi5oLCBvbXBfbGliLm1vZCBhbmQgb21wX2xpYl9raW5kcy5tb2QuCisKKz1pdGVtIEI8bGliPgorCitCdWlsZCBsaWJyYXJ5IChvbiBXaW5kb3dzKiBPUyBpbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZywgaXQgYWxzbyBidWlsZHMgaW1wb3J0IGxpYnJhcnkpLgorCis9aXRlbSBCPHRlc3RzPgorCitQZXJmb3JtIHRlc3RzOiBDPHRlc3QtZGVwcz4sIEM8dGVzdC1pbnN0cj4sIEM8dGVzdC1yZWxvPiwgYW5kIEM8dGVzdC10b3VjaD4uCisKKz1pdGVtIEI8dGVzdC1kZXBzPgorCitDaGVjayB0aGUgbGlicmFyeSBkZXBlbmRlbmNpZXMuIAorCis9aXRlbSBCPHRlc3QtaW5zdHI+CisKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBvbmx5OiBjaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHVuZGVzaXJlZCBpbnN0cnVjdGlvbnMuCisKKz1pdGVtIEI8dGVzdC1yZWxvPgorCitMaW51eCogT1Mgd2l0aCBkeW5hbWljIGxpbmtpbmcgb25seTogY2hlY2sgdGhlIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBwb3NpdGlvbi1kZXBlbmRlbnQKK2NvZGUuCisKKz1pdGVtIEI8dGVzdC10b3VjaD4KKworQnVpbGQgYSB2ZXJ5IHNpbXBsZSBhcHBsaWNhdGlvbiB3aXRoIG5hdGl2ZSBjb21waWxlciAoR05VIG9uIExpbnV4KiBPUyBhbmQgT1MgWCosIE1TCitvbiBXaW5kb3dzKiBPUyksIGNoZWNrIGl0IGRvZXMgbm90IGRlcGVuZCBvbiBDPGxpYmlyYz4gbGlicmFyeSwgYW5kIHJ1biBpdC4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0M8YnVpbGQucGw+IGNvbnN0cnVjdHMgdGhlIG5hbWUgb2YgYSBidWlsZCBkaXJlY3RvcnksIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSBpZiBpdAorZG9lcyBub3QgZXhpc3QsIGNoYW5nZXMgdG8gaXQsIGFuZCBydW5zIG1ha2UgdG8gYnVpbGQgdGhlIGdvYWxzIGluIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorSWYgbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGFyZSBzcGVjaWZpZWQgaW4gY29tbWFuZCBsaW5lIEM8YnVpbGQucGw+IGJ1aWxkcyB0aGVtIGFsbC4KKworQmVpbmcgcnVuIHdpdGggQzxjbGVhbj4gZ29hbCwgQzxidWlsZC5wbD4gZG9lcyBub3QgYnVpbGQgYnV0IGRlbGV0ZXMgZXhwb3J0IGZpbGVzIGFuZAorY2xlYW5zIGJ1aWxkIGRpcmVjdG9yaWVzIG9mIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IG90aGVyIG9wdGlvbnMuIEZvciBleGFtcGxlLAorQzxidWlsZC5wbCAtLWFsbCBjbGVhbj4gbWVhbnMgImNsZWFuIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciBhbGwgY29uZmlndXJhdGlvbnMiLAoraXQgZG9lcyBCPG5vdD4gbWVhbiAiY2xlYW4gdGhlbiBidWlsZCBhbGwiLgorCitDPGNsZWFyLWNvbW1vbj4gZ29hbCBkZWxldGVzIGNvbW1vbiBmaWxlcyBpbiBGPGV4cG9ydHMvPiBkaXJlY3RvcnkuCitTaW5jZSBjb21tb24gZmlsZXMgYXJlIHJlYWxseSBjb21tb24gYW5kIG5vdCBhcmNoaXRlY3R1cmUgYW5kL29yIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW50LAordGhlcmUgYXJlIG5vIG11Y2ggbWVhbmluZyBpbiBjb21iaW5pbmcgQzxjbGVhci1jb21tb24+IHdpdGggY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gb3B0aW9ucy4KK0ZvciBleGFtcGxlLCBDPGJ1aWxkLnBsIC0tYWxsIGNsZWFuLWNvbW1vbj4gZGVsZXRlcyB0aGUgc2FtZSBmaWxlcyAxMyB0aW1lcy4KK0hvd2V2ZXIsIGl0IGRvZXMgbm90IGh1cnQgYW5kIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggQzxjbGVhcj4gZ29hbC4KKworQzxjbG9iYmVyPiBnb2FsIGluc3RydWN0cyBDPGJ1aWxkLnBsPiB0byBjbGVhbiBleHBvcnRzIGFuZCBhbGwgYnVpbGQKK2RpcmVjdG9yaWVzLCBlLiBnLiBjbGVhbiBldmVyeXRoaW5nIHVuZGVyIEY8ZXhwb3J0cy8+IGFuZCBGPHRtcC8+IGRpcmVjdG9yaWVzLgorCitMb2dzIGFyZSBzYXZlZCBhdXRvbWF0aWNhbGx5LCB0aGVyZSBpcyBubyBuZWVkIGluIGV4cGxpY2l0IG91dHB1dCByZWRpcmVjdGlvbi4KK0xvZyBmaWxlIGZvciBlYWNoIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBpcyBuYW1lZCBGPGJ1aWxkLmxvZz4gYW5kIGxvY2F0ZWQgaW4gYnVpbGQgZGlyZWN0b3J5LgorU3VtbWFyeSBsb2cgZmlsZSAoanVzdCByZXN1bHQgb2YgZWFjaCBjb25maWd1cmF0aW9uKSBpcyBzYXZlZCBpbiBGPHRtcC8+IGRpcmVjdG9yeS4KKworTG9nIGZpbGVzIGFyZSBuZXZlciBvdmVyd3JpdHRlbi4gQzxidWlsZC5wbD4gYWx3YXlzIGFwcGVuZHMgb3V0cHV0IHRvIGxvZyBmaWxlcy4KK0hvd2V2ZXIgKG9idmlvdXNseSksIEM8Y2xlYXI+IGRlbGV0ZXMgbG9nIGZpbGUgZm9yIGNsZWFyZWQgY29uZmlndXJhdGlvbnMsCithbmQgQzxjbG9iYmVyPiBkZWxldGVzIGFsbCBzdW1tYXJ5IGxvZyBmaWxlcy4KKworPWhlYWQyIEVudmlyb25tZW50IFZhcmlhYmxlcworCis9b3ZlcgorCis9aXRlbSBCPExJQk9NUF9BUkNIPgorCitTcGVjaWZpZXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gSWYgbm90IHByZXNlbnQsIGhvc3QgYXJjaGl0ZWN0dXJlIGlzIHVzZWQuIEVudmlyb25tZW50IHZhcmlhYmxlIG1heQorYmUgb3ZlcnJpZGVuIGJ5IEM8LS1hcmNoaXRlY3R1cmU+IGNvbW1hbmQgbGluZSBvcHRpb24uCisKKz1pdGVtIEI8TElCT01QX0VYUE9SVFM+CisKK1NwZWNpZmllcyBkaXJlY3RvcnkgZm9yIG91dHB1dCBmaWxlcy4gSWYgbm90IHNldCwgQzwkTElCT01QX1dPUksvZXhwb3J0cy8+IHVzZWQgYnkgZGVmYXVsdC4KKworPWl0ZW0gQjxMSUJPTVBfT1M+CisKK1NwZWNpZmllcyB0YXJnZXQgT1MuIElmIG5vdCBwcmVzZW50LCBob3N0IE9TIGlzIHVzZWQuIEVudmlyb25tZW50IHZhcmlhYmxlIG1heQorYmUgb3ZlcnJpZGVuIGJ5IEM8LS1vcz4gY29tbWFuZCBsaW5lIG9wdGlvbi4KKworPWl0ZW0gQjxMSUJPTVBfVE1QPgorCitEaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcy4gQzxidWlsZC5wbD4gY3JlYXRlcyBidWlsZCBkaXJlY3RvcmllcyB0aGVyZS4gSWYgbm90IHNldCwKK0M8JExJQk9NUF9XT1JLL3RtcC8+IHVzZWQgYnkgZGVmYXVsdC4KKworT24gV2luZG93cyogT1MgRjx0bXAvPiBkaXJlY3Rvcnkgb24gbG9jYWwgZHJpdmUgc3BlZWRzIHVwIHRoZSBidWlsZCBwcm9jZXNzLgorCis9aXRlbSBCPExJQk9NUF9XT1JLPgorCitSb290IG9mIGxpYm9tcCBkaXJlY3RvcnkgdHJlZSwgY29udGFpbnMgRjxzcmMvPiwgRjx0b29scy8+LCBhbmQgRjxleHBvcnRzLz4gc3ViZGlycy4KK0lmIG5vdCBzZXQsIEM8YnVpbGQucGw+IGd1ZXNzZXMgdGhlIHJvb3QgZGlyIChpdCBpcyBhIHBhcmVudCBvZiBkaXIgY29udGFpbmluZyBDPGJ1aWxkLnBsPikuCisKK05vdGU6IEd1ZXNzaW5nIGl0IG5vdCByZWxpYWJsZS4gUGxlYXNlIHNldCBDPExJQk9NUF9XT1JLPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcHByb3ByaWF0ZWx5LgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworPWhlYWQyIERldmVsb3BtZW50CisKK0J1aWxkIG5vcm1hbCAocGVyZm9ybWFuY2UpIGR5bmFtaWMgbGlicmFyeSBmb3IgZGVidWdnaW5nOgorCisgICAgJCBidWlsZC5wbCAtLWRlYnVnCisKK0J1aWxkIGFsbCBsaWJyYXJpZXMgKG5vcm1hbCwgc3R1YjsgZHluYW1pYyBSVEwpIGZvciBkZWJ1Z2dpbmc6CisKKyAgICAkIGJ1aWxkLnBsIC0tYWxsIC0tZGVidWcKKworRG8gYSBjbGVhbiBidWlsZCBmb3IgYWxsOgorCisgICAgJCBidWlsZC5wbCAtLWFsbCAtLWRlYnVnIGNsZWFuICYmIGJ1aWxkLnBsIC0tYWxsIC0tZGVidWcKKworRGVidWdnaW5nIGxpYnJhcmllcyBhcmUgc2F2ZWQgaW4gRjxleHBvcnRzL0k8cGxhdGZvcm0+LmRlYi8+LgorCis9aGVhZDIgUHJvbW90aW9uCisKKz1vdmVyCisKKz1pdGVtIDEKKworQ2xvYmJlciBldmVyeXRoaW5nOyBvbiBvbmUgbWFjaGluZToKKworICAgICQgYnVpbGQucGwgY2xvYmJlcgorCis9aXRlbSAyCisKK0J1aWxkIGNvbW1vbiBoZWFkZXJzLCBvbiBvbmUgbWFjaGluZToKKworICAgICQgYnVpbGQucGwgY29tbW9uCisKKz1pdGVtIDMKKworQnVpbGQgYWxsIHBsYXRmb3JtLWRlcGVuZGVudCBmaWxlcywgb24gYWxsIG1hY2hpbmVzOgorCisgICAgJCBidWlsZC5wbCAtLWFsbAorCis9aXRlbSA0CisKK0J1aWxkIE9TIFgqIHVuaXZlcnNhbCAoZmF0KSBsaWJyYXJpZXMsIG9uIEM8bWFjXzMyZT46CisKKyAgICAkIGJ1aWxkLnBsIGZhdAorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NlMTExZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKQEAgLTAsMCArMSw0ODkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3VwdXQgcGFyc2UgZXJyb3IuCisjICAgICAkdG9vbCAtLSBOYW1lIG9mIHRvb2wuCisjICAgICBAYnVsayAtLSBPdXRwdXQgb2YgdGhlIHRvb2wuCisjICAgICAkbiAgICAtLSBOdW1iZXIgb2YgbGluZSBjYXVzZWQgcGFyc2UgZXJyb3IuCitzdWIgcGFyc2VfZXJyb3IoJFxAJCkgeworICAgIG15ICggJHRvb2wsICRidWxrLCAkbiApID0gQF87CisgICAgbXkgQGJ1bGs7CisgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IEAkYnVsazsgKysgJGkgKSB7CisgICAgICAgIHB1c2goIEBidWxrLCAoICRpID09ICRuID8gIj4+PiAiIDogIiAgICAiICkgLiAkYnVsay0+WyAkaSBdICk7CisgICAgfTsgIyBmb3IgJGkKKyAgICBydW50aW1lX2Vycm9yKCAiRmFpbCB0byBwYXJzZSAkdG9vbCBvdXRwdXQ6IiwgQGJ1bGssICIoZW9mKSIgKTsKK307ICMgc3ViIHBhcnNlX2Vycm9yCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW51eCogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGRkOgorIworIyAkIGxkZCBsaWJuYW1lLnNvCisjICAgbGliYy5zby42ID0+IC9saWI2NC9saWJjLnNvLjYgKDB4MDAwMDJiNjBmZWRkODAwMCkKKyMgICBsaWJkbC5zby4yID0+IC9saWI2NC9saWJkbC5zby4yICgweDAwMDAyYjYwZmYxMmIwMDApCisjICAgbGlicHRocmVhZC5zby4wID0+IC9saWI2NC9saWJwdGhyZWFkLnNvLjAgKDB4MDAwMDJiNjBmZjMyZjAwMCkKKyMgICAvbGliNjQvbGQtbGludXgteDg2LTY0LnNvLjIgKDB4MDAwMDAwMzg3OTQwMDAwMCkKKyMKKyMgTm90ZTogbGRkIHByaW50ZCBhbGwgdGhlIGRlcGVuZGVuY2llcywgZGlyZWN0IGFuZCBpbmRpcmVjdC4gKEZvciBleGFtcGxlLCBpZiBzcGVjaWZpZWQgbGlicmFyeQorIyByZXF1aXJlcyBsaWJkbC5zbywgYW5kIGxpYmRsLnNvIHJlcXVpcmVzIC9saWIvbGQtbGludXguc28sIGxkZCBwcmludHMgYm90aCBsaWJkbC5zbyBhbmQKKyMgL2xpYi9sZC1saW51eC5zbykuIElmIHlvdSBkbyBub3Qgd2FudCBpbmRpcmVjdCBkZXBlbmRlbmNpZXMsIGxvb2sgYXQgcmVhZGVsZiB0b29sLgorIworc3ViIGdldF9kZXBzX2xkZCgkKSB7CisKKyAgICBteSAkbGliID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sID0gImxkZCI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBleGVjdXRlKCBbICR0b29sLCAkbGliIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBmb3JlYWNoIG15ICRpICggMCAuLiBAYnVsayAtIDEgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqKD86KFtfYS16MC05ListL10qKVxzKz0+XHMrKT8oW19hLXowLTkuKy0vXSopXHMrXCgweFswLTlhLXpdKlwpJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAkZGVwID0gKCBkZWZpbmVkKCAkMSApID8gJDEgOiAkMiApOworICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19sZGQKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFub3RoZXIgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIHJlYWRlbGY6CisjCisjICQgcmVhZGVsZiAtZCBleHBvcnRzL2xpbl8zMmUvbGliL2xpYmlvbXA1LnNvCisjCisjIER5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHg4NzAwOCBjb250YWlucyAyNCBlbnRyaWVzOgorIyAgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJjLnNvLjZdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJkbC5zby4yXQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGlicHRocmVhZC5zby4wXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBlIChTT05BTUUpICAgICAgICAgICAgIExpYnJhcnkgc29uYW1lOiBbbGliaW9tcDUuc29dCisjICAweDAwMDAwMDAwMDAwMDAwMGQgKEZJTkkpICAgICAgICAgICAgICAgMHg1MWNhYQorIyAgMHgwMDAwMDAwMDAwMDAwMDA0IChIQVNIKSAgICAgICAgICAgICAgIDB4MTU4CisjICAweDAwMDAwMDAwMDAwMDAwMDUgKFNUUlRBQikgICAgICAgICAgICAgMHg5MzUwCisjICAuLi4KKyMKKyMgTm90ZTogSW4gY29udHJhc3QgdG8gbGRkLCByZWFkbGVmIHNob3dzIG9ubHkgZGlyZWN0IGRlcGVuZGVuY2llcy4KKyMKK3N1YiBnZXRfZGVwc19yZWFkZWxmKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sID0gInJlYWRlbGYiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIGhlYWRlci4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRpID09IEBidWxrIC0gMSBhbmQgJGJ1bGtbICRpIF0gPX4gbXteVGhlcmUgaXMgbm8gZHluYW1pYyBzZWN0aW9uIGluIHRoaXMgZmlsZVwuXHMqJH0gKSB7CisgICAgICAgICMgVGhpcyBpcyBub3QgZHluYW1pYyBleGVjdXRhYmxlID0+IG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgcmV0dXJuIEBkZXBzOworICAgIH07ICMgaWYKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR5bmFtaWMgKD86c2VnbWVudHxzZWN0aW9uKSBhdCBvZmZzZXQgMHhbMC05YS1mXSsgY29udGFpbnMgXGQrIGVudHJpZXM6XHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqVGFnXHMrVHlwZVxzK05hbWUvVmFsdWVccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgIyBQYXJzZSBib2R5LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyoweFswLTlhLWZdK1xzK1woKFtfQS1aMC05XSspXClccysoLiopXHMqJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICR0eXBlLCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgIGlmICggJHR5cGUgZXEgIk5FRURFRCIgKSB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSAhfiBte1xBU2hhcmVkIGxpYnJhcnk6IFxbKC4qKVxdXHp9ICkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICsrICRpOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19yZWFkZWxmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUyBYKiB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBvdG9vbDoKKyMKKyMgJCBvdG9vbCAtTCBsaWJuYW1lLmR5bGliCisjIGV4cG9ydHMvbWFjXzMyL2xpYi50aGluL2xpYmlvbXA1LmR5bGliOgorIyAgICAgICAgbGliaW9tcDUuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiA1LjAuMCwgY3VycmVudCB2ZXJzaW9uIDUuMC4wKQorIyAgICAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAxLjAuMCwgY3VycmVudCB2ZXJzaW9uIDg4LjEuMykKKyMKK3N1YiBnZXRfZGVwc19vdG9vbCgkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkbmFtZSA9IGdldF9maWxlKCAkZmlsZSApOworICAgIG15ICR0b29sID0gIm90b29sIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmICggJHRhcmdldF9hcmNoIGVxICIzMmUiICkgeworICAgICAgICAjIE9uIG9sZGVyIChUaWdlcikgc3lzdGVtcyBvdG9vbCBkb2VzIG5vdCByZWNvZ25pemUgNjQtYml0IGJpbmFyaWVzLCBzbyB0cnkgdG8gbG9jYXRlCisgICAgICAgICMgb3Rvb2w2NC4KKyAgICAgICAgbXkgJHBhdGggPSB3aGljaCggIm90b29sNjQiICk7CisgICAgICAgIGlmICggZGVmaW5lZCAoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkdG9vbCA9ICJvdG9vbDY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItTCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsaW5lcyBzZXBhcmF0ZWx5LgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXFEkZmlsZVxFOiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRuYW1lID1+IG17XC5keWxpYlx6fSApIHsKKyAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSBvdG9vbCBwcmludCB0aGUgbGlicmFyeSBpdHNlbGYgYXMgYSBkZXBlbmRlbnQgbGlicmFyeS4KKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccytcUSRuYW1lXEVccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvbi4qXCkkfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFRoZW4gcGFyc2UgdGhlIHJlc3QuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG0vXlxzKiguKilccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvblxzLipcKSQvICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRkZXAgKSA9ICggJDEgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19vdG9vbAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2luZG93cyogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGluazoKKyMKKyMgPiBsaW5rIC1kdW1wIC1kZXBlbmRlbnRzIGxpYm5hbWUuZGxsCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzY0XGxpYlxsaWJpb21wNW1kLmRsbAorIyBGaWxlIFR5cGU6IERMTAorIyAgIEltYWdlIGhhcyB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY2llczoKKyMgICAgIEtFUk5FTDMyLmRsbAorIyAgIFN1bW1hcnkKKyMgICAgICAgICBDMDAwIC5kYXRhCisjICAgICAgICAgNjAwMCAucGRhdGEKKyMgICAgICAgIDE4MDAwIC5yZGF0YQorIyAgICAgICAgLi4uCisjCisjID4gbGluayAtZHVtcCAtZGlyZWN0aXZlcyBsaWJuYW1lLmxpYgorIyBNaWNyb3NvZnQgKFIpIENPRkYvUEUgRHVtcGVyIFZlcnNpb24gOC4wMC40MDMxMC4zOQorIyBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIER1bXAgb2YgZmlsZSBTOlxQcm9qZWN0cy5PTVBcdXNlcnNcb21hbHlzaGVcb21wXGxpYm9tcFxleHBvcnRzXHdpbl8zMmVcbGliXGxpYmltcDVtdC5saWIKKyMgRmlsZSBUeXBlOiBMSUJSQVJZCisjICAgTGlua2VyIERpcmVjdGl2ZXMKKyMgICAtLS0tLS0tLS0tLS0tLS0tLQorIyAgIC1kZWZhdWx0bGliOiJ1dWlkLmxpYiIKKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLi4uLi4KKyMgICBTdW1tYXJ5CisjICAgICAgIDMyNTAgLmJzcworIyAgICAgICAzRkJDIC5kYXRhCisjICAgICAgICAgMzQgLmRhdGExCisjICAgICAgIC4uLi4KK3N1YiBnZXRfZGVwc19saW5rKCQpIHsKKworICAgIG15ICggJGxpYiApID0gQF87CisgICAgbXkgJHRvb2wgPSAibGluayI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBteSAkZXh0ID0gbGMoIGdldF9leHQoICRsaWIgKSApOworICAgIGlmICggJGV4dCAhfiBte1xBXC4oPzpsaWJ8ZGxsfGV4ZSlcen1pICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiSW5jb3JyZWN0IGZpbGUgaXMgc3BlY2lmaWVkOiBgJGxpYic7IG9ubHkgYGxpYicsIGBkbGwnIG9yIGBleGUnIGZpbGUgZXhwZWN0ZWQiICk7CisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSgKKyAgICAgICAgWyAkdG9vbCwgIi9kdW1wIiwgKCAkZXh0IGVxICIubGliIiA/ICIvZGlyZWN0aXZlcyIgOiAiL2RlcGVuZGVudHMiICksICRsaWIgXSwKKyAgICAgICAgLXN0ZG91dCA9PiBcQGJ1bGsKKyAgICApOworCisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15NaWNyb3NvZnQgXChSXCkgQ09GRlwvUEUgRHVtcGVyIFZlcnNpb24uKiR9ICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15Db3B5cmlnaHQgXChDXCkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXC4uKiR9ICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15EdW1wIG9mIGZpbGVcc1xRJGxpYlxFJH0gICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15GaWxlIFR5cGU6XHMoLiopJH0gICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisKKyAgICBpZiAoICRleHQgZXEgIi5saWIiICkgeworCisgICAgICAgIG15ICVkZXBzOworICAgICAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlstL11kZWZhdWx0bGliXDooLiopXHMqJH1pICkgeworICAgICAgICAgICAgICAgIG15ICRkZXAgPSAkMTsKKyAgICAgICAgICAgICAgICAjIE5vcm1hbGl6ZSBsaWJyYXJ5IG5hbWU6CisgICAgICAgICAgICAgICAgJGRlcCA9IGxjKCAkMSApOyAgICAgICAgICAgICAgIyBDb252ZXJ0IHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1xBIiguKikiXHp9eyQxfTsgICAgIyBEcm9wIHN1cnJvdW5kaW5nIHF1b3RlcyAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICAkZGVwID1+IHN7XC5saWJcen17fTsgICAgICAgICAjIERyb3AgLmxpYiBzdWZmaXggKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcHN7ICRkZXAgfSA9IDE7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqTGlua2VyIERpcmVjdGl2ZXNccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyotK1xzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKi9hbHRlcm5hdGVuYW1lXDouKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlN1bW1hcnlccyokfSApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKysgJGk7CisgICAgICAgIH0gIyB3aGlsZQorICAgICAgICBAZGVwcyA9IGtleXMoICVkZXBzICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXtccypJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXNcOiR9ICkKKyAgICAgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICsrICRpOworICAgICAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgICAgICMgSWdub3JlIGVtcHR5IGxpbmVzLgorICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiguKlwuZGxsKSR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gbGMoICQxICk7CisgICAgICAgICAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5JH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9OyAjIHdoaWxlCisKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gQGRlcHM7CisKK307ICMgc3ViIGdldF9kZXBzX2xpbmsKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1haW4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorbXkgJGV4cGVjdGVkOworbXkgJGJhcmU7CitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggInBlcm11dGUiICk7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYmFyZSIgICAgICAgPT4gXCRiYXJlLAorICAgICJleHBlY3RlZD1zIiA9PiBcJGV4cGVjdGVkLAorKTsKK215IEBleHBlY3RlZDsKK2lmICggZGVmaW5lZCggJGV4cGVjdGVkICkgKSB7CisgICAgaWYgKCAkZXhwZWN0ZWQgbmUgIm5vbmUiICkgeworICAgICAgICBAZXhwZWN0ZWQgPSBzb3J0KCBzcGxpdCggIiwiLCAkZXhwZWN0ZWQgKSApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICAgICBAZXhwZWN0ZWQgPSBtYXAoIGxjKCAkXyApLCBAZXhwZWN0ZWQgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKK2lmICggQEFSR1YgPCAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJTcGVjaWZ5IGEgbGlicmFyeSBuYW1lIHRvIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMiICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgYXJndW1lbnRzIiApOworfTsgIyBpZgorbXkgJGxpYiA9IHNoaWZ0KCBAQVJHViApOworaWYgKCBub3QgLWUgJGxpYiApeworICAgIHJ1bnRpbWVfZXJyb3IoICJTcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdDogXCIkbGliXCIiICk7Cit9OyAjIGlmCisKKyMgU2VsZWN0IGFwcHJvcHJpYXRlIGdldF9kZXBzIGltcGxlbWVudGF0aW9uLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibHJiIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX3JlYWRlbGY7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX290b29sOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19saW5rOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215IEBkZXBzID0gc29ydCggZ2V0X2RlcHMoICRsaWIgKSApOworaWYgKCAkYmFyZSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIEBkZXBzICkgKTsKK30gZWxzZSB7CisgICAgaW5mbyggIkRlcGVuZGVuY2llczoiLCBAZGVwcyA/IG1hcCggIiAgICAkXyIsIEBkZXBzICkgOiAiKG5vbmUpIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBteSAlZGVwcyA9IG1hcCggKCAkXyA9PiAxICksIEBkZXBzICk7CisgICAgZm9yZWFjaCBteSAkZGVwICggQGV4cGVjdGVkICkgeworICAgICAgICBkZWxldGUoICRkZXBzeyAkZGVwIH0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBteSBAdW5leHBlY3RlZCA9IHNvcnQoIGtleXMoICVkZXBzICkgKTsKKyAgICBpZiAoIEB1bmV4cGVjdGVkICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6IiwgbWFwKCAiICAgICRfIiwgQHVuZXhwZWN0ZWQgKSApOworICAgIH07ICMgaWYKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1kZXBlbmRzLnBsPiAtLSBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWRlcGVuZHMucGw+IEk8T1BUSU9OUz4uLi4gSTxsaWJyYXJ5PgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQzxjaGVjay1kZXBlbmRzLnBsPiBmaW5kcyBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LiBMaXN0IG9mIGFjdHVhbCBkZXBlbmRlbmNpZXMKK2lzIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcHJpbnRlZC4gSWYgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0cworY2hlY2tzIHRoZSBsaWJyYXJ5IGhhcyBvbmx5IGFsbG93ZWQgZGVwZW5kZW5jaWVzLiBJbiBjYXNlIG9mIG5vdCBleHBlY3RlZCBkZXBuZGVuY2llcyB0aGUgc2NyaXB0Citpc3N1ZXMgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCBub24temVybyBjb2RlLgorCitMaW51eCogT1MgYW5kIE9TIFgqOiBUaGUgc2NyaXB0IGZpbmRzIGRlcGVuZGVuY2llcyBvbmx5IGZvciBkeW1hbWljIGxpYnJhcmllcy4gV2luZG93cyogT1M6IFRoZSBzY3JpcHQKK2ZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHN0YXRpYyBvciBkeW1hbWljIGxpYnJhcmllcy4KKworVGhlIHNjcmlwdCB1c2VzIGV4dGVybmFsIHRvb2xzLiBPbiBMaW51eCogT1MsIGl0IHJ1bnMgRjxyZWFkZWxmPiwgb24gT1MgWCogLS0gRjxvdG9vbD4gKG9yIEY8b3Rvb2w2ND4pLAorb24gV2luZG93cyogT1MgLS0gRjxsaW5rPi4KKworT24gV2luZG93cyogT1MgZGVwZW5kZW5jaWVzIGFyZSBwcmludGVkIGluIGxvd2VyIGNhc2UsIGNhc2Ugb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlnbm9yZWQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1iYXJlPgorCitEbyBub3QgdXNlIGZhbmN5IGZvcm1hdHRpbmc7IHByb2R1Y2UgcGxhaW4sIGJhcmUgb3V0cHV0OiBqdXN0IGEgbGlzdCBvZiBsaWJyYXJpZXMsCithIGxpYnJhcnkgcGVyIGxpbmUuCisKKz1pdGVtIEI8LS1leHBlY3RlZD0+STxsaXN0PgorCitJPGxpc3Q+IGlzIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyAob3IgQzxub25lPikuCitJZiBDPC0tZXhwZWN0ZWQ+IG9wdGlvbiBzcGVjaWZpZWQsIEM8Y2hlY2stZGVwZW5kcy5wbD4gY2hlY2tzIHRoZSBzcGVjaWZpZWQgbGlicmFyeQoraGFzIG9ubHkgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyAodG9vbCB0byB1c2UpIG1hbnVhbGx5LgorVXNlZnVsIGZvciBjcm9zcy1idWlsZCwgd2hlbiBob3N0IE9TIGlzIG5vdCB0aGUgc2FtZSBhcyB0YXJnZXQgT1MuCitJPHN0cj4gc2hvdWxkIGJlIGVpdGhlciBDPGxpbj4sIEM8bWFjPiwgb3IgQzx3aW4+LgorCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IG91dHB1dCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGxpYnJhcnk+CisKK0EgbmFtZSBvZiBsaWJyYXJ5IHRvIGZpbmQgb3IgY2hlY2sgZGVwZW5kZW5jaWVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworSnVzdCBwcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoV2luZG93cyogT1MpOgorCisgICAgPiBjaGVjay1kZXBlbmRzLnBsIGV4cG9ydHMvd2luXzMyL2xpYi9saWJpb21wNS5kbGwKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAga2VybmVsMzIuZGxsCisKK1ByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzLCB1c2UgYmFyZSBvdXRwdXQgKExpbnV4KiBPUyk6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1iYXJlIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wX2RiLnNvCisgICAgbGliYy5zby42CisgICAgbGliZGwuc28uMgorICAgIGxpYnB0aHJlYWQuc28uMAorCitDaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgKE9TIFgqKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWV4cGVjdGVkPW5vbmUgZXhwb3J0cy9tYWNfMzIvbGliL2xpYmlvbXA1LmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpIERlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKHgpIFVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICAkIGVjaG8gJD8KKyAgICAyCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMTQxN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCkBAIC0wLDAgKzEsMTM4IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDIiOworCitzdWIgZXhlY3N0YWNrKCQpIHsKKyAgICBteSAoICRmaWxlICkgPSBAXzsKKyAgICBteSBAb3V0cHV0OworICAgIG15IEBzdGFjazsKKyAgICBleGVjdXRlKCBbICJyZWFkZWxmIiwgIi1sIiwgIi1XIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworICAgIEBzdGFjayA9IGdyZXAoICRfID1+IG17XEFccyooPzpHTlVfKT9TVEFDS1xzK30sIEBvdXRwdXQgKTsKKyAgICBpZiAoIG5vdCBAc3RhY2sgKSB7CisgICAgICAgICMgSW50ZXJwcmV0IG1pc3NlZCAiU1RBQ0siIGxpbmUgYXMgZXJyb3IuCisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTm8gc3RhY2sgc2VnbWVudCBmb3VuZDsgbG9va3MgbGlrZSBzdGFjayB3b3VsZCBiZSBleGVjdXRhYmxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAc3RhY2sgPiAxICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE1vcmUgdGhhbiBvbmUgc3RhY2sgc2VnbWVudCBmb3VuZC4iLCAicmVhZGVsZiBvdXRwdXQ6IiwgQG91dHB1dCwgIihlb2YpIiApOworICAgIH07ICMgaWYKKyAgICAjIFR5cGljYWwgc3RhY2sgbGluZXMgYXJlOgorICAgICMgTGludXgqIE9TIElBLTMyIGFyY2hpdGVjdHVyZToKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwIDB4MDAwMDAgUldFIDB4NAorICAgICMgTGludXgqIE9TIEludGVsKFIpIDY0OgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMCAweDAwMDAwMCBSV0UgMHg4CisgICAgaWYgKCAkc3RhY2tbIDAgXSAhfiBte1xBXHMqKD86R05VXyk/U1RBQ0soPzpccysweFswLTlhLWZdKyl7NX1ccysoW1IgXVtXIF1bRSBdKVxzKzB4WzAtOWEtZl0rXHMqXHp9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IENhbm5vdCBwYXJzZSBzdGFjayBzZWdtZW50IGxpbmU6IiwgIj4+PiAkc3RhY2tbIDAgXSIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGF0dHJzID0gJDE7CisgICAgaWYgKCAkYXR0cnMgPX4gbXtFfSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBTdGFjayBpcyBleGVjdXRhYmxlIiApOworICAgIH07ICMgaWYKK307ICMgc3ViIGV4ZWNzdGFjaworCitnZXRfb3B0aW9ucygKKyk7CisKK2ZvcmVhY2ggbXkgJGZpbGUgKCBAQVJHViApIHsKKyAgICBleGVjc3RhY2soICRmaWxlICk7Cit9OyAjIGZvcmVhY2ggJGZpbGUKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1leGVjc3RhY2sucGw+IC0tIENoZWNrIHdoZXRoZXIgc3RhY2sgaXMgZXhlY3V0YWJsZSwgaXNzdWUgYW4gZXJyb3IgaWYgc28uCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWV4ZWNzdGFjay5wbD4gSTxvcHRpaW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IGNoZWNrcyB3aGV0aGVyIHN0YWNrIG9mIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUsIGFuZCBpc3N1ZXMgZXJyb3IgaWYgc3RhY2sgaXMKK2V4ZWN1dGFibGUuIElmIHN0YWNrIGlzIG5vdCBleGVjdXRhYmxlLCB0aGUgc2NyaXB0IGV4aXRzIHNpbGVudGx5IHdpdGggemVybyBleGl0IGNvZGUuCisKK1RoZSBzY3JpcHQgcnVucyBDPHJlYWRlbGY+IHV0aWxpdHkgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUuIFNvLCB0aGUKK3NjcmlwdCBmYWlscyBpZiBDPHJlYWRlbGY+IGlzIG5vdCBhdmFpbGFibGUuIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIHRoZSBzY3JpcHQgd29ya3Mgb25seSBvbiBMaW51eCogT1MKKyhhbmQsIHByb2JhYmx5LCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUpLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IHRvIGNoZWNrLiBNdWx0aXBsZSBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworQ2hlY2sgbGliaW9tcDUuc28gbGlicmFyeToKKworICAgICQgY2hlY2stZXhlY3N0YWNrLnBsIGxpYmlvbXA1LnNvCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmE3ODdlCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCkBAIC0wLDAgKzEsMzM2IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNCI7CisKK215ICRoZXggPSBxcntbMC05YS1mXX1pOyAgICAjIGhleCBkaWdpdC4KKworIyBscmJfMzJlLXNwZWNpZmljIGRldGFpbHMuCisKK215ICRtaWNfYXJjaDsgIyBlaXRoZXIga25mIG9yIGtuYworbXkgJG1pY19vczsgICAjIGVpdGhlciBic2Qgb3IgbGluCitzdWIgYmFkX2xyYl9mbXQoJCkgeworICAgICMgQmVmb3JlIHdlIGFsbG93ZWQgYm90aCBlbGY2NC14ODYtNjQtZnJlZWJzZCBhbmQgZWxmLWwxb20tZnJlZWJzZC4KKyAgICAjIE5vdyB0aGUgZmlyc3Qgb25lIGlzIG9ic29sZXRlLCBvbmx5IGVsZjY0LWwxb20tZnJlZWJzZCBpcyBhbGxvd2VkLgorICAgIG15ICggJGZtdCApID0gQF87CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAiJG1pY19vcyIgZXEgImJzZCIgKSB7CisJaWYgKCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWwxb20oPzotZnJlZWJzZCk/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAkZm10ICF+IG17XEFlbGY2NC14ODYtNjQoPzotZnJlZWJzZCk/XHp9OworCX07CisgICAgfSBlbHNpZiAoICIkbWljX29zIiBlcSAibGluIiApIHsKKwlpZiAoIDAgKSB7CisJfSBlbHNpZiAoICIkbWljX2FyY2giIGVxICJrbmYiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtbDFvbT9cen07CisJfSBlbHNpZiAoICIkbWljX2FyY2giIGVxICJrbmMiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtazFvbT9cen07CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDE7CisJfTsKKyAgICB9IGVsc2UgeworCXJldHVybiAxOworICAgIH07Cit9OyAjIHN1YiBiYWRfbHJiX2ZtdAorCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIGxyYjogYWxsIHg4NyBhbmQgc29tZSBvdGhlci4KKyMgQUM6IFNpbmNlIGNvbXBpbGVyIDIwMTAtMDYtMzAgeDg3IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCByZW1vdmVkIHRoZSBjaGVjayBvZiB4ODcuCitteSAkbHJiX2JhZF9yZTsKK3N1YiBiYWRfbHJiX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyMgICAgaWYgKCAiJG1pY19vcyIgZXEgImxpbiIgYW5kICIkbWljX2FyY2giIGVxICJrbmYiICkgeworICAgIGlmICggIiRtaWNfb3MiIGVxICJsaW4iIG9yICIkbWljX2FyY2giIGVxICJrbmMiICkgeworCSMgd29ya2Fyb3VuZCBvZiBiYWQgY29kZSBnZW5lcmF0aW9uIG9uIEtORiBMaW51eCogT1M6CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbHJiX2JhZF9yZSApOworICAgIH0gZWxzZSB7CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbHJiX2JhZF9yZSBvciBkZWZpbmVkKCAkYXJncyApIGFuZCAkYXJncyA9fiBte3htbX1pICk7CisgICAgfQorfTsgIyBzdWIgYmFkX2xyYl9pbnN0cgorCisjIGxpbl8zMi1zcGVjaWZpYyBkZXRhaWxzLgorCitzdWIgYmFkX2lhMzJfZm10KCQpIHsKKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIHJldHVybiAkZm10ICF+IG17XEFlbGYzMi1pMzg2XHp9OworfTsgIyBzdWIgYmFkX2lhMzJfZm10CisKK215IEBzc2UyID0KKyAgICBxd3sKKyAgICAgICAgbW92YXBkIG1vdnVwZCBtb3ZocGQgbW92bHBkIG1vdm1za3BkIG1vdnNkCisgICAgICAgIGFkZHBkIGFkZHNkIHN1YnBkIHN1YnNkIG11bHBkIG11bHNkIGRpdnBkIGRpdnNkIHNxcnRwZCBzcXJ0c2QgbWF4cGQgbWF4c2QgbWlucGQgbWluc2QKKyAgICAgICAgYW5kcGQgYW5kbnBkIG9ycGQgeG9ycGQKKyAgICAgICAgY21wcGQgY21wc2QgY29taXNkIHVjb21pc2QKKyAgICAgICAgc2h1ZnBkIHVucGNraHBkIHVucGNrbHBkCisgICAgICAgIGN2dHBkMnBpIGN2dHRwZDJwaSBjdnRwaTJwZCBjdnRwZDJkcSBjdnR0cGQyZHEgY3Z0ZHEycGQgY3Z0cHMycGQgY3Z0cGQycHMgY3Z0c3Myc2QgY3Z0c2Qyc3MKKyAgICAgICAgY3Z0c2Qyc2kgY3Z0dHNkMnNpIGN2dHNpMnNkIGN2dGRxMnBzIGN2dHBzMmRxIGN2dHRwczJkcSBtb3ZkcWEgbW92ZHF1IG1vdnEyZHEgbW92ZHEycQorICAgICAgICBwbXVsdWRxIHBhZGRxIHBzdWJxIHBzaHVmbHcgcHNodWZodyBwc2h1ZmQgcHNsbGRxIHBzcmxkcSBwdW5wY2tocWRxIHB1bnBja2xxZHEgY2xmbHVzaAorICAgICAgICBsZmVuY2UgbWZlbmNlIG1hc2ttb3ZkcXUgbW92bnRwZCBtb3ZudGRxIG1vdm50aQorICAgIH07CitteSBAc3NlMyA9CisgICAgcXd7CisgICAgICAgIGZpc3R0cCBsZGRxdSBhZGRzdWJwcyBhZGRzdWJwZCBoYWRkcHMgaHN1YnBzIGhhZGRwZCBoc3VicGQgbW92c2hkdXAgbW92c2xkdXAgbW92ZGR1cCBtb25pdG9yCisgICAgICAgIG13YWl0CisgICAgfTsKK215IEBzc3NlMyA9CisgICAgcXd7CisgICAgICAgIHBoYWRkdyBwaGFkZHN3IHBoYWRkZCBwaHN1YncgcGhzdWJzdyBwaHN1YmQgcGFic2IgcGFic3cgcGFic2QgcG1hZGR1YnN3IHBtdWxocnN3IHBzaHVmYgorICAgICAgICBwc2lnbmIgcHNpZ253IHBzaWduZCBwYWxpZ25yCisgICAgfTsKK215IEBzc2U0ID0KKyAgICAoCisgICAgICAgICMgU1NFNC4xCisgICAgICAgIHF3eworICAgICAgICAgICAgcG11bGxkIHBtdWxkcSBkcHBkIGRwcHMgbW92bnRkcWEgYmxlbmRwZCBibGVuZHBzIGJsZW5kdnBkIGJsZW5kdnBzIHBibGVuZHZiIHBibGVuZHcgcG1pbnV3CisgICAgICAgICAgICBwbWludWQgcG1pbnNiIHBtaW5zZCBwbWF4dXcgcG1heHVkIHBtYXhzYiBwbWF4c2Qgcm91bmRwcyByb3VuZHBkIHJvdW5kc3Mgcm91bmRzZCBleHRyYWN0cHMKKyAgICAgICAgICAgIGluc2VydHBzIHBpbnNyYiBwaW5zcmQgcGluc3JxIHBleHRyYiBwZXh0cncgcGV4dHJkIHBleHRycSBwbW92c3hidyBwbW92enhidyBwbW92c3hiZAorICAgICAgICAgICAgcG1vdnp4YmQgcG1vdnN4d2QgcG1vdnp4d2QgcG1vdnN4YnEgcG1vdnp4YnEgcG1vdnN4d3EgcG1vdnp4d3EgcG1vdnN4ZHEgcG1vdnp4ZHEgbXBzYWRidworICAgICAgICAgICAgcGhtaW5wb3N1dyBwdGVzdCBwY21wZXFxIHBhY2t1c2R3CisgICAgICAgIH0sCisgICAgICAgICMgU1NFNC4yCisgICAgICAgIHF3eworICAgICAgICAgICAgcGNtcGVzdHJpIHBjbXBlc3RybSBwY21waXN0cmkgcGNtcGlzdHJtIHBjbXBndHEgY3JjMzIgcG9wY250CisgICAgICAgIH0KKyAgICApOworCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZTogUGVudGl1bSA0IChTU0UyKSBhbmQgbmV3ZXIuCisjIFRPRE86IEl0IHdvdWxkIGJlIG11Y2ggbW9yZSByZWxpYWJsZSB0byBsaXN0ICphbGxvd2VkKiBpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gbGlzdCB1bmRlc2lyZWQKKyMgaW5zdHJ1Y3Rpb25zLiBJbiBzdWNoIGEgY2FzZSB0aGUgbGlzdCB3aWxsIGJlIHN0YWJsZSBhbmQgbm90IHJlcXVpcmUgdXBkYXRlIHdoZW4gU1NFNSBpcyByZWxlYXNlZC4KK215IEBpYTMyX2JhZF9saXN0ID0gKCBAc3NlMiwgQHNzZTMsIEBzc3NlMywgQHNzZTQgKTsKKworbXkgJGlhMzJfYmFkX3JlID0gcXJ7QHtbICJeKD86IiAuIGpvaW4oICJ8IiwgQGlhMzJfYmFkX2xpc3QgKSAuICIpIiBdfX1pOworCitzdWIgYmFkX2lhMzJfaW5zdHIoJCQpIHsKKyAgICBteSAoICRpbnN0ciwgJGFyZ3MgKSA9IEBfOworICAgIHJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJGlhMzJfYmFkX3JlICk7Cit9OyAjIHN1YiBiYWRfaWEzMl9pbnN0cgorCitzdWIgY2hlY2tfZmlsZSgkOyQkKSB7CisKKyAgICBteSAoICRmaWxlLCAkc2hvd19pbnN0cnVjdGlvbnMsICRtYXhfaW5zdHJ1Y3Rpb25zICkgPSBAXzsKKyAgICBteSBAYnVsazsKKworICAgIGlmICggbm90IGRlZmluZWQoICRtYXhfaW5zdHJ1Y3Rpb25zICkgKSB7CisgICAgICAgICRtYXhfaW5zdHJ1Y3Rpb25zID0gMTAwOworICAgIH07ICMgaWYKKworICAgIGlmICggIiRtaWNfb3MiIGVxICJic2QiICkgeworICAgICAgICBleGVjdXRlKCBbICJ4ODZfNjQtZnJlZWJzZC1vYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBleGVjdXRlKCBbICJvYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICB9CisKKyAgICBteSAkbiA9IDA7CisgICAgbXkgJGVycm9ycyA9IDA7CisgICAgbXkgJGN1cnJlbnRfZnVuYyAgPSAiIjsgICAgIyBOYW1lIG9mIGN1cnJlbnQgZnVjdGlvbi4KKyAgICBteSAkcmVwb3J0ZWRfZnVuYyA9ICIiOyAgICAjIG5hbWUgb2YgbGFzdCByZXBvcnRlZCBmdW5jdGlvbi4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICMgRW1wdHkgbGluZS4KKyAgICAgICAgICAgICMgSWdub3JlLgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteSW4gYXJjaGl2ZSAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgSW4gYXJjaGl2ZSBsaWJpb21wNS5hOgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteKD86Lio/KTpccypmaWxlIGZvcm1hdCAoLio/KVxzKiR9ICkgeworICAgICAgICAgICAgIyBsaWJpb21wNS5zbzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NC1mcmVlYnNkCisgICAgICAgICAgICAjIGttcF9mdG5fY2RlY2wubzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NAorICAgICAgICAgICAgbXkgJGZtdCA9ICQxOworICAgICAgICAgICAgaWYgKCBiYWRfZm10KCAkZm10ICkgKSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkludmFsaWQgZmlsZSBmb3JtYXQ6ICRmbXQuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAucGx0OgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteJGhleCsgPChbXj5dKyk+OlxzKiR9ICkgeworICAgICAgICAgICAgIyAwMDAwMDAwMDAwMDE3ZTk4IDxfX2ttcF9zdHJfZm9ybWF0QHBsdC0weDEwPjoKKyAgICAgICAgICAgICRjdXJyZW50X2Z1bmMgPSAkMTsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlwuezN9XHMqJH0gKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooJGhleCspOlxzKygkaGV4JGhleCg/OiAkaGV4JGhleCkqKVxzKyg/OmxvY2tccyt8cmV4Wy5hLXpdKlxzKyk/KFteIF0rKSg/OlxzKyhbXiNdKz8pKT9ccyooPzojfCQpfSApIHsKKyAgICAgICAgICAgICMgICAxN2U5ODogICAgICAgZmYgMzUgZmEgN2QgMjYgMDAgICAgICAgcHVzaHEgIDB4MjY3ZGZhKCVyaXApICAgICAgICAjIDI3ZmM5OCA8X0dMT0JBTF9PRkZTRVRfVEFCTEU+CisgICAgICAgICAgICBteSAoICRhZGRyLCAkZHVtcCwgJGluc3RyLCAkYXJncyApID0gKCAkMSwgJDIsICQzLCAkNCApOworICAgICAgICAgICAgIyBDaGVjayB0aGlzIGlzIG5vdCBhIGJhZCBpbnN0cnVjdGlvbiBhbmQgeG1tIHJlZ2lzdGVycyBhcmUgbm90IHVzZWQuCisgICAgICAgICAgICBpZiAoIGJhZF9pbnN0ciggJGluc3RyLCAkYXJncyApICkgeworICAgICAgICAgICAgICAgIGlmICggJGVycm9ycyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiSW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gYCRmaWxlJzoiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggJGN1cnJlbnRfZnVuYyBuZSAkcmVwb3J0ZWRfZnVuYyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIiAgICAkY3VycmVudF9mdW5jIiApOworICAgICAgICAgICAgICAgICAgICAkcmVwb3J0ZWRfZnVuYyA9ICRjdXJyZW50X2Z1bmM7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICsrICRlcnJvcnM7CisgICAgICAgICAgICAgICAgaWYgKCAkc2hvd19pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgICAgICRsaW5lIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPj0gJG1heF9pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8oICIkZXJyb3JzIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kOyBzY2FubmluZyBzdG9wcGVkLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyBvYmpkdW1wIG91dHB1dCBsaW5lICRuOlxuPj4+PiAkbGluZVxuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRsaW5lCisKKyAgICByZXR1cm4gJGVycm9yczsKKworfTsgIyBzdWIgY2hlY2tfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorbXkgJG1heF9pbnN0cnVjdGlvbnM7CitteSAkc2hvd19pbnN0cnVjdGlvbnM7CitnZXRfb3B0aW9ucygKKyAgICAibWF4LWluc3RydWN0aW9ucz1pIiA9PiBcJG1heF9pbnN0cnVjdGlvbnMsCisgICAgInNob3ctaW5zdHJ1Y3Rpb25zISIgPT4gXCRzaG93X2luc3RydWN0aW9ucywKKyAgICAibWljLWFyY2g9cyIgICAgICAgICA9PiBcJG1pY19hcmNoLAorICAgICJtaWMtb3M9cyIgICAgICAgICAgID0+IFwkbWljX29zLAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorKTsKK2lmICggIiRtaWNfb3MiIGVxICJsaW4iIGFuZCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKyAgICAkbHJiX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtcHhjaGcxNmJ8Y2xldmljdFsxMl0pfWk7Cit9IGVsc2UgeworICAgICRscmJfYmFkX3JlID0gcXJ7Xig/OnBhdXNlfFtzbG1dZmVuY2V8c2NhdHRlcnxnYXRoZXJ8Y21vdnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfTsKK2lmICggMCApIHsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJscmJfMzJlIiApIHsKKyAgICAqYmFkX2luc3RyID0gXCpiYWRfbHJiX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9scmJfZm10OworfSBlbHNpZiAoICR0YXJnZXRfcGxhdGZvcm0gZXEgImxpbl8zMiIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX2lhMzJfaW5zdHI7CisgICAgKmJhZF9mbXQgICA9IFwqYmFkX2lhMzJfZm10OworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT25seSB3b3JrcyBvbiBsaW5fMzIgYW5kIGxyYl8zMmUgcGxhdGZvcm1zLiIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215ICRyYyA9IDA7CitpZiAoIG5vdCBAQVJHViApIHsKKyAgICBpbmZvKCAiTm8gYXJndW1lbnRzIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvLiIgKTsKK30gZWxzZSB7CisgICAgZm9yZWFjaCBteSAkYXJnICggQEFSR1YgKSB7CisgICAgICAgIG15ICRlcnJzID0gY2hlY2tfZmlsZSggJGFyZywgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApOworICAgICAgICBpZiAoICRlcnJzID4gMCApIHsKKyAgICAgICAgICAgICRyYyA9IDM7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGFyZworfTsgIyBpZgorCitleGl0KCAkcmMgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsPiAtLSBNYWtlIHN1cmUgYmluYXJ5IGZpbGUgZG9lcyBub3QgY29udGFpbiB1bmRlc2lyZWQgaW5zdHJ1Y3Rpb25zLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1pbnN0cnVjdGlvbnMucGw+IEk8b3B0aW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorCis9aXRlbSBCPC0tbWF4LWluc3RydWN0aW9ucz0+STxudW1iZXI+CisKK1N0b3Agc2Nhbm5pbmcgaWYgSTxudW1iZXI+IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kLiAxMDAgYnkgZGVmYXVsdC4KKworPWl0ZW0gQjwtLW9zPT5JPG9zPgorCitTcGVjaWZ5IHRhcmdldCBPUy4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8c2hvdy1pbnN0cnVjdGlvbnM+CisKK1Nob3cgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gdGhlIGZpbGUuIEJ1IGRlZmF1bHQsIGluc3RydWN0aW9ucyBhcmUgbm90IHNob3duLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitGaWxlIChvYmplY3QgZmlsZSBvciBsaWJyYXJ5LCBlaXRoZXIgc3RhdGljIG9yIGR5bmFtaWMpIHRvIGNoZWNrLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBydW5zIEY8b2JqZHVtcD4gdXRpbGl0eSB0byBnZXQgZGlzYXNzZW1ibGVyIGxpc3RpbmcgYW5kIGNoZWNrcyB0aGUgZmlsZSBkb2VzIG5vdCBjb250YWluCit1bndhbnRlZCBpbnN0cnVjdGlvbnMuCisKK0N1cnJlbnRseSB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgZm9yOgorCis9b3ZlcgorCis9aXRlbSBDPGxyYl8zMmU+CisKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSB0YXJnZXQgT1MuIFVuZGVzaXJlZCB1bnN0cnVjdGlvbnMgYXJlOiBhbGwgeDg3IGluc3RydWN0aW9ucyBhbmQgc29tZSBvdGhlcnMuCisKKz1pdGVtIEM8bGluXzMyPgorCitVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGFyZSBpbnN0cnVjdGlvbnMgbm90IHZhbGlkIGZvciBQZW50aXVtIDMgcHJvY2Vzc29yIChTU0UyIGFuZCBuZXdlcikuCisKKz1iYWNrCisKKz1jdXQKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvY2hlY2stdG9vbHMucGwgYi9yYzEvcnVudGltZS90b29scy9jaGVjay10b29scy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMzZkNTFhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvY2hlY2stdG9vbHMucGwKQEAgLTAsMCArMSw2MDAgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgUHJhZ21hcy4KK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCisjIExJQk9NUCBtb2R1bGVzLgordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAxNSI7CisKK215ICRwZWRhbnRpYzsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBIZWxwZXIgZnVuY3Rpb25zCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3ViIHJ1bigkXCRcJDtcJCkgeworICAgIG15ICggJGNtZCwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKSA9IEBfOworICAgIG15ICggQHBhdGgsICRyYyApOworICAgIEBwYXRoID0gd2hpY2goICRjbWQtPlsgMCBdLCAtYWxsID0+IDEgKTsKKyAgICBpZiAoIEBwYXRoID4gMCApIHsKKyAgICAgICAgaWYgKCBAcGF0aCA+IDEgYW5kICRwZWRhbnRpYyApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIFwiJGNtZC0+WyAwIF1cIiBmb3VuZCBpbiBQQVRIOiIsIG1hcCggIiAgICAkXyIsIEBwYXRoICkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBkZWJ1ZyggIlwiJGNtZC0+WyAwIF1cIiBmdWxsIHBhdGggaXMgXCIkcGF0aFsgMCBdXCIuIiApOworICAgICAgICBpZiAoIGRlZmluZWQoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkJHBhdGggPSAkcGF0aFsgMCBdOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nIGNvbW1hbmQ6IFwiIiAgLiBqb2luICggIiAiLCBAJGNtZCApIC4gIlwiLiIgKTsKKyAgICAgICAgJHJjID0KKyAgICAgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICAgICAgJGNtZCwKKyAgICAgICAgICAgICAgICAtaWdub3JlX3NpZ25hbCA9PiAxLCAtaWdub3JlX3N0YXR1cyA9PiAxLAorICAgICAgICAgICAgICAgIC1zdGRvdXQgPT4gJHN0ZG91dCwgLXN0ZGVyciA9PiAkc3RkZXJyLCAtc3RkaW4gPT4gdW5kZWYKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggJHJjIDwgMCApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcnVuIFwiJGNtZC0+WyAwIF1cIjogJEAiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgZGVidWcoICJzdGRvdXQ6IiwgJCRzdGRvdXQsICIoZW9mKSIsICJzdGRlcnI6IiwgJCRzdGRlcnIsICIoZW9mKSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YXJuaW5nKCAiTm8gXCIkY21kLT5bIDAgXVwiIGZvdW5kIGluIFBBVEguIiApOworICAgICAgICAkcmMgPSAtMTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRyYzsKK307ICMgc3ViIHJ1bgorCisKK3N1YiBnZXRfYXJjaCgkJCQpIHsKKyAgICBteSAoICRuYW1lLCAkc3RyLCAkZXhwcyApID0gQF87CisgICAgbXkgKCAkYXJjaCwgJGNvdW50ICk7CisgICAgJGNvdW50ID0gMDsKKyAgICBmb3JlYWNoIG15ICRyZSAoIGtleXMoICUkZXhwcyApICkgeworICAgICAgICBpZiAoICRzdHIgPX4gJHJlICkgeworICAgICAgICAgICAgJGFyY2ggPSAkZXhwcy0+eyAkcmUgfTsKKyAgICAgICAgICAgICsrICRjb3VudDsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yCisgICAgaWYgKCAkY291bnQgIT0gMSBvciBub3QgUGxhdGZvcm06OmNhbm9uX2FyY2goICRhcmNoICkgKSB7CisgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgZGV0ZWN0ICRuYW1lIGFyY2hpdGVjdHVyZTogJHN0ciIgKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGFyY2g7Cit9OyAjIHN1YiBnZXRfYXJjaAorCitzdWIgZW5jb2RlKCQpIHsKKyAgICBteSAoICRzdHIgKSA9IEBfOworICAgICRzdHIgPX4gc3sgfXtffWc7CisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiBlbmNvZGUKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGdldF94eHhfdmVyc2lvbiBzdWJyb3V0aW5lcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgU29tZSBvZiBnZXRfeHh4X3ZlcnNpb24oKSBzdWJyb3V0aW5lcyBhY2NlcHQgYW4gYXJndW1lbnQgLS0gYSB0b29sIG5hbWUuIEZvciBleGFtcGxlLAorIyBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbigpIGNhbiByZXBvcnQgdmVyc2lvbiBvZiBDLCBDKyssIG9yIEZvcnRyYW4gY29tcGlsZXIuIFRoZSB0b29sIGZvcgorIyByZXBvcnQgc2hvdWxkIGJlIHNwZWNpZmllZCBieSBhcmd1bWVudCwgZm9yIGV4YW1wbGU6IGdldF9pbnRlbF9jb21waWxlcl92ZXJzaW9uKCAiaWZvcnQiICkuCisjCisjIGdldF94eHhfdmVyc2lvbigpIHN1YnJvdXRpbmVzIHJldHVybnMgbGlzdCBvZiBvbmUgb3IgdHdvIGVsZW1lbnRzOgorIyAgICAgMS4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgc2hvcnQgdG9vbCBuYW1lIChsaWtlICJnY2MiLCAiZysrIiwgImljbCIsIGV0YykuCisjICAgICAyLiBUaGUgc2Vjb25kIGVsZW1lbnQgaXMgdmVyc2lvbiBzdHJpbmcuCisjIElmIHJldHVybmVkIGxpc3QgY29udGFpbiBqdXN0IG9uZSBlbGVtZW50LCBpdCBtZWFucyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgdG9vbC4KKyMKKworc3ViIGdldF9wZXJsX3ZlcnNpb24oKSB7CisgICAgbXkgKCAkcmMsICRzdGRvdXQsICRzdGRlcnIsICR2ZXJzaW9uICk7CisgICAgbXkgJHRvb2wgPSAicGVybCI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPj0gMCApIHsKKyAgICAgICAgIyBUeXBpY2FsIHBlcmwgb3V0cHV0OgorICAgICAgICAjICAgIFRoaXMgaXMgcGVybCwgdjUuMTAuMCBidWlsdCBmb3IgeDg2XzY0LWxpbnV4LXRocmVhZC1tdWx0aQorICAgICAgICAjICAgIFRoaXMgaXMgcGVybCwgdjUuOC44IGJ1aWx0IGZvciBNU1dpbjMyLXg2NC1tdWx0aS10aHJlYWQKKyAgICAgICAgIyAgICBUaGlzIGlzIHBlcmwsIHY1LjEwLjEgKCopIGJ1aWx0IGZvciB4ODZfNjQtbGludXgtdGhyZWFkLW11bHRpCisgICAgICAgIGlmICggJHN0ZG91dCAhfiBte15UaGlzIGlzIHBlcmwuKnYoXGQrXC5cZCsoPzpcLlxkKykpLipidWlsdCBmb3J9bSApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgcGVybCBvdXRwdXQ6IiwgJHN0ZG91dCwgIihvZWYpIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR2ZXJzaW9uID0gJDE7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgICAgIGlmICggJHN0ZG91dCAhfiBte0JpbmFyeSBidWlsZCAoLiopIHByb3ZpZGVkIGJ5IEFjdGl2ZVN0YXRlIH0gKSB7CisgICAgICAgICAgICAgICAgd2FybmluZyggIlBlcmwgaXMgbm90IEFjdGl2ZVN0YXRlIG9uZSIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X3BlcmxfdmVyc2lvbgorCisKK3N1YiBnZXRfZ251X21ha2VfdmVyc2lvbigpIHsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICBteSAkdG9vbCA9ICJtYWtlIjsKKyAgICBteSAoIEByZXQgKSA9ICggJHRvb2wgKTsKKyAgICBteSAoICRwYXRoICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyLCAkcGF0aCApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgICMgVHlwaWNhbCBtYWtlIG91dHB1dDoKKyAgICAgICAgIyAgICAgR05VIE1ha2UgdmVyc2lvbiAzLjc5LjEsIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIFJvbGFuZCBNY0dyYXRoLgorICAgICAgICAjICAgICBHTlUgTWFrZSAzLjgxCisgICAgICAgIGlmICggJHN0ZG91dCA9fiBte15HTlUgTWFrZSAoPzp2ZXJzaW9uICk/KFxkK1wuXGQrKD86XC5cZCspPykoPzosfFxzKX0gKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICQxOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiBhbmQgJHN0ZG91dCA9fiBte2J1aWx0IGZvciAoW2EtejAtOS1dKyl9ICkgeworICAgICAgICAgICAgbXkgJGJ1aWx0X2ZvciA9ICQxOworICAgICAgICAgICAgZGVidWcoICJHTlUgTWFrZSBidWlsdCBmb3I6IFwiJGJ1aWx0X2ZvclwiLiIgKTsKKyAgICAgICAgICAgIGlmICggJGJ1aWx0X2ZvciA9fiBte2N5Z3dpbn1pICkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoICJcIiRwYXRoXCIgaXMgYSBDeWd3aW4gbWFrZSwgaXQgaXMgKm5vdCogc3VpdGFibGUuIiApOworICAgICAgICAgICAgICAgIHJldHVybiBAcmV0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHB1c2goIEByZXQsICR2ZXJzaW9uICk7CisgICAgcmV0dXJuIEByZXQ7Cit9OyAjIHN1YiBnZXRfZ251X21ha2VfdmVyc2lvbgorCisKK3N1YiBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbigkKSB7CisgICAgbXkgKCAkdG9vbCApID0gQF87ICAgICMgVG9vbCBuYW1lLCBsaWtlICJpY2MiLCAiaWNwYyIsICJpY2wiLCBvciAiaWZvcnQiLgorICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdG9vbF9yZSApOworICAgIG15ICR2ZXJzaW9uOworICAgIG15ICRpY19hcmNocyA9IHsKKyAgICAgICAgcXJ7MzItYml0fElBLTMyfSAgICAgICAgPT4gIjMyIiwKKyAgICAgICAgcXJ7SW50ZWxcKFJcKSA2NH0gPT4gIjMyZSIsCisgICAgICAgIHFye0ludGVsXChSXCkgW01dW0ldW0NdIEFyY2hpdGVjdHVyZX0gPT4gIjMyZSIsCisgICAgfTsKKyAgICAkdG9vbF9yZSA9IHF1b3RlbWV0YSggJHRvb2wgKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wsICggJHRhcmdldF9vcyBlcSAid2luIiA/ICgpIDogKCAiLVYiICkgKSBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPCAwICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgIyBJbnRlbCBjb21waWxlciB2ZXJzaW9uIHN0cmluZyBpcyBpbiB0aGUgZmlyc3QgbGluZSBvZiBzdGRlcnIuIEdldCBpdC4KKyAgICAjJHN0ZGVyciA9fiBte1xBKC4qXG4/KX07CisgICAgIyBBQzogTGV0J3MgbG9vayBmb3IgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIGZpcnN0IGxpbmUgd2hpY2ggY29udGFpbnMgIkludGVsIiBzdHJpbmcuCisgICAgIyAgICAgVGhpcyBhbGxvd3MgdG8gdXNlIDExLjEgYW5kIDEyLjAgY29tcGlsZXJzIG9uIG5ldyBNQUMgbWFjaGluZXMgYnkgaWdub3JpbmcKKyAgICAjICAgICBodWdlIG51bWJlciBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgb2xkIGNvbXBpbGVycy4KKyAgICAkc3RkZXJyID1+IG17XihJbnRlbC4qKSR9bTsKKyAgICBteSAkdnN0ciA9ICQxOworICAgIG15ICggJGFwbCwgJHZlciwgJGJsZCwgJHBrZyApOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZzdHIgPX4gbXteSW50ZWwuKj9Db21waWxlclxzKyguKj8pLD9ccytWZXJzaW9uXHMrKC4qPylccytCdWlsZFxzKyhcUyspKD86XHMrUGFja2FnZSBJRDogKFxTKykpP30gKSB7CisgICAgICAgICMgOS54LCAxMC54LCAxMS4wLgorICAgICAgICAoICRhcGwsICR2ZXIsICRibGQsICRwa2cgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICB9IGVsc2lmICggJHZzdHIgPX4gbXteSW50ZWwncyAoLio/KSBDb21waWxlciw/XHMrVmVyc2lvblxzKyguKj8pXHMrQnVpbGRccysoXFMrKX0gKSB7CisgICAgICAgICMgMTEuMQorICAgICAgICAoICRhcGwsICR2ZXIsICRibGQgKSA9ICggJDEsICQyLCAkMyApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgJHt0b29sfSdzIHN0ZGVycjoiLCAkc3RkZXJyLCAiKGVvZikiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAkaWNfYXJjaCA9IGdldF9hcmNoKCAiSW50ZWwgY29tcGlsZXIiLCAkYXBsLCAkaWNfYXJjaHMgKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaWNfYXJjaCApICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBQbGF0Zm9ybTo6Y2Fub25fYXJjaCggJGljX2FyY2ggKSBuZSAkdGFyZ2V0X2FyY2ggKSB7CisgICAgICAgIHdhcm5pbmcoICJUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzICR0YXJnZXRfYXJjaCwgJHRvb2wgZm9yICRpY19hcmNoIGZvdW5kLiIgKTsKKyAgICAgICAgcmV0dXJuIEByZXQ7CisgICAgfTsgIyBpZgorICAgICMgTm9ybWFsaXplIHZlcnNpb24uCisgICAgbXkgJHN0YWdlOworICAgICR2ZXIgPX4gc3tccyt9eyB9ZzsKKyAgICAkdmVyID0gbGMoICR2ZXIgKTsKKyAgICBpZiAoICR2ZXIgPX4gbXtcQShcZCtcLlxkKyg/OlwuXGQrKT8pIChbYS16XSspXGF9aSApIHsKKyAgICAgICAgKCAkdmVyc2lvbiwgJHN0YWdlICkgPSAoICQxLCAkMiApOworICAgIH0gZWxzZSB7CisgICAgICAgICggJHZlcnNpb24sICRzdGFnZSApID0gKCAkdmVyLCAiIiApOworICAgIH07ICMgaWYKKyAgICAjIFBhcnNlIHBhY2thZ2UuCisgICAgaWYgKCBkZWZpbmVkKCAkcGtnICkgKSB7CisgICAgICAgIGlmICggJHBrZyAhfiBte1xBW2x3bV1fW2Etel0rX1thLXpdXyhcZCtcLlxkK1wuXGQrKVx6fWkgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIEludGVsIGNvbXBpbGVyIHBhY2thZ2U6ICRwa2ciICk7CisgICAgICAgICAgICByZXR1cm4gQHJldDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkcGtnID0gJDE7CisgICAgICAgICR2ZXJzaW9uID0gJHBrZzsKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgIiR2ZXJzaW9uICIgLiAoICRzdGFnZSA/ICIkc3RhZ2UgIiA6ICIiICkgLiAiKCRibGQpIGZvciAkaWNfYXJjaCIgKTsKKyAgICAjIE9rLCB2ZXJzaW9uIG9mIEludGVsIGNvbXBpbGVyIGZvdW5kIHN1Y2Nlc3NmdWxseS4gTm93IGxvb2sgYXQgY29uZmlnIGZpbGUuCisgICAgIyBJbnN0YWxsZXIgb2YgSW50ZWwgY29tcGlsZXIgdGVuZHMgdG8gYWRkIGEgcGF0aCB0byBNUyBsaW5rZXIgaW50byBjb21waWxlciBjb25maWcgZmlsZS4KKyAgICAjIEl0IGxlYWRzIHRvIHRyb3VibGVzLiBGb3IgZXhhbXBsZSwgYWxsIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgZm9yIE1TIFZTIDIwMDUsIGJ1dCBJbnRlbAorICAgICMgY29tcGlsZXIgdXNlcyBsbmtlciBmcm9tIE1TIFZTIDIwMDMgYmVjYXVzZSBpdCBpcyBzcGVjaWZpZWQgaW4gY29uZmlnIGZpbGUuCisgICAgIyBUbyBhdm9pZCBzdWNoIHRyb3VibGVzLCBtYWtlIHN1cmU6CisgICAgIyAgICAgSUNMQ0ZHL0lGT1JUQ0ZHIGVudmlyb25tZW50IHZhcmlhYmxlIGV4aXN0cyBvcgorICAgICMgICAgIGNvbXBpbGVyIGNvbmZpZyBmaWxlIGRvZXMgbm90IGV4aXN0LCBvcgorICAgICMgICAgIGNvbXBpbGVyIGNvbmZpZyBmaWxlIGRvZXMgbm90IHNwZWNpZnkgbGlua2VyLgorICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkRU5WeyB1YyggJHRvb2wgLiAiY2ZnIiApIH0gKSApIHsKKyAgICAgICAgICAgICMgSWYgSUNMQ0ZHL0lGT1JUQ0ZHIGVudmlyb25tZW50IHZhcmlhbmxlIGV4aXN0cywgZXZlcnl0aGluZyBpcyBvay4KKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIGNoZWNrIGNvbXBpbGVyJ3MgY29uZmlnIGZpbGUuCisgICAgICAgICAgICBteSAkcGF0aCA9IHdoaWNoKCAkdG9vbCApOworICAgICAgICAgICAgJHBhdGggPX4gc3tcLmV4ZVx6fXt9aTsgICAgICMgRHJvcCAiLmV4ZSIgc3VmZml4LgorICAgICAgICAgICAgJHBhdGggLj0gIi5jZmciOyAgICAgICAgICAgICMgQW5kIGFkZCAiLmNmZyIgb25lLgorICAgICAgICAgICAgaWYgKCAtZiAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICAjIElmIG5vIGNvbmZpZyBmaWxlIGV4aXN0cywgaXQgaXMgb2suCisgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UgYW5hbHl6ZSBpdHMgY29udGVudC4KKyAgICAgICAgICAgICAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggJHBhdGggKTsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBzeyMuKlxufXt9ZzsgICAgIyBSZW1vdmUgY29tbWVudHMuCisgICAgICAgICAgICAgICAgbXkgQG9wdGlvbnMgPSAoICJRdmMiLCAiUWxvY2F0aW9uLGxpbmssIiApOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgICRvcHQgKCBAb3B0aW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkYnVsayA9fiBte1stL10kb3B0fSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJDb21waWxlciBjb25maWcgZmlsZSBcIiRwYXRoXCIgY29udGFpbnMgXCItJG9wdFwiIG9wdGlvbi4iICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9pbnRlbF9jb21waWxlcl92ZXJzaW9uCisKKworc3ViIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbigkKSB7CisgICAgbXkgKCAkdG9vbCApID0gQF87CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgKCAkcmMsICRzdGRvdXQsICRzdGRlcnIsICR2ZXJzaW9uICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPj0gMCApIHsKKyAgICAgICAgbXkgKCAkdmVyLCAkYmxkICk7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAgICAgICAgICMgaTY4Ni1hcHBsZS1kYXJ3aW44LWdjYy00LjAuMSAoR0NDKSA0LjAuMSAoQXBwbGUgQ29tcHV0ZXIsIEluYy4gYnVpbGQgNTM2NykKKyAgICAgICAgICAgICMgaTY4Ni1hcHBsZS1kYXJ3aW45LWdjYy00LjAuMSAoR0NDKSA0LjAuMSAoQXBwbGUgSW5jLiBidWlsZCA1NDg0KQorICAgICAgICAgICAgIyBpNjg2LWFwcGxlLWRhcndpbjExLWxsdm0tZ2NjLTQuMiAoR0NDKSA0LjIuMSAoQmFzZWQgb24gQXBwbGUgSW5jLiBidWlsZCA1NjU4KSAoTExWTSBidWlsZCAyMzM2LjkuMDApCisgICAgICAgICAgICAkc3Rkb3V0ID1+IG17Xi4qPyBcKEdDQ1wpIChcZCtcLlxkK1wuXGQrKSBcKC4qQXBwbGUuKj9JbmNcLiBidWlsZCAoXGQrKVwpfW07CisgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJHN0ZG91dCA9fiBte14uKj8gXChHQ0NcKSAoXGQrXC5cZCtcLlxkKykoPzogKFxkKykpP31tICkgeworICAgICAgICAgICAgICAgICMgZysrIChHQ0MpIDMuMi4zIDIwMDMwNTAyIChSZWQgSGF0IExpbnV4IDMuMi4zLTIwKQorICAgICAgICAgICAgICAgICMgR05VIEZvcnRyYW4gKEdDQykgNC4zLjIgMjAwODExMDUgKFJlZCBIYXQgNC4zLjItNykKKyAgICAgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2lmICggJHN0ZG91dCA9fiBte14uKj8gXChTVVNFIExpbnV4XCkgKFxkK1wuXGQrXC5cZCspXHMrXFsuKj8gKFxkKylcXX1tICkgeworICAgICAgICAgICAgICAgICMgZ2NjIChTVVNFIExpbnV4KSA0LjMuMiBbZ2NjLTRfMy1icmFuY2ggcmV2aXNpb24gMTQxMjkxXQorICAgICAgICAgICAgICAgICggJHZlciwgJGJsZCApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkc3Rkb3V0ID1+IG17Xi4qPyBcKFNVU0UgTGludXhcKSAoXGQrXC5cZCtcLlxkKylccytcZCtccytcWy4qPyAoXGQrKVxdfW0gKSB7CisgICAgICAgICAgICAgICAgIyBnY2MgKFNVU0UgTGludXgpIDQuNy4yIDIwMTMwMTA4IFtnY2MtNF83LWJyYW5jaCByZXZpc2lvbiAxOTUwMTJdCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IFwoKERlYmlhbnxVYnVudHUpLio/XCkgKFxkK1wuXGQrXC5cZCspfW0gKSB7CisgICAgICAgICAgICAgICAgIyBnY2MgKERlYmlhbiA0LjcuMi0yMikgNC43LjIKKyAgICAgICAgICAgICAgICAjIERlYmlhbiBzdXBwb3J0IGZyb20gU3lsdmVzdHJlIExlZHJ1IAorICAgICAgICAgICAgICAgICMgVGhhbmtzIQorICAgICAgICAgICAgICAgICR2ZXIgPSAkMjsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICR2ZXIgKSApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJHZlciAuICggZGVmaW5lZCggJGJsZCApID8gIiAoJGJsZCkiIDogIiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgR05VIGNvbXBpbGVyIHZlcnNpb246IiwgJHN0ZG91dCwgIihlb2YpIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHB1c2goIEByZXQsICR2ZXJzaW9uICk7CisgICAgcmV0dXJuIEByZXQ7Cit9OyAjIHN1YiBnZXRfZ251X2NvbXBpbGVyX3ZlcnNpb24KKworCitzdWIgZ2V0X2NsYW5nX2NvbXBpbGVyX3ZlcnNpb24oJCkgeworICAgIG15ICggJHRvb2wgKSA9IEBfOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgICRyYyA9IHJ1biggWyAkdG9vbCwgIi0tdmVyc2lvbiIgXSwgJHN0ZG91dCwgJHN0ZGVyciApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgIG15ICggJHZlciwgJGJsZCApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgYW5kICRzdGRvdXQgPX4gbXteLio/IChcZCtcLlxkKykgXCguKi0oXGQrXC5cZCtcLlxkKylcKX1tICkgeworICAgICAgICAgICAgIyBBcHBsZSBMTFZNIHZlcnNpb24gNC4yIChjbGFuZy00MjUuMC4yOCkgKGJhc2VkIG9uIExMVk0gMy4yc3ZuKQorICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IChcZCtcLlxkKykoIFwoKC4qKVwpKT99bSApIHsKKyAgICAgICAgICAgICAgICAjIGNsYW5nIHZlcnNpb24gMy4zICh0YWdzL1JFTEVBU0VfMzMvZmluYWwpCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMyApOworICAgICAgICAgICAgfSAKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICR2ZXIgKSApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJHZlciAuICggZGVmaW5lZCggJGJsZCApID8gIiAoJGJsZCkiIDogIiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgQ2xhbmcgY29tcGlsZXIgdmVyc2lvbjoiLCAkc3Rkb3V0LCAiKGVvZikiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgJHZlcnNpb24gKTsKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbgorCisKK3N1YiBnZXRfbXNfY29tcGlsZXJfdmVyc2lvbigpIHsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICBteSAkdG9vbCA9ICJjbCI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgJG1jX2FyY2hzID0geworICAgICAgICBxcns4MHg4Nn0gICAgICAgICA9PiAiSUEtMzIgYXJjaGl0ZWN0dXJlIiwKKyAgICAgICAgcXJ7QU1ENjR8eDY0fSAgICAgPT4gIkludGVsKFIpIDY0IiwKKyAgICB9OworICAgICRyYyA9IHJ1biggWyAkdG9vbCBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPCAwICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkc3RkZXJyICF+IG17Xk1pY3Jvc29mdCAuKiBDb21waWxlciBWZXJzaW9uICguKj8pIGZvciAoLiopXHMqJH1tICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIG91dHB1dDoiLCAkc3RkZXJyLCAiKGVvZikiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAoICR2ZXIsICRhcGwgKSA9ICggJDEsICQyICk7CisgICAgaWYgKCAkdmVyICF+IG17XEFcZCsoPzpcLlxkKykrXHp9ICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIHZlcnNpb246ICR2ZXIiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAkbWNfYXJjaCA9IGdldF9hcmNoKCAiTVMgY29tcGlsZXIiLCAkYXBsLCAkbWNfYXJjaHMgKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWNfYXJjaCApICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBQbGF0Zm9ybTo6Y2Fub25fYXJjaCggJG1jX2FyY2ggKSBuZSAkdGFyZ2V0X2FyY2ggKSB7CisgICAgICAgIHdhcm5pbmcoICJUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzICR0YXJnZXRfYXJjaCwgJHRvb2wgZm9yICRtY19hcmNoIGZvdW5kIiApOworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgJHZlcnNpb24gPSAiJHZlciBmb3IgJHRhcmdldF9hcmNoIjsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2NvbXBpbGVyX3ZlcnNpb24KKworCitzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uKCkgeworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHBhdGggKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wgXSwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKTsKKyAgICBpZiAoICRyYyA8IDAgKSB7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBpZiAoICRzdGRvdXQgIX4gbXteTWljcm9zb2Z0IFwoUlwpIEluY3JlbWVudGFsIExpbmtlciBWZXJzaW9uIChcZCsoPzpcLlxkKykrKVxzKiR9bSApIHsKKyAgICAgICAgd2FybmluZyggIkNhbm5vdCBwYXJzZSBNUyBsaW5rZXIgb3V0cHV0OiIsICRzdGRvdXQsICIoZW9mKSIgKTsKKyAgICAgICAgaWYgKCAkc3RkZXJyID1+IG17Xmxpbms6IG1pc3Npbmcgb3BlcmFuZH0gKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiU2VlbXMgXCIkcGF0aFwiIGlzIGEgVW5peC1saWtlIFwibGlua1wiIHByb2dyYW0sIG5vdCBNUyBsaW5rZXIuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICAkdmVyc2lvbiA9ICggJDEgKTsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAibWFpbiIgcHJvZ3JhbS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJG1ha2U7CitteSAkaW50ZWwgICAgICAgPSAxOyAgICAgICAgICAgICAjIENoZWNrIEludGVsIGNvbXBpbGVycy4KK215ICRmb3J0cmFuICAgICA9IDA7ICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvcnJlc3BvbmRpbmcgRm9ydHJhbiBjb21waWxlciwgaWZvcnQgZm9yIGludGVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgZ251IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgY2xhbmcgCitteSAkY2xhbmcgICAgICAgPSAwOyAgICAgICAgICAgICAjIENoZWNrIENsYW5nIENvbXBpbGVycy4KK215ICRpbnRlbF9jb21waWxlcnMgPSB7CisgICAgImxpbiIgPT4geyBjID0+ICJpY2MiLCBjcHAgPT4gImljcGMiLCBmID0+ICJpZm9ydCIgfSwKKyAgICAibHJiIiA9PiB7IGMgPT4gImljYyIsIGNwcCA9PiAiaWNwYyIsIGYgPT4gImlmb3J0IiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiaWNjIiwgY3BwID0+ICJpY3BjIiwgZiA9PiAiaWZvcnQiIH0sCisgICAgIndpbiIgPT4geyBjID0+ICJpY2wiLCBjcHAgPT4gdW5kZWYsICBmID0+ICJpZm9ydCIgfSwKK307CitteSAkZ251X2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImdjYyIsIGNwcCA9PiAgImcrKyIsIGYgPT4gImdmb3J0cmFuIiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiZ2NjIiwgY3BwID0+ICAiZysrIiwgZiA9PiAiZ2ZvcnRyYW4iIH0sCit9OworbXkgJGNsYW5nX2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKKyAgICAibWFjIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKK307CisKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJpbnRlbCEiICAgICAgICAgPT4gXCRpbnRlbCwKKyAgICAiZm9ydHJhbiIgICAgICAgID0+IFwkZm9ydHJhbiwKKyAgICAiY2xhbmciICAgICAgICAgID0+IFwkY2xhbmcsCisgICAgIm1ha2UiICAgICAgICAgICA9PiBcJG1ha2UsCisgICAgInBlZGFudGljIiAgICAgICA9PiBcJHBlZGFudGljLAorKTsKKworbXkgQHZlcnNpb25zOworcHVzaCggQHZlcnNpb25zLCBbICJQZXJsIiwgICAgIGdldF9wZXJsX3ZlcnNpb24oKSBdICk7CitwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBNYWtlIiwgZ2V0X2dudV9tYWtlX3ZlcnNpb24oKSBdICk7CitpZiAoICRpbnRlbCApIHsKKyAgICBteSAkaWMgPSAkaW50ZWxfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfTsKKyAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEMgQ29tcGlsZXIiLCAgICAgICBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGMgfSApIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRpYy0+eyBjcHAgfSApICkgeworICAgICAgICAjIElmIEludGVsIEMrKyBjb21waWxlciBoYXMgYSBuYW1lIGRpZmZlcmVudCBmcm9tIEMgY29tcGlsZXIsIGNoZWNrIGl0IGFzIHdlbGwuCisgICAgICAgIHB1c2goIEB2ZXJzaW9ucywgWyAiSW50ZWwgQysrIENvbXBpbGVyIiwgZ2V0X2ludGVsX2NvbXBpbGVyX3ZlcnNpb24oICRpYy0+eyBjcHAgfSApIF0gKTsKKyAgICB9OyAjIGlmCisgICAgIyBmb3J0cmFuIGNoZWNrIG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lIHdpdGggLS1mb3J0cmFuCisgICAgaWYgKCAkZm9ydHJhbiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkaWMtPnsgZiB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEZvcnRyYW4gQ29tcGlsZXIiLCBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGYgfSApIF0gKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07Cit9OyAjIGlmCitpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICBpZiAoICRjbGFuZyApIHsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDIENvbXBpbGVyIiwgICAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjICAgfSApIF0gKTsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDKysgQ29tcGlsZXIiLCAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjcHAgfSApIF0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDIENvbXBpbGVyIiwgICAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGMgICB9ICkgXSApOworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDKysgQ29tcGlsZXIiLCAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGNwcCB9ICkgXSApOworICAgIH07ICMgaWYKKyAgICAjIGlmIGludGVsIGZvcnRyYW4gaGFzIGJlZW4gY2hlY2tlZCB0aGVuIGdudSBmb3J0cmFuIGlzIHVubmVjZXNzYXJ5CisgICAgIyBhbHNvLCBpZiB1c2VyIHNwZWNpZmllcyBjbGFuZyBhcyBidWlsZCBjb21waWxlciwgdGhlbiBnZm9ydHJhbiBpcyBhc3N1bWVkIGZvcnRyYW4gY29tcGlsZXIKKyAgICBpZiAoICRmb3J0cmFuIGFuZCBub3QgJGludGVsICkgeworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBGb3J0cmFuIENvbXBpbGVyIiwgZ2V0X2dudV9jb21waWxlcl92ZXJzaW9uKCAkZ251X2NvbXBpbGVycy0+eyAkdGFyZ2V0X29zIH0tPnsgZiB9ICkgXSApOworICAgIH07IAorfTsgCitpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgcHVzaCggQHZlcnNpb25zLCBbICJNUyBDL0MrKyBDb21waWxlciIsICBnZXRfbXNfY29tcGlsZXJfdmVyc2lvbigpIF0gKTsKKyAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIk1TIExpbmtlciIsICAgICAgICAgIGdldF9tc19saW5rZXJfdmVyc2lvbigpIF0gKTsKK307ICMgaWYKKworbXkgJGNvdW50ID0gMDsKK2ZvcmVhY2ggbXkgJGl0ZW0gKCBAdmVyc2lvbnMgKSB7CisgICAgbXkgKCAkdGl0bGUsICR0b29sLCAkdmVyc2lvbiApID0gQCRpdGVtOworICAgIGlmICggbm90IGRlZmluZWQoICR2ZXJzaW9uICkgKSB7CisgICAgICAgICR2ZXJzaW9uID0gIi0tLSBOL0EgLS0tIjsKKyAgICAgICAgKysgJGNvdW50OworICAgIH07ICMgaWYKKyAgICBpZiAoICRtYWtlICkgeworICAgICAgICBwcmludGYoICIlcz0lc1xuIiwgZW5jb2RlKCAkdG9vbCApLCBlbmNvZGUoICR2ZXJzaW9uICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoICIlLTI1czogJXNcbiIsICR0aXRsZSwgJHZlcnNpb24gKTsKKyAgICB9OyAjIGlmCit9OyAjIGZvcmVhY2gKKworZXhpdCggJGNvdW50ID09IDAgPyAwIDogMSApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay10b29scy5wbD4gLS0gQ2hlY2sgZGV2ZWxvcG1lbnQgdG9vbHMgYXZhaWxhYmlsaXR5IGFuZCB2ZXJzaW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2stdG9vbHMucGw+IEk8T1BUSU9OPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tbWFrZT4KKworUHJvZHVjZSBvdXRwdXQgc3VpdGFibGUgZm9yIHVzaW5nIGluIG1ha2VmaWxlOiBzaG9ydCB0b29sIG5hbWVzIChlLiBnLiAiaWNjIiBpbnN0ZWFkIG9mICJJbnRlbCBDCitDb21waWxlciIpLCBzcGFjZXMgaW4gdmVyc2lvbiBzdHJpbmdzIHJlcGxhY2VkIHdpdGggdW5kZXJzY29yZXMuCisKKz1pdGVtIFRvb2xzIHNlbGVjdGlvbgorCis9b3ZlcgorCis9aXRlbSBCPC0tPltCPG5vLT5dQjwtZ251LWZvcnRyYW4+CisKK0NoZWNrIEdOVSBGb3J0cmFuIGNvbXBpbGVyLiBCeSBkZWZhdWx0LCBpdCBpcyBub3QgY2hlY2tlZC4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8aW50ZWw+CisKK0NoZWNrIEludGVsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21waWxlcnMuIFRoaXMgaXMgZGVmYXVsdC4KKworPWJhY2sKKworPWl0ZW0gUGxhdGZvcm0gc2VsZWN0aW9uCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBhcmNoaXRlY3R1cmUuIFVzZWQgaW4gY3Jvc3MtYnVpbGRzLCBmb3IgZXhhbXBsZSB3aGVuIGJ1aWxkaW5nIDMyLWJpdCBhcHBsaWNhdGlvbnMgb24KK0ludGVsKFIpIDY0IG1hY2hpbmUuCisKK0lmIGFyY2hpdGVjdHVyZSBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuCitJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwgaG9zdCBhcmNoaXRlY3R1cmUgZGV0ZWN0ZWQuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgdGFyZ2V0IE9TIG5hbWUuIFVzZWQgaW4gY3Jvc3MtYnVpbGRzLCBmb3IgZXhhbXBsZSB3aGVuIGJ1aWxkaW5nIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBhcHBsaWNhdGlvbnMgb24KK1dpbmRvd3MqIE9TLgorCitJZiBPUyBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9PUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkLgorSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGRldGVjdGVkLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgc2NyaXB0IGNoZWNrcyBhdmFpbGFiaWxpdHkgYW5kIHZlcnNpb25zIG9mIGRldmVsb3BtZW50IHRvb2xzLiBCeSBkZWZhdWx0LCB0aGUgc2NyaXB0IGNoZWNrczoKK1BlcmwsIEdOVSBNYWtlLCBJbnRlbCBjb21waWxlcnMsIEdOVSBDIGFuZCBDKysgY29tcGlsZXJzIChMaW51eCogT1MgYW5kIE9TIFgqKSwKK01pY3Jvc29mdCBDL0MrKyBjb21waWxlciBhbmQgbGlua2VyIChXaW5kb3dzKiBPUykuCisKK1RoZSBzcmlwdCBwcmludHMgbmljZSBsb29raW5nIHRhYmxlIG9yIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5ncy4KKworPWhlYWQyIEVYSVQKKworPW92ZXIKKworPWl0ZW0gKgorCiswIC0tIEFsbCBwcm9ncmFtcyBmb3VuZC4KKworPWl0ZW0gKgorCisxIC0tIFNvbWUgb2YgdG9vbHMgYXJlIG5vdCBmb3VuZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICAkIGNoZWNrLXRvb2xzLnBsCisgICAgUGVybCAgICAgICAgICAgICAgICAgICAgIDogNS44LjAKKyAgICBHTlUgTWFrZSAgICAgICAgICAgICAgICAgOiAzLjc5LjEKKyAgICBJbnRlbCBDIENvbXBpbGVyICAgICAgICAgOiAxMS4wICgyMDA4MDkzMCkgZm9yIDMyZQorICAgIEludGVsIEMrKyBDb21waWxlciAgICAgICA6IDExLjAgKDIwMDgwOTMwKSBmb3IgMzJlCisgICAgSW50ZWwgRm9ydHJhbiBDb21waWxlciAgIDogMTAuMS4wMDggKDIwMDcwOTEzKSBmb3IgMzJlCisgICAgR05VIEMgQ29tcGlsZXIgICAgICAgICAgIDogMy4yLjMgKDIwMDMwNTAyKQorICAgIEdOVSBDKysgQ29tcGlsZXIgICAgICAgICA6IDMuMi4zICgyMDAzMDUwMikKKworICAgID4gY2hlY2stdG9vbHMucGwgLS1tYWtlCisgICAgcGVybD01LjguOAorICAgIG1ha2U9My44MQorICAgIGljbD0xMC4xXygyMDA3MDkxMylfZm9yXzMyZQorICAgIGlmb3J0PTEwLjFfKDIwMDcwOTEzKV9mb3JfMzJlCisgICAgY2w9MTQuMDAuNDAzMTAuNDFfZm9yXzMyZQorICAgIGxpbms9OC4wMC40MDMxMC4zOQorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9jb21tb24uaW5jIGIvcmMxL3J1bnRpbWUvdG9vbHMvY29tbW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjEzMjUxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvY29tbW9uLmluYwpAQCAtMCwwICsxLDk4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK2lmbmRlZiBvbXBfb3MKKworICAjIFdpbmRvd3Mgc2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUzsgZm9yIG90aGVyIHN5c3RlbXMsIGFzayB1bmFtZQorICBpZmVxICgkKE9TKSwpCisgICAgT1M6PSQoc2hlbGwgdW5hbWUpCisgICAgaWZlcSAoJChPUyksKQorICAgICAgJChlcnJvciAiQ2Fubm90IGRldGVjdCBvcGVyYXRpbmcgc3lzdGVtIikKKyAgICBlbmRpZgorICAgIGV4cG9ydCBvbXBfb3M9JChPUykKKyAgZW5kaWYKKworICBpZmVxICgkKE9TKSwgV2luZG93c19OVCkKKyAgICBleHBvcnQgb21wX29zPXdpbmRvd3MKKyAgZW5kaWYKKyAgaWZlcSAoJChPUyksIExpbnV4KQorICAgIGV4cG9ydCBvbXBfb3M9bGludXgKKyAgZW5kaWYKKyAgaWZlcSAoJChPUyksIEZyZWVCU0QpCisgICAgZXhwb3J0IG9tcF9vcz1mcmVlYnNkCisgIGVuZGlmCisgIGlmZXEgKCQoT1MpLCBEYXJ3aW4pCisgICAgZXhwb3J0IG9tcF9vcz1tYWNvcworICBlbmRpZgorCitlbmRpZiAjICFvbXBfb3MKKworIyBDb21waWxpbmcgZm9yIHRoZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBhcmNoaXRlY3R1cmUgaXMgbm9uLXRyaXZpYWwgYXQgdGhlIG5leHQgbGF5ZXIKKyMgb2Ygc2NyaXB0IGRvd24sIGJ1dCB3ZSBjYW4gbWFrZSBpdCBjb25zaXN0ZW50IGhlcmUuCitpZmVxICIkKGFyY2gpIiAibWljIgorICAgICMgSSByZWFsbHkgZG8gbWVhbiB0aGlzLi4uCisgICAgb3ZlcnJpZGUgYXJjaDo9MzJlCisgICAgb3ZlcnJpZGUgbWljOj15ZXMKK2Vsc2UKKyAgICBvdmVycmlkZSBtaWM6PW5vCitlbmRpZgorCitpZmVxICgsJCh3aWxkY2FyZCAkKG9tcF9yb290KS90b29scy8kKG9tcF9vcykuaW5jKSkKKyAgJChlcnJvciAiJChvbXBfb3MpIiBpcyBub3Qgc3VwcG9ydGVkLiBBZGQgdG9vbHMvJChvbXBfb3MpLmluYyBmaWxlIHdpdGggb3Mtc3BlY2lmaWMgc2V0dGluZ3MgKQorZW5kaWYKKworIyBkZXRlY3QgYXJjaCBhbmQgcnVudGltZSB2ZXJzaW9ucywgcHJvdmlkZSBjb21tb24gaG9zdC1zcGVjaWZpYyBkZWZpbml0aW9ucworaW5jbHVkZSAkKG9tcF9yb290KS90b29scy8kKG9tcF9vcykuaW5jCisKK2lmZXEgKCQoYXJjaCksKQorICQoZXJyb3IgQXJjaGl0ZWN0dXJlIG5vdCBkZXRlY3RlZCkKK2VuZGlmCisKKyMgU2V0dGluZyBkZWZhdWx0cworbW9kZT89cmVsZWFzZQorCitpZmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgY29tcGlsZXI/PWdjYworZWxzZQorICAgIGlmZXEgIiQob21wX29zKSIgIndpbmRvd3MiCisgICAgICAgIGNvbXBpbGVyPz1pY2wKKyAgICBlbHNlCisgICAgICAgIGNvbXBpbGVyPz1pY2MKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgIiQobWljKSIgIm5vIgorICAgIGlmZXEgIiQoY29tcGlsZXIpIiAiZ2NjIgorCSQoZXJyb3IgQ29tcGlsaW5nIHRoZSBydW50aW1lIHdpdGggZ2NjIGlzIG5vdCBzdXBwb3J0ZWQgb24gSW50ZWxcKFJcKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUpCisgICAgZW5kaWYKKworICAgICMgTWFnaWMgZmxhZ3MgZm9yIHRoZSBidWlsZCBzY3JpcHQhCisgICAgYnVpbGRfYXJncyArPSAtLW9zPWxyYiAtLW1pYy1hcmNoPWtuYyAtLW1pYy1vcz1saW4gLS1taWMtY29tcD1vZmZsb2FkCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGJpbnV0aWxzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYXJlIGF2YWlsYWJsZQorICAgICMgRmlyc3Qgd2Ugc2VlIHdoZXRoZXIgdGhlIG9iamR1bXAgb24gdGhlIHVzZXIncyBwYXRoIHN1cHBvcnRzIHRoZSBrMW9tIGFyY2hpdGVjdHVyZS4KKyAgICBoYXNrMW9tID0gJChzaGVsbCBpZiAob2JqZHVtcCAtLWhlbHAgfCBncmVwIC1zIGsxb20pOyB0aGVuIGVjaG8gT0s7IGVsc2UgZWNobyBLTzsgZmkpCisgICAgaWZuZXEgIiQoaGFzazFvbSkiICJPSyIKKyAgICAgICAgIyBBcHByb3ByaWF0ZSBiaW51dGlscyBhcmUgbm90IGFscmVhZHkgc2V0IHVwLCBzbyB0cnkgdG8gYWRkIHRoZW0gZnJvbSB0aGUgZGVmYXVsdCBwbGFjZS4KKyAgICAgICAgbWljQmluUGF0aCA9IC91c3IvbGludXgtazFvbS00LjcveDg2XzY0LWsxb20tbGludXgvYmluCisgICAgICAgIG1pY0JpblByZXNlbnQgPSAkKHNoZWxsIGlmIHRlc3QgLWQgJChtaWNCaW5QYXRoKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQorICAgICAgICBpZm5lcSAiJChtaWNCaW5QcmVzZW50KSIgIk9LIgorICAgICAgICAgICAgIyBXZSBjYW4ndCBmaW5kIHRoZW0gaW4gdGhlIG5vcm1hbCBwbGFjZSwgc28gY29tcGxhaW4uCisgICAgICAgICAgICAkKGVycm9yIENvbXBpbGluZyBmb3IgSW50ZWxcKFJcKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgcmVxdWlyZXMgdGhhdCB0aGUgY3Jvc3MtaG9zdGVkIGJpbnV0aWxzIGFyZSBhdmFpbGFibGUgaW4gJChtaWNCaW5QYXRoKS5cCitTZWUgdGhlIFRvb2xzIHRhYiBhdCBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL21pYy1kZXZlbG9wZXIpCisgICAgICAgIGVuZGlmCisgICAgICAgIGV4cG9ydCBQQVRIIDo9ICQobWljQmluUGF0aCk6JHtQQVRIfQorICAgIGVuZGlmCitlbmRpZgorCitleHBvcnQgQlVJTERfQ09NUElMRVIgOj0gJChjb21waWxlcikKKworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9leHBhbmQtdmFycy5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL2V4cGFuZC12YXJzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwYTY0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9leHBhbmQtdmFycy5wbApAQCAtMCwwICsxLDMwNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA1IjsKKworbXkgJG5hbWVfcmV4cCAgICA9IHFye1tBLVphLXpfXStbQS1aYS16MC05X10qfTsKK215ICRrZXl3b3JkX3JleHAgPSBxcntpZnxlbHNlfGVuZHxvbXB9OworCitzdWIgZXJyb3IoJCQkKSB7CisgICAgbXkgKCAkaW5wdXQsICRtc2csICRidWxrICkgPSBAXzsKKyAgICBteSAkcG9zID0gcG9zKCAkJGJ1bGsgKTsKKyAgICAkJGJ1bGsgPX4gbXteKC4qPylcRyguKj8pJH1tIG9yIGRpZSAiSW50ZXJuYWwgZXJyb3IiOworICAgIG15ICggJHByZSwgJHBvc3QgKSA9ICggJDEsICQyICk7CisgICAgbXkgJG4gPSBzY2FsYXIoIEB7IFsgc3Vic3RyKCAkJGJ1bGssIDAsICRwb3MgKSA9fiBte1xufWcgXSB9ICkgKyAxOworICAgIHJ1bnRpbWVfZXJyb3IoICJcIiRpbnB1dFwiIGxpbmUgJG46ICRtc2c6IiwgIj4+PiAiIC4gJHByZSAuICItLVtIRVJFXS0tPiIgLiAkcG9zdCApOworfTsgIyBzdWIgZXJyb3IKKworc3ViIGV2YWx1YXRlKCQkJFwkKSB7CisgICAgbXkgKCAkZXhwciwgJHN0cmljdCwgJGlucHV0LCAkYnVsayApID0gQF87CisgICAgbXkgJHZhbHVlOworICAgIHsgIyBTaWduYWwgaGFuZGxlciB3aWxsIGJlIHJlc3RvcmVkIG9uIGV4aXQgZnJvbSB0aGlzIGJsb2NrLgorICAgICAgICAjIEluIGNhc2Ugb2YgInVzZSBzdHJpY3Q7IHVzZSB3YXJuaW5ncyIgZXZhbCBpc3N1ZXMgd2FybmluZ3MgdG8gc3RkZXJyLiBUaGlzIGRpcmVjdAorICAgICAgICAjIG91dHB1dCBtYXkgY29uZnVzZSB1c2VyLCBzbyB3ZSBuZWVkIHRvIGNhdGNoIGl0IGFuZCBwcmVwZW5kIHdpdGggb3VyIGluZm8uCisgICAgICAgIGxvY2FsICRTSUd7IF9fV0FSTl9fIH0gPSBzdWIgeyBkaWUgQF87IH07CisgICAgICAgICR2YWx1ZSA9CisgICAgICAgICAgICBldmFsKAorICAgICAgICAgICAgICAgICJwYWNrYWdlIF9fRVhQQU5EX1ZBUlNfXztcbiIgLgorICAgICAgICAgICAgICAgICggJHN0cmljdCA/ICJ1c2Ugc3RyaWN0OyB1c2Ugd2FybmluZ3M7XG4iIDogIm5vIHN0cmljdDsgbm8gd2FybmluZ3M7XG4iICkgLgorICAgICAgICAgICAgICAgICRleHByCisgICAgICAgICAgICApOworICAgIH07CisgICAgaWYgKCAkQCApIHsKKyAgICAgICAgIyBEcm9wIGxvY2F0aW9uIGluZm9ybWF0aW9uIC0tIGluY3JlYXNpbmcgZXZhbCBudW1iZXIgYW5kIGNvbnN0YW50ICJsaW5lIDMiCisgICAgICAgICMgaXMgdXNlbGVzcyBmb3IgdGhlIHVzZXIuCisgICAgICAgICRAID1+IHN7IGF0IFwoZXZhbCBcZCtcKSBsaW5lIFxkK317fWc7CisgICAgICAgICRAID1+IHN7XHMqXHp9e307CisgICAgICAgIGVycm9yKCAkaW5wdXQsICJDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiBcIlwke3skZXhwcn19XCI6ICRAIiwgJGJ1bGsgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkc3RyaWN0IGFuZCBub3QgZGVmaW5lZCggJHZhbHVlICkgKSB7CisgICAgICAgIGVycm9yKCAkaW5wdXQsICJTdWJzdGl0dXRpb24gdmFsdWUgaXMgdW5kZWZpbmVkIiwgJGJ1bGsgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICR2YWx1ZTsKK307ICMgc3ViIGV2YWx1YXRlCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAoIEBkZWZpbmVzLCAkaW5wdXQsICRvdXRwdXQsICRzdHJpY3QgKTsKK2dldF9vcHRpb25zKAorICAgICJEfGRlZmluZT1zIiA9PiBcQGRlZmluZXMsCisgICAgInN0cmljdCEiICAgID0+IFwkc3RyaWN0LAorKTsKK2lmICggQEFSR1YgPCAyICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJOb3QgZW5vdWdoIGFyZ3VtZW50IiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDIgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50KHMpIiApOworfTsgIyBpZgorKCAkaW5wdXQsICRvdXRwdXQgKSA9IEBBUkdWOworCitmb3JlYWNoIG15ICRkZWZpbmUgKCBAZGVmaW5lcyApIHsKKyAgICBteSAoICRlcXVhbCwgJG5hbWUsICR2YWx1ZSApOworICAgICRlcXVhbCA9IGluZGV4KCAkZGVmaW5lLCAiPSIgKTsKKyAgICBpZiAoICRlcXVhbCA8IDAgKSB7CisgICAgICAgICRuYW1lID0gJGRlZmluZTsKKyAgICAgICAgJHZhbHVlID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSBzdWJzdHIoICRkZWZpbmUsIDAsICRlcXVhbCApOworICAgICAgICAkdmFsdWUgPSBzdWJzdHIoICRkZWZpbmUsICRlcXVhbCArIDEgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkbmFtZSBlcSAiIiApIHsKKyAgICAgICAgY21kbGluZV9lcnJvciggIklsbGVnYWwgZGVmaW5pdGlvbjogXCIkZGVmaW5lXCI6IHZhcmlhYmxlIG5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJG5hbWUgIX4gbXtcQSRuYW1lX3JleHBcen0gKSB7CisgICAgICAgIGNtZGxpbmVfZXJyb3IoCisgICAgICAgICAgICAiSWxsZWdhbCBkZWZpbml0aW9uOiBcIiRkZWZpbmVcIjogIiAuCisgICAgICAgICAgICAgICAgInZhcmlhYmxlIG5hbWUgc2hvdWxkIGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIgorICAgICAgICApOworICAgIH07ICMgaWYKKyAgICBldmFsKCAiXCRfX0VYUEFORF9WQVJTX186OiRuYW1lID0gXCR2YWx1ZTsiICk7CisgICAgaWYgKCAkQCApIHsKKyAgICAgICAgZGllKCAiSW50ZXJuYWwgZXJyb3I6ICRAIiApOworICAgIH07ICMgaWYKK307ICMgZm9yZWFjaCAkZGVmaW5lCisKKyMKKyMgRG8gdGhlIHdvcmsuCisjCisKK215ICRidWxrOworCisjIFJlYWQgaW5wdXQgZmlsZS4KKyRidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKworIyBEbyB0aGUgcmVwbGFjZW1lbnRzLgorJGJ1bGsgPX4KKyAgICBzeyg/OlwkKCRrZXl3b3JkX3JleHApfFwkKCRuYW1lX3JleHApfFwke3soLio/KX19KX0KKyAgICB7CisgICAgICAgIG15ICR2YWx1ZTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkMSApICkgeworICAgICAgICAgICAgIyBLZXl3b3JkLiBMZWF2ZSBpdCBhcyBpcy4KKyAgICAgICAgICAgICR2YWx1ZSA9ICJcJCQxIjsKKyAgICAgICAgfSBlbHNpZiAoIGRlZmluZWQoICQyICkgKSB7CisgICAgICAgICAgICAjIFZhcmlhYmxlIHRvIGV4cGFuZC4KKyAgICAgICAgICAgIG15ICRuYW1lID0gJDI7CisgICAgICAgICAgICAkdmFsdWUgPSBldmFsKCAiXCRfX0VYUEFORF9WQVJTX186OiRuYW1lIiApOworICAgICAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgICAgICBkaWUoICJJbnRlcm5hbCBlcnJvciIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggJHN0cmljdCBhbmQgbm90IGRlZmluZWQoICR2YWx1ZSApICkgeworICAgICAgICAgICAgICAgIGVycm9yKCAkaW5wdXQsICJWYXJpYWJsZSBcIlwkJG5hbWVcIiBub3QgZGVmaW5lZCIsIFwkYnVsayApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBQZXJsIGNvZGUgdG8gZXZhbHVhdGUuCisgICAgICAgICAgICBteSAkZXhwciA9ICQzOworICAgICAgICAgICAgJHZhbHVlID0gZXZhbHVhdGUoICRleHByLCAkc3RyaWN0LCAkaW5wdXQsICRidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJHZhbHVlOworICAgIH1nZXM7CisKKyMgUHJvY2VzcyBjb25kaXRpb25hbHMuCisjIERpcnR5IHBhdGNoISBOZXN0ZWQgY29uZGl0aW9uYWxzIG5vdCBzdXBwb3J0ZWQhCisjIFRPRE86IEltcGxlbWVudCBuZXN0ZWQgY29uc3RydWN0cy4KKyRidWxrID1+CisgICAgc3teXCRpZiArKFteXG5dKikgKlxuKC4qXG4pXCRlbHNlICpcbiguKlxuKVwkZW5kICpcbn0KKyAgICB7CisgICAgICAgIG15ICggJGV4cHIsICR0aGVuX3BhcnQsICRlbHNlX3BhcnQgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICBteSAkdmFsdWUgPSBldmFsdWF0ZSggJGV4cHIsICRzdHJpY3QsICRpbnB1dCwgJGJ1bGsgKTsKKyAgICAgICAgaWYgKCAkdmFsdWUgKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhlbl9wYXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZhbHVlID0gJGVsc2VfcGFydDsKKyAgICAgICAgfTsgIyBpZgorICAgIH1nZXNtOworCisjIFdyaXRlIG91dHB1dC4KK3dyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsayApOworCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGV4cGFuZC12YXJzLnBsPiAtLSBTaW1wbGUgdGV4dCBwcmVwcm9jZXNzb3IuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGV4cGFuZC12YXJzLnBsPiBJPE9QVElPTj4uLi4gSTxpbnB1dD4gSTxvdXRwdXQ+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LUQ+IEk8bmFtZT5bQjw9Pkk8dmFsdWU+XQorCis9aXRlbSBCPC0tZGVmaW5lPT5JPG5hbWU+W0I8PT5JPHZhbHVlPl0KKworRGVmaW5lIHZhcmlhYmxlLgorCis9aXRlbSBCPC0tc3RyaWN0PgorCitJbiBzdHJpY3QgbW9kZSwgdGhlIHNjcmlwdCBpc3N1ZXMgZXJyb3Igb24gdXNpbmcgdW5kZWZpbmVkIHZhcmlhYmxlcyBhbmQgZXhlY3V0ZXMgUGVybCBjb2RlCit3aXRoIEM8dXNlIHN0cmljdDsgdXNlIHdhcm5pbmdzOz4gcHJhZ21hcy4KKworPWJhY2sKKworPWhlYWQyIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxpbnB1dD4KKworSW5wdXQgZmlsZSBuYW1lLgorCis9aXRlbSBJPG91dHB1dD4KKworT3V0cHV0IGZpbGUgbmFtZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgc2NyaXB0IHJlYWRzIGlucHV0IGZpbGUsIG1ha2VzIHN1YnN0aXR1dGVzIGFuZCB3cml0ZXMgb3V0cHV0IGZpbGUuCisKK1RoZXJlIGFyZSB0d28gZm9ybSBvZiBzdWJzdGl0dXRlczoKKworPW92ZXIKKworPWl0ZW0gVmFyaWFibGVzCisKK1ZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCBpbiBpbnB1dCBmaWxlIGluIGZvcm06CisKKyAgICAkbmFtZQorCitOYW1lIG9mIHZhcmlhYmxlIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIChMYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcykuCitWYXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gY29tbWFuZCBsaW5lIHdpdGggQzwtRD4gb3IgQzwtLWRlZmluZT4gb3B0aW9ucy4KKworPWl0ZW0gUGVybCBDb2RlCisKK1BlcmwgY29kZSBpcyBzcGVjaWZpZWQgaW4gaW5wdXQgZmlsZSBpbiBmb3JtOgorCisgICAgJHt7IC4uLmNvZGUuLi4gfX0KKworVGhlIGNvZGUgaXMgZXZhbHVhdGVkLCBhbmQgaXMgcmVwbGFjZWQgd2l0aCBpdHMgcmVzdWx0LiBOb3RlOiBpbiBzdHJpY3QgbW9kZSwgeW91IHNob3VsZCBkZWNsYXJlCit2YXJpYWJsZSBiZWZvcmUgdXNlLiBTZWUgZXhhbXBsZXMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCitSZXBsYWNlIG9jY3VycmVuY2VzIG9mIEM8JHllYXI+LCBDPCRtb250aD4sIGFuZCBDPCRkYXk+IGluIEM8aW5wdXQudHh0PiBmaWxlIHdpdGggQzwyMDA3PiwgQzwwOT4sIEM8MDE+CityZXNwZWN0aXZlbHkgYW5kIHdyaXRlIHJlc3VsdCB0byBDPG91dHB1dC50eHQ+IGZpbGU6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICBUb2RheSBpcyAkeWVhci0kbW9udGgtJGRheS4KKyAgICAkIGV4cGFuZC12YXJzLnBsIC1EIHllYXI9MjAwNyAtRCBtb250aD0wOSAtRCBkYXk9MDEgaW5wdXQudmFyIG91dHB1dC50eHQgJiYgY2F0IG91dHB1dC50eHQKKyAgICBUb2RheSBpcyAyMDA3LTA5LTAxLgorCitVc2luZyBQZXJsIGNvZGU6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICAke3sgbG9jYWx0aW1lKCk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCAtRCB5ZWFyPTIwMDcgLUQgbW9udGg9MDkgLUQgZGF5PTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgTm93IFR1ZSBNYXkgIDUgMjA6NTQ6MTMgMjAwOQorCitVc2luZyBzdHJpY3QgbW9kZSBmb3IgY2F0Y2hpbmcgYnVnczoKKworICAgICQgY2F0IGlucHV0LnZhcgorICAgICR7eyAieWVhciA6ICIgLiBzdWJzdHIoICRkYXRlLCAwLCA0ICk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCBpbnB1dC52YXIgb3V0cHV0LnR4dCAmJiBjYXQgb3V0cHV0LnR4dAorICAgIHllYXIgOgorCitPb3BzLCB3aHkgaXQgZG9lcyBub3QgcHJpbnQgeWVhcj8gTGV0IHVzIHVzZSBzdHJpY3QgbW9kZToKKworICAgICQgZXhwYW5kLXZhcnMucGwgLS1zdHJpY3QgaW5wdXQudmFyIG91dHB1dC50eHQgJiYgY2F0IG91dHB1dC50eHQKKyAgICBleHBhbmQtdmFycy5wbDogKHgpICJ0ZXN0LnZhciI6IENhbm5vdCBldmFsdWF0ZSBleHByZXNzaW9uICIke3sgInllYXIgOiAiIC4gc3Vic3RyKCAkZGF0ZSwgMCwgNCApOyB9fSI6IEdsb2JhbCBzeW1ib2wgIiRkYXRlIiByZXF1aXJlcyBleHBsaWNpdCBwYWNrYWdlIG5hbWUKKworT2ssIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLiBMZXQgdXMgZGVmaW5lIGl0OgorCisgICAgJCBleHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBkYXRlPTIwMDkwNTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgZXhwYW5kLXZhcnMucGw6ICh4KSAidGVzdC52YXIiOiBDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiAiJHt7ICJ5ZWFyIDogIiAuIHN1YnN0ciggJGRhdGUsIDAsIDQgKTsgfX0iOiBWYXJpYWJsZSAiJGRhdGUiIGlzIG5vdCBpbXBvcnRlZAorCitXaGF0IGlzIHdyb25nPyBWYXJpYWJsZSBzaG91bGQgYmUgZGVjbGFyZWQ6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICAke3sgb3VyICRkYXRlOyAieWVhciA6ICIgLiBzdWJzdHIoICRkYXRlLCAwLCA0ICk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBkYXRlPTIwMDkwNTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgeWVhciA6IDIwMDkKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL2V4dHJhY3Qtb2JqZWN0cy5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL2V4dHJhY3Qtb2JqZWN0cy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNGJlNmVhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvZXh0cmFjdC1vYmplY3RzLnBsCkBAIC0wLDAgKzEsMjU4IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBGaWxlOjpUZW1wOwordXNlIEN3ZDsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKK3VzZSBVbmFtZTsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDUiOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFN1YnJvdXRpbmVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgd2luZG93cyB7CisgICAgbXkgKCAkYXJjaCwgJG91dHB1dCwgQGFyZ3MgKSA9IEBfOworICAgIG15ICVmaWxlczsKKyAgICAjIFRPRE86IENoZWNrIHRoZSBhcmNoaXZlcyBhcmUgb2Ygc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KKyAgICBmb3JlYWNoIG15ICRhcmcgKCBAYXJncyApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkYXJjaGl2ZSAoIGJzZF9nbG9iKCAkYXJnICkgKSB7CisgICAgICAgICAgICBpbmZvKCAiUHJvY2Vzc2luZyBcIiRhcmNoaXZlXCIuLi4iICk7CisgICAgICAgICAgICBteSAkYnVsazsKKyAgICAgICAgICAgIGV4ZWN1dGUoIFsgImxpYi5leGUiLCAiL25vbG9nbyIsICIvbGlzdCIsICRhcmNoaXZlIF0sIC1zdGRvdXQgPT4gXCRidWxrICk7CisgICAgICAgICAgICBteSBAbWVtYmVycyA9IHNwbGl0KCAiXG4iLCAkYnVsayApOworICAgICAgICAgICAgZm9yZWFjaCBteSAkbWVtYmVyICggQG1lbWJlcnMgKSB7CisgICAgICAgICAgICAgICAgbXkgJGZpbGUgPSBnZXRfZmlsZSggJG1lbWJlciApOworICAgICAgICAgICAgICAgIG15ICRwYXRoID0gY2F0X2ZpbGUoICRvdXRwdXQsICRmaWxlICk7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRmaWxlc3sgJGZpbGUgfSApICkgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY3Rpb24gXCIkZmlsZVwiIG1lbWJlciBmcm9tIFwiJGFyY2hpdmVcIiBhcmNoaXZlIGZhaWxlZDoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlwiJGZpbGVcIiBtZW1iZXIgaGFzIGFscmVhZHkgYmVlbiBleHRyYWN0ZWQgZnJvbSBcIiRmaWxlc3sgJGZpbGUgfVwiIGFyY2hpdmUiCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRmaWxlc3sgJGZpbGUgfSA9ICRhcmNoaXZlOworICAgICAgICAgICAgICAgIGluZm8oICIgICAgV3JpdGluZyBcIiRwYXRoXCIuLi4iICk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAibGliLmV4ZSIsICIvbm9sb2dvIiwgIi9leHRyYWN0OiIgLiAkbWVtYmVyLCAiL291dDoiIC4gJHBhdGgsICRhcmNoaXZlIF0gKTsKKyAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkbWVtYmVyCisgICAgICAgIH07ICMgZm9yZWFjaCAkYXJjaGl2ZQorICAgIH07ICMgZm9yZWFjaCAkYXJnCit9OyAjIHN1YiB3aW5kb3dzCisKK3N1YiBsaW51eCB7CisgICAgbXkgKCAkYXJjaCwgJG91dHB1dCwgQGFyY2hpdmVzICkgPSBAXzsKKyAgICAjIFRPRE86IENoZWNrIHRoZSBhcmNoaXZlcyBhcmUgb2Ygc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KKyAgICBteSAkY3dkID0gQ3dkOjpjd2QoKTsKKyAgICBjaGFuZ2VfZGlyKCAkb3V0cHV0ICk7CisgICAgZm9yZWFjaCBteSAkYXJjaGl2ZSAoIEBhcmNoaXZlcyApIHsKKyAgICAgICAgaW5mbyggIlByb2Nlc3NpbmcgXCIkYXJjaGl2ZVwiLi4uIiApOworICAgICAgICBteSAkcGF0aCA9IGFic19wYXRoKCAkYXJjaGl2ZSwgJGN3ZCApOworICAgICAgICBleGVjdXRlKCBbICJhciIsICJ4byIsICRwYXRoIF0gKTsKKyAgICB9OyAjIGZvcmVhY2ggJGFyY2hpdmUKKyAgICBjaGFuZ2VfZGlyKCAkY3dkICk7Cit9OyAjIHN1YiBsaW51eAorCitteSAlbWFjX2FyY2ggPSAoCisgICAgIjMyIiAgPT4gImkzODYiLAorICAgICIzMmUiID0+ICJ4ODZfNjQiCispOworCitzdWIgZGFyd2luIHsKKyAgICBteSAoICRhcmNoLCAkb3V0cHV0LCBAYXJjaGl2ZXMgKSA9IEBfOworICAgIG15ICRjd2QgPSBnZXRjd2QoKTsKKyAgICBjaGFuZ2VfZGlyKCAkb3V0cHV0ICk7CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWFjX2FyY2h7ICRhcmNoIH0gKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJBcmNoaXRlY3R1cmUgXCIkYXJjaFwiIGlzIG5vdCBhIHZhbGlkIG9uZSBmb3IgT1MgWCoiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGFyY2ggPSAkbWFjX2FyY2h7ICRhcmNoIH07CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJGFyY2hpdmUgKCBAYXJjaGl2ZXMgKSB7CisgICAgICAgIGluZm8oICJQcm9jZXNzaW5nIFwiJGFyY2hpdmVcIi4uLiIgKTsKKyAgICAgICAgbXkgJHBhdGggPSBhYnNfcGF0aCggJGFyY2hpdmUsICRjd2QgKTsKKyAgICAgICAgbXkgJHRlbXA7CisgICAgICAgICMgV2hldGhlciBhcmNoaXZlIGlzIGEgZmF0IG9yIHRoaW4/CisgICAgICAgIG15ICRidWxrOworICAgICAgICBleGVjdXRlKCBbICJmaWxlIiwgJHBhdGggXSwgLXN0ZG91dCA9PiBcJGJ1bGsgKTsKKyAgICAgICAgaWYgKCAkYnVsayA9fiBte01hY2gtTyB1bml2ZXJzYWwgYmluYXJ5fSApIHsKKyAgICAgICAgICAgICMgQXJjaGl2ZSBpcyBmYXQsIGV4dHJhY3kgdGhpbiBhcmNoaXZlIGZpcnN0LgorICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiXCIkYXJjaGl2ZVwiIGFyY2hpdmUgaXMgdW5pdmVyc2FsIGJpbmFyeSwgIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAicGxlYXNlIHNwZWNpZnkgYXJjaGl0ZWN0dXJlIHRvIHdvcmsgd2l0aCIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKCB1bmRlZiwgJHRlbXAgKSA9IEZpbGU6OlRlbXA6OnRlbXBmaWxlKCk7CisgICAgICAgICAgICBleGVjdXRlKCBbICJsaWJ0b29sIiwgIi1zdGF0aWMiLCAiLWFyY2hfb25seSIsICRhcmNoLCAiLW8iLCAkdGVtcCwgJHBhdGggXSApOworICAgICAgICAgICAgJHBhdGggPSAkdGVtcDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBleGVjdXRlKCBbICJhciIsICJ4byIsICRwYXRoIF0gKTsgICAgICMgRXh0cmFjdCBtZW1iZXJzLgorICAgICAgICBpZiAoIGRlZmluZWQoICR0ZW1wICkgKSB7ICAgICAgICAgICAgICMgRGVsZXRlIHRlbXAgZmlsZSwgaWYgYW55LgorICAgICAgICAgICAgZGVsX2ZpbGUoICR0ZW1wICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGFyY2hpdmUKKyAgICBjaGFuZ2VfZGlyKCAkY3dkICk7Cit9OyAjIHN1YiBkYXJ3aW4KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1haW4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorCitteSAkb3V0cHV0ID0gIi4iOworbXkgQGFyZ3M7CisKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJvfG91dHB1dC1kaXJlY3Rvcnk9cyIgPT4gXCRvdXRwdXQsCispOworQGFyZ3MgPSBAQVJHVjsKKworaWYgKCBub3QgLWUgJG91dHB1dCApIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT3V0cHV0IGRpcmVjdG9yeSBcIiRvdXRwdXRcIiBkb2VzIG5vdCBleGlzdCIgKTsKK307ICMgaWYKK2lmICggbm90IC1kICRvdXRwdXQgKSB7CisgICAgcnVudGltZV9lcnJvciggIlwiJG91dHB1dFwiIGlzIG5vdCBhIGRpcmVjdG9yeSIgKTsKK307ICMgaWYKK2lmICggbm90IC13ICRvdXRwdXQgKSB7CisgICAgcnVudGltZV9lcnJvciggIk91dHB1dCBkaXJlY3RvcnkgXCIkb3V0cHV0XCIgaXMgbm90IHdyaXRhYmxlIiApOworfTsgIyBpZgorCitpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKnByb2Nlc3MgPSBcJndpbmRvd3M7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiBvciAkdGFyZ2V0X29zIGVxICJscmIiICkgeworICAgICpwcm9jZXNzID0gXCZsaW51eDsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJtYWMiICkgeworICAgICpwcm9jZXNzID0gXCZkYXJ3aW47Cit9IGVsc2UgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPUyBcIiR0YXJnZXRfb3NcIiBub3Qgc3VwcG9ydGVkIiApOworfTsgIyBpZgorCisKKyMgRG8gdGhlIHdvcmsuCitwcm9jZXNzKCAkdGFyZ2V0X2FyY2gsICRvdXRwdXQsIEBhcmdzICk7CitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gLS0gRXh0cmFjdCBhbGwgb2JqZWN0IGZpbGVzIGZyb20gc3RhdGljIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gSTxvcHRpb24+Li4uIEk8YXJjaGl2ZT4uLi4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWFyY2hpdGVjdHVyZT0+STxhcmNoPgorCitTcGVjaWZ5IGFyY2hpdGVjdHVyZSB0byB3b3JrIHdpdGguIFRoZSBvcHRpb24gaXMgbWFuZGF0b3J5IG9uIE9TIFgqIGluIGNhc2Ugb2YgdW5pdmVyc2FsIGFyY2hpdmUuCitJbiBvdGhlciBjYXNlcyB0aGUgb3B0aW9uIHNob3VsZCBub3QgYmUgdXNlZC4gSTxhcmNoPiBtYXkgYmUgb25lIG9mIEM8MzI+IG9yIEM8MzJlPi4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSBPUyBuYW1lLiBCeSBkZWZhdWx0IE9TIGlzIGF1dG9kZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gdXNlcyBkaWZmZXJlbnQgZXh0ZXJuYWwgdG9vbHMgZm9yIGhhbmRsaW5nIHN0YXRpYworbGlicmFyaWVzOiBGPGFyPiAoaW4gY2FzZSBvZiAibGluIiBhbmQgIm1hYyIpIG9yIEY8bGliLmV4ZT4gKGluIGNhc2Ugb2YgIndpbiIpLgorCis9aXRlbSBCPC0tb3V0cHV0LWRpcmVjdG9yeT0+STxkaXI+CisKK1NwZWNpZnkgZGlyZWN0b3J5IHRvIHdyaXRlIGV4dHJhY3RlZCBtZW1iZXJzIHRvLiBDdXJyZW50IGRpcmVjdG9yeSBpcyB1c2VkIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitEbyBub3QgcHJpbnQgaW5mb3JtYXRpb24gbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8YXJjaGl2ZT4KKworQSBuYW1lIG9mIGFyY2hpdmUgZmlsZSAoc3RhdGljIGxpYnJhcnkpLiBNdWx0aXBsZSBhcmNoaXZlcyBtYXkgYmUgc3BlY2lmaWVkLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBleHRyYWN0cyBhbGwgdGhlIG1lbWJlcnMgKG9iamVjdCBmaWxlcykgZnJvbSBhcmNoaXZlIChzdGF0aWMgbGlicmFyeSkgdG8gc3BlY2lmaWVkCitkaXJlY3RvcnkuIENvbW1hbmRzIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24gZGlmZmVyIG9uIGRpZmZlcmVudCBPU2VzLiBPbiBMaW51eCogT1MsIHNpbXBsZSBjb21tYW5kCisKKyAgICBhciB4byBsaWJmaWxlLmEKKworaXMgZW5vdWdoIChpbiBjYXNlIG9mIGV4dHJhY3RpbmcgZmlsZXMgdG8gY3VycmVudCBkaXJlY3RvcnkpLgorCitPbiBPUyBYKiwgaXQgaXMgYSBiaXQgY29tcGlsaWNhdGVkIHdpdGggdW5pdmVyc2FsICgiZmF0IikgYmluYXJpZXMgLS0gQzxhcj4gY2Fubm90CitvcGVyYXRlIG9uIGZhdCBhcmNoaXZlcywgc28gInRoaW4iIGFyY2hpdmUgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSB1bml2ZXJzYWwgYmluYXJ5IGZpcnN0LgorCitPbiBXaW5kb3dzKiBPUywgbGlicmFyeSBtYW5hZ2VyIChDPGxpYi5leGU+KSBjYW4gZXh0cmFjdCBvbmx5IG9uZSBvYmplY3QgZmlsZSwgc28gb3BlcmF0aW9uIHNob3VsZCBiZQorcmVwZWF0ZWQgZm9yIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBsaWJyYXJ5LgorCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gZGV0ZWN0cyBPUyBhdXRvbWF0aWNhbGx5LiBCdXQgZGV0ZWN0aW9uIGNhbiBiZSBvdmVycmlkZWQgd2l0aCBCPC0tb3M+IG9wdGlvbi4KK0l0IG1heSBiZSBoZWxwZnVsIGluIGNyb3NzLWJ1aWxkIGVudmlyb25tZW50cy4KKworQjxleHRyYWN0LW9iamVjdHMucGw+IGVmZmVjdGl2ZWx5IGVuY2Fwc3VsYXRlcyBhbGwgdGhlc2UgZGV0YWlscyBhbmQgcHJvdmlkZXMgdW5pZm9ybSB3YXkgZm9yCitleHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIHN0YXRpYyBsaWJyYXJpZXMsIHdoaWNoIGhlbHBzIHRvIGtlZXAgbWFrZWZpbGVzIHNpbXBsZSBhbmQgY2xlYW4uCisKKz1oZWFkMSBFWEFNUExFUworCitFeHRyYWN0IG9iamVjdCBmaWxlcyBmcm9tIGxpYnJhcnkgRjxsaWJpcmMubGliPiwgYW5kIHB1dCB0aGVtIGludG8gRjxvYmovPiBkaXJlY3Rvcnk6CisKKyAgICAkIGV4dHJhY3Qtb2JqZWN0cy5wbCAtLW91dHB1dD1vYmogbGliaXJjLmxpYgorCitFeHRyYWN0IG9iamVjdCBmaWxlcyBmcm9tIGxpYnJhcnkgRjxsaWJpcmMuYT4uIFVzZSBMaW51eCogT1MgdG9vbHMgKEY8YXI+KSwgZXZlbiBpZiBydW4gb24gYW5vdGhlciBPUzoKKworICAgICQgZXh0cmFjdC1vYmplY3RzLnBsIC0tb3M9bGluIGxpYmlyYy5hCisKK0V4dHJhY3Qgb2JqZWN0IGZpbGVzIGZyb20gbGlicmFyeSBGPGxpYmlyYy5hPiwgaWYgaXQgaXMgYSBPUyBYKiB1bml2ZXJzYWwgYmluYXJ5LCB1c2UgaTM4NgorYXJjaGl0ZWN0dXJlLiBCZSBxdWlldDoKKworICAgICQgZXh0cmFjdC1vYmplY3RzLnBsIC0tcXVpZXQgLS1hcmNoPWkzODYgbGliaXJjLmEKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvZnJlZWJzZC5pbmMgYi9yYzEvcnVudGltZS90b29scy9mcmVlYnNkLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ3ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvZnJlZWJzZC5pbmMKQEAgLTAsMCArMSwxMyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitpbmNsdWRlIHRvb2xzL2xpbnV4LmluYworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwgYi9yYzEvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbApAQCAtMCwwICsxLDMyMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU29tZSBwcmFnbWFzLgordXNlIHN0cmljdDsgICAgICAgICAgIyBSZXN0cmljdCB1bnNhZmUgY29uc3RydWN0cy4KK3VzZSB3YXJuaW5nczsgICAgICAgICMgRW5hYmxlIGFsbCB3YXJuaW5ncy4KKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworIworIyBTdWJyb3V0aW5lcy4KKyMKKworc3ViIHBhcnNlX2lucHV0KCRcJSkgeworCisgICAgbXkgKCAkaW5wdXQsICRkZWZzICkgPSBAXzsKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJGlucHV0ICk7CisgICAgbXkgJWVudHJpZXM7CisgICAgbXkgJW9yZGluYWxzOworICAgIG15IEBkaXJzOworICAgIG15ICR2YWx1ZSA9IDE7CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbXNnLCAkbCwgJGxpbmUgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBmaWxlIFwiJGlucHV0XCIgbGluZSAkbDpcbiIgLgorICAgICAgICAgICAgICAgICIgICAgJGxpbmUiIC4KKyAgICAgICAgICAgICAgICAoICRtc2cgPyAkbXNnIC4gIlxuIiA6ICgpICkKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBteSAkbiA9IDA7ICAgICMgTGluZSBudW1iZXIuCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBidWxrICkgeworICAgICAgICArKyAkbjsKKyAgICAgICAgaWYgKCAwICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lIG9yIGNvbW1lbnQuIFNraXAgaXQuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolfSApIHsKKyAgICAgICAgICAgICMgQSBkaXJlY3RpdmUuCisgICAgICAgICAgICBpZiAoIDAgICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyppZihuKT9kZWZccysoW0EtWmEtejAtOV9dKylccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgbXkgKCAkbmVnYXRpb24sICRuYW1lICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgICAgIG15ICRkaXIgPSB7IG4gPT4gJG4sIGxpbmUgPT4gJGxpbmUsIG5hbWUgPT4gJG5hbWUsIHZhbHVlID0+ICR2YWx1ZSB9OworICAgICAgICAgICAgICAgIHB1c2goIEBkaXJzLCAkZGlyICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gKCAkdmFsdWUgYW5kICggJG5lZ2F0aW9uIHhvciAkZGVmcy0+eyAkbmFtZSB9ICkgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolXHMqZW5kaWZccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgQGRpcnMgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JwaGFuICVlbmRpZiBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGRpci0+eyB2YWx1ZSB9OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkJhZCBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLSk/XHMqKFtBLVphLXowLTlfXSspKD86XHMrKFxkK3xEQVRBKSk/XHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgbXkgKCAkb2Jzb2xldGUsICRlbnRyeSwgJG9yZGluYWwgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICAgICAgaWYgKCAkdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRlbnRyaWVzeyAkZW50cnkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkVudHJ5IFwiJGVudHJ5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzeyAkZW50cnkgfSA9IHsgb3JkaW5hbCA9PiAkb3JkaW5hbCwgb2Jzb2xldGUgPT4gZGVmaW5lZCggJG9ic29sZXRlICkgfTsKKyAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcmRpbmFsICkgYW5kICRvcmRpbmFsIG5lICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkb3JkaW5hbCA+PSAxMDAwIGFuZCAkZW50cnkgPX4gbXtcQVtva11tcF99ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFsIG9mIHVzZXItY2FsbGFibGUgZW50cnkgbXVzdCBiZSA8IDEwMDAiLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRvcmRpbmFsIDwgMjAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbHMgYmV0d2VlbiAxMDAwIGFuZCAxOTk5IGFyZSByZXNlcnZlZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9yZGluYWxzeyAkb3JkaW5hbCB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgJG9yZGluYWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRvcmRpbmFsc3sgJG9yZGluYWwgfSA9ICRlbnRyeTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIiIsICRuLCAkbGluZSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICBpZiAoIEBkaXJzICkgeworICAgICAgICBteSAkZGlyID0gcG9wKCBAZGlycyApOworICAgICAgICAkZXJyb3ItPiggIlVudGVybWluYXRlZCAlaWYgZGlyZWNpdmUuIiwgJGRpci0+eyBuIH0sICRkaXItPnsgbGluZSB9ICk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuICVlbnRyaWVzOworCit9OyAjIHN1YiBwYXJzZV9pbnB1dAorCitzdWIgcHJvY2VzcyhcJSkgeworCisgICAgbXkgKCAkZW50cmllcyApID0gQF87CisKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIGtleXMoICUkZW50cmllcyApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgbXkgJG9yZGluYWwgPSAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvcmRpbmFsIH07CisgICAgICAgICAgICBpZiAoICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG9yZGluYWwgKSBvciAkb3JkaW5hbCBlcSAiREFUQSIgKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGVudHJ5IFwiJGVudHJ5XCI6IG9yZGluYWwgbnVtYmVyIGlzIG5vdCBzcGVjaWZpZWQuIgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAkZW50cmllcy0+eyB1YyggJGVudHJ5ICkgfSA9IHsgb3JkaW5hbCA9PiAxMDAwICsgJG9yZGluYWwgfTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICUkZW50cmllczsKKworfTsgIyBzdWIgcHJvY2VzcworCitzdWIgZ2VuZXJhdGVfb3V0cHV0KFwlJCkgeworCisgICAgbXkgKCAkZW50cmllcywgJG91dHB1dCApID0gQF87CisgICAgbXkgJGJ1bGs7CisKKyAgICAkYnVsayA9ICJFWFBPUlRTXG4iOworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICggc29ydCgga2V5cyggJSRlbnRyaWVzICkgKSApIHsKKyAgICAgICAgaWYgKCBub3QgJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb2Jzb2xldGUgfSApIHsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIgICAgJS00MHMgIiwgJGVudHJ5ICk7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIkRBVEEiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRidWxrIC49ICJcQCIgLiAkb3JkaW5hbDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkYnVsayAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisgICAgaWYgKCBkZWZpbmVkKCAkb3V0cHV0ICkgKSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsayApOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50KCAkYnVsayApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgZ2VuZXJhdGVfb3VwdXQKKworIworIyBQYXJzZSBjb21tYW5kIGxpbmUuCisjCisKK215ICRpbnB1dDsgICAjIFRoZSBuYW1lIG9mIGlucHV0IGZpbGUuCitteSAkb3V0cHV0OyAgIyBUaGUgbmFtZSBvZiBvdXRwdXQgZmlsZS4KK215ICVkZWZzOworCitnZXRfb3B0aW9ucygKKyAgICAib3V0cHV0PXMiICAgID0+IFwkb3V0cHV0LAorICAgICJEfGRlZmluZT1zIiAgPT4KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICggJG9wdF9uYW1lLCAkb3B0X3ZhbHVlICkgPSBAXzsKKyAgICAgICAgICAgIG15ICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICk7CisgICAgICAgICAgICBpZiAoICRvcHRfdmFsdWUgPX4gbXtcQSguKj8pPSguKilcen0gKSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICkgPSAoICRvcHRfdmFsdWUsIDEgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRkZWZzeyAkZGVmX25hbWUgfSA9ICRkZWZfdmFsdWU7CisgICAgICAgIH0sCispOworCitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMuIiApOworfTsgIyBpZgorJGlucHV0ID0gc2hpZnQoIEBBUkdWICk7CisKKyMKKyMgV29yay4KKyMKKworbXkgJWRhdGEgPSBwYXJzZV9pbnB1dCggJGlucHV0LCAlZGVmcyApOworJWRhdGEgPSBwcm9jZXNzKCAlZGF0YSApOworZ2VuZXJhdGVfb3V0cHV0KCAlZGF0YSwgJG91dHB1dCApOworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGdlbmVyYXRlLWRlZi5wbD4gLS0gR2VuZXJhdGUgZGVmIGZpbGUgZm9yIE9wZW5NUCBSVEwuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGdlbmVyYXRlLWRlZi5wbD4gSTxPUFRJT04+Li4uIEk8ZmlsZT4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRlZmluZT0+STxuYW1lPls9STx2YWx1ZT5dCisKKz1pdGVtIEI8LUQ+IEk8bmFtZT5bPUk8dmFsdWU+XQorCitEZWZpbmUgc3BlY2lmaWVkIG5hbWUuIElmIEk8dmFsdWU+IGlzIG9taXR0ZWQsIEk8bmFtZT4gaXMgZGVmaW5lZCB0byAxLiBJZiBJPHZhbHVlPiBpcyAwIG9yIGVtcHR5LAorbmFtZSBpcyBCPG5vdD4gZGVmaW5lZC4KKworPWl0ZW0gQjwtLW91dHB1dD0+STxmaWxlPgorCis9aXRlbSBCPC1vPiBJPGZpbGU+CisKK1NwZWNpZnkgb3V0cHV0IGZpbGUgbmFtZS4gSWYgb3B0aW9uIGlzIG5vdCBwcmVzZW50LCByZXN1bHQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGlucHV0IGZpbGUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IHJlYWRzIGlucHV0IGZpbGUsIHByb2Nlc3MgY29uZGl0aW9uYWwgZGlyZWN0aXZlcywgY2hlY2tzIGNvbnRlbnQgZm9yIGNvbnNpc3RlbmN5LCBhbmQKK2dlbmVyYXRlcyBvdXB0cHV0IGZpbGUgc3VpdGFibGUgZm9yIGxpbmtlci4KKworPWhlYWQyIElucHV0IEZpbGUgRm9ybWF0CisKKz1vdmVyCisKKz1pdGVtIENvbW1lbnRzCisKKyAgICAjIEl0J3MgYSBjb21tZW50LgorCitDb21tZW50cyBzdGFydCB3aXRoIEM8Iz4gc3ltYm9sIGFuZCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGxpbmUuCisKKz1pdGVtIENvbmRpdGlvbmFsIERpcmVjdGl2ZXMKKworICAgICVpZmRlZiBuYW1lCisgICAgJWlmbmRlZiBuYW1lCisgICAgJWVuZGlmCisKK0EgcGFydCBvZiBmaWxlIHN1cnJvdW5kZWQgYnkgQzwlaWZkZWYgSTxuYW1lPj4gYW5kIEM8JWVuZGlmPiBkaXJlY3RpdmVzIGlzIGEgY29uZGl0aW9uYWwgcGFydCAtLSBpdAoraGFzIGVmZmVjdCBvbmx5IGlmIEk8bmFtZT4gaXMgZGVmaW5lZCBpbiB0aGUgY29tbWFuIGxpbmUgYnkgQjwtLWRlZmluZT4gb3B0aW9uLiBDPCVpZm5kZWY+IGlzIGEKK25lZ2F0ZWQgdmVyc2lvbiBvZiBDPCVpZmRlZj4gLS0gY29uZGl0aW9uYWwgcGFydCBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBCPG5vdD4gZGVmaW5lZC4KKworQ29uZGl0aW9uYWwgcGFydHMgbWF5IGJlIG5lc3RlZC4KKworPWl0ZW0gRXhwb3J0IERlZmluaXRpb25zCisKKyAgICBzeW1ib2wKKyAgICBzeW1ib2wgb3JkaW5hbAorICAgIHN5bWJvbCBEQVRBCisKK1N5bWJvbHMgc3RhcnRpbmcgd2l0aCBDPG9tcF8+IG9yIEM8a21wXz4gbXVzdCBoYXZlIG9yZGluYWwgc3BlY2lmaWVkLiBUaGV5IGFyZSBzdWJqZWN0cyBmb3Igc3BlY2lhbAorcHJvY2Vzc2luZzogZWFjaCBzeW1ib2wgZ2VuZXJhdGVzIHR3byBvdXRwdXQgbGluZXM6IG9yaWdpbmFsIG9uZSBhbmQgdXBwZXIgY2FzZSB2ZXJzaW9uLiBUaGUgb3JkaW5hbAorbnVtYmVyIG9mIHRoZSBzZWNvbmQgaXMgb3JpZ2luYWwgb3JkaW5hbCBpbmNyZWFzZWQgYnkgMTAwMC4KKworPWl0ZW0gT2Jzb2xldGUgU3ltYm9scworCisgICAgLSBzeW1ib2wKKyAgICAtIHN5bWJvbCBvcmRpbmFsCisgICAgLSBzeW1ib2wgREFUQQorCitPYnNvbGV0ZSBzeW1ib2xzIGxvb2sgbGlrZSBleHBvcnQgZGVmaW5pdGlvbnMgcHJlZml4ZWQgd2l0aCBtaW51cyBzaWduLiBPYnNvbGV0ZSBzeW1ib2xzIGRvIG5vdAorYWZmZWN0IHRoZSBvdXRwdXQsIGJ1dCBvYnNvbGV0ZSBzeW1ib2xzIGFuZCB0aGVpciBvcmRpbmFscyBjYW5ub3QgYmUgKHJlKXVzZWQgaW4gZXhwb3J0IGRlZmluaXRpb25zLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgICQgZ2VuZXJhdGUtZGVmLnBsIC1EIHN0dWIgLUQgVVNFX1RDSEVDSz0wIC1vIGxpYmd1aWRlLmRlZiBkbGxleHBvcnQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtIGIvcmMxL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjcxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9saWIvQnVpbGQucG0KQEAgLTAsMCArMSwyNjQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgQnVpbGQ7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBDd2QgcXd7fTsKKwordXNlIExpYk9NUDsKK3VzZSB0b29sczsKK3VzZSBVbmFtZTsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitteSAkaG9zdCA9IFVuYW1lOjpob3N0X25hbWUoKTsKK215ICRyb290ID0gJEVOVnsgTElCT01QX1dPUksgICAgfTsKK215ICR0bXAgID0gJEVOVnsgTElCT01QX1RNUCAgICAgfTsKK215ICRvdXQgID0gJEVOVnsgTElCT01QX0VYUE9SVFMgfTsKKworbXkgQGpvYnM7CitvdXIgJHN0YXJ0ID0gdGltZSgpOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEhlbHBlciBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgdHN0ciAtLSBUaW1lIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgInl5eXktZGQtbW0gaGg6bW06c3MgVVRDIi4KK3N1YiB0c3RyKDskKSB7CisgICAgbXkgKCAkdGltZSApID0gQF87CisgICAgaWYgKCBub3QgZGVmaW5lZCggJHRpbWUgKSApIHsKKyAgICAgICAgJHRpbWUgPSB0aW1lKCk7CisgICAgfTsgIyBpZgorICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSggJHRpbWUgKTsKKyAgICAkbW9udGggKz0gMTsKKyAgICAkeWVhciAgKz0gMTkwMDsKKyAgICBteSAkc3RyID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIFVUQyIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiB0c3RyCisKKyMgZHN0ciAtLSBEdXJhdGlvbiBzdHJpbmcuIFJldHVybnMgc3RyaW5nICJoaDptbTpzcyIuCitzdWIgZHN0cigkKSB7CisgICAgIyBHZXQgdGltZSBpbiBzZWNvbmRzIGFuZCBmb3JtYXQgaXQgYXMgdGltZSBpbiBob3VycywgbWludXRlcywgc2Vjb25kcy4KKyAgICBteSAoICRzZWMgKSA9IEBfOworICAgIG15ICggJGgsICRtLCAkcyApOworICAgICRoICAgPSBpbnQoICRzZWMgLyAzNjAwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkaCAqIDM2MDA7CisgICAgJG0gICA9IGludCggJHNlYyAvIDYwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkbSAqIDYwOworICAgICRzICAgPSBpbnQoICRzZWMgKTsKKyAgICAkc2VjID0gJHNlYyAtICRzOworICAgIHJldHVybiBzcHJpbnRmKCAiJTAyZDolMDJkOiUwMmQiLCAkaCwgJG0sICRzICk7Cit9OyAjIHN1YiBkc3RyCisKKyMgcnN0ciAtLSBSZXN1bHQgc3RyaW5nLgorc3ViIHJzdHIoJCkgeworICAgIG15ICggJHJjICkgPSBAXzsKKyAgICByZXR1cm4gKCAkcmMgPT0gMCA/ICIrKysgU3VjY2VzcyArKysiIDogIi0tLSBGYWlsdXJlIC0tLSIgKTsKK307ICMgc3ViIHJzdHIKKworc3ViIHNob3J0ZXIoJDskKSB7CisgICAgIyBSZXR1cm4gc2hvcnRlciB2YXJpYW50IG9mIHBhdGggLS0gZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLgorICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICBteSAkYWJzID0gYWJzX3BhdGgoICRwYXRoICk7CisgICAgbXkgJHJlbCA9IHJlbF9wYXRoKCAkcGF0aCwgJGJhc2UgKTsKKyAgICBpZiAoICRyZWwgZXEgIiIgKSB7CisgICAgICAgICRyZWwgPSAiLiI7CisgICAgfTsgIyBpZgorICAgICRwYXRoID0gKCBsZW5ndGgoICRyZWwgKSA8IGxlbmd0aCggJGFicyApID8gJHJlbCA6ICRhYnMgKTsKKyAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICRwYXRoID1+IHN7XFx9ey99ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRwYXRoOworfTsgIyBzdWIgc2hvcnRlcgorCitzdWIgdGVlKCQkKSB7CisKKyAgICBteSAoICRhY3Rpb24sICRmaWxlICkgPSBAXzsKKyAgICBteSAkcGlkID0gMDsKKworICAgIG15ICRzYXZlX3N0ZG91dCA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisgICAgbXkgJHNhdmVfc3RkZXJyID0gU3ltYm9sOjpnZW5zeW0oKTsKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZG91dCAtLS0KKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZG91dCBpbiAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggJHNhdmVfc3Rkb3V0LCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRvdXQgdG8gdGVlIG9yIHRvIGZpbGUuCisgICAgaWYgKCAkdG9vbHM6OnZlcmJvc2UgKSB7CisgICAgICAgICRwaWQgPSBvcGVuKCBTVERPVVQsICJ8IHRlZSAtYSBcIiRmaWxlXCIiICkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZSB0byBcInRlZVwiOiAkITsgc3RvcHBlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BlbiggU1RET1VULCAiPj4kZmlsZSIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBmaWxlIFwiJGZpbGVcIiBmb3Igd3JpdGluZzogJCE7IHN0b3BwZWQiOworICAgIH07ICMgaWYKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZGVyciBpbiAkc2F2ZV9zdGRlcnIuCisgICAgb3BlbiggJHNhdmVfc3RkZXJyLCAiPiYiIC4gU1RERVJSLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0LgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuIFNURE9VVC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBQZXJmb3JtIGFjdGlvbnMuCisgICAgJGFjdGlvbi0+KCk7CisKKyAgICAjIC0tLSByZXN0b3JlIHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBSZXN0b3JlIHN0ZGVyciBmcm9tICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCBTVERFUlIsICI+JiIgLiAkc2F2ZV9zdGRlcnItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIENsb3NlICRzYXZlX3N0ZGVyci4KKyAgICAkc2F2ZV9zdGRlcnItPmNsb3NlKCkgb3IgZGllICggIkNhbm5vdCBjbG9zZSBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3Rkb3V0IGZyb20gJHNhdmVfc3Rkb3V0LgorICAgIG9wZW4oIFNURE9VVCwgIj4mIiAuICRzYXZlX3N0ZG91dC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3Rkb3V0LgorICAgICRzYXZlX3N0ZG91dC0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBXYWl0IGZvciB0aGUgY2hpbGQgdGVlIHByb2Nlc3MsIG90aGVyd2lzZSBvdXRwdXQgb2YgbWFrZSBhbmQgYnVpbGQucGwgaW50ZXJsZWF2ZXMuCisgICAgaWYgKCAkcGlkICE9IDAgKSB7CisgICAgICAgIHdhaXRwaWQoICRwaWQsIDAgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHRlZQorCitzdWIgbG9nX2l0KCQkQCkgeworICAgIG15ICggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApID0gQF87CisgICAgbXkgJG1lc3NhZ2UgID0gc3ByaW50ZiggJGZvcm1hdCwgQGFyZ3MgKTsKKyAgICBteSAkcHJvZ3Jlc3MgPSBjYXRfZmlsZSggJHRtcCwgc3ByaW50ZiggIiVzLSVzLmxvZyIsICR0YXJnZXRfcGxhdGZvcm0sIFVuYW1lOjpob3N0X25hbWUoKSApICk7CisgICAgaWYgKCAkdGl0bGUgbmUgIiIgYW5kICRtZXNzYWdlIG5lICIiICkgeworICAgICAgICBteSAkbGluZSA9IHNwcmludGYoICIlLTE1cyA6ICVzXG4iLCAkdGl0bGUsICRtZXNzYWdlICk7CisgICAgICAgIGluZm8oICRsaW5lICk7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgdHN0cigpIC4gIjogIiAuICRsaW5lLCAtYXBwZW5kID0+IDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZV9maWxlKCAkcHJvZ3Jlc3MsICJcbiIsIC1hcHBlbmQgPT4gMSApOworICAgIH07ICMgaWYKK307ICMgc3ViIGxvZ19pdAorCitzdWIgcHJvZ3Jlc3MoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBsb2dfaXQoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKTsKK307ICMgc3ViIHByb2dyZXNzCisKK3N1YiBzdW1tYXJ5KCkgeworICAgIG15ICR0b3RhbCAgID0gQGpvYnM7CisgICAgbXkgJHN1Y2Nlc3MgPSAwOworICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgZm9yZWFjaCBteSAkam9iICggQGpvYnMgKSB7CisgICAgICAgIG15ICggJGJ1aWxkX2RpciwgJHJjICkgPSAoICRqb2ItPnsgYnVpbGRfZGlyIH0sICRqb2ItPnsgcmMgfSApOworICAgICAgICBwcm9ncmVzcyggcnN0ciggJHJjICksICIlcyIsICRidWlsZF9kaXIgKTsKKyAgICAgICAgaWYgKCAkcmMgPT0gMCApIHsKKyAgICAgICAgICAgICsrICRzdWNjZXNzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRqb2IKKyAgICBteSAkZmFpbHVyZSA9ICR0b3RhbCAtICRzdWNjZXNzOworICAgIHByb2dyZXNzKCAiU3VjY2Vzc2VzIiwgICAgICAiJTNkIG9mICUzZCIsICRzdWNjZXNzLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIkZhaWx1cmVzIiwgICAgICAgIiUzZCBvZiAlM2QiLCAkZmFpbHVyZSwgJHRvdGFsICk7CisgICAgcHJvZ3Jlc3MoICJUaW1lIGVsYXBzZWQiLCAgICIgICVzIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgcHJvZ3Jlc3MoICJPdmVyYWxsIHJlc3VsdCIsICIlcyIsIHJzdHIoICRmYWlsdXJlICkgKTsKKyAgICByZXR1cm4gJGZhaWx1cmU7Cit9OyAjIHN1YiBzdW1tYXJ5CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV29ya2VyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGluaXQoKSB7CisgICAgbWFrZV9kaXIoICR0bXAgKTsKK307ICMgc3ViIGluaXQKKworc3ViIGNsZWFuKEApIHsKKyAgICAjIENsZWFuIGRpcmVjdG9yaWVzLgorICAgIG15ICggQGRpcnMgKSA9IEBfOworICAgIG15ICRleGl0ID0gMDsKKyAgICAjIE1pbWlzYyBtYWtlZmlsZSAtLSBwcmludCBhIGNvbW1hbmQuCisgICAgcHJpbnQoICJybSAtZiAtciAiIC4gam9pbiggIiAiLCBtYXAoIHNob3J0ZXIoICRfICkgLiAiLyoiLCBAZGlycyApICkgLiAiXG4iICk7CisgICAgJGV4aXQgPQorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWyAkXlgsIGNhdF9maWxlKCAkRU5WeyBMSUJPTVBfV09SSyB9LCAidG9vbHMiLCAiY2xlYW4tZGlyLnBsIiApLCBAZGlycyBdLAorICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMSwKKyAgICAgICAgICAgICggJHRvb2xzOjp2ZXJib3NlID8gKCkgOiAoIC1zdGRvdXQgPT4gdW5kZWYsIC1zdGRlcnIgPT4gIiIgKSApLAorICAgICAgICApOworICAgIHJldHVybiAkZXhpdDsKK307ICMgc3ViIGNsZWFuCisKK3N1YiBtYWtlKCQkJCkgeworICAgICMgQ2hhbmdlIGRpciB0byBidWlsZCBvbmUgYW5kIHJ1biBtYWtlLgorICAgIG15ICggJGpvYiwgJGNsZWFuLCAkbWFya2VyICkgPSBAXzsKKyAgICBteSAkZGlyICAgICAgPSAkam9iLT57IGJ1aWxkX2RpciB9OworICAgIG15ICRtYWtlZmlsZSA9ICRqb2ItPnsgbWFrZWZpbGUgfTsKKyAgICBteSAkYXJncyAgICAgPSAkam9iLT57IG1ha2VfYXJncyB9OworICAgIG15ICRjd2QgICAgICA9IEN3ZDo6Y3dkKCk7CisgICAgbXkgJHdpZHRoICAgID0gLTEwOworCisgICAgbXkgJGV4aXQ7CisgICAgJGRpciA9IGNhdF9kaXIoICR0bXAsICRkaXIgKTsKKyAgICBtYWtlX2RpciggJGRpciApOworICAgIGNoYW5nZV9kaXIoICRkaXIgKTsKKworICAgIG15ICRhY3Rpb25zID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRzdGFydCA9IHRpbWUoKTsKKyAgICAgICAgICAgICRtYWtlZmlsZSA9IHNob3J0ZXIoICRtYWtlZmlsZSApOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlN0YXJ0ZWQiLCAgIHRzdHIoICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJvb3QgZGlyIiwgICRyb290ICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIkJ1aWxkIGRpciIsIHNob3J0ZXIoICRkaXIsICRyb290ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiTWFrZWZpbGUiLCAgJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIFVzZSBzaG9ydGVyIExJQk9NUF9XT1JLIHRvIGhhdmUgc2hvcnRlciBjb21tYW5kIGxpbmVzLgorICAgICAgICAgICAgICAgICMgTm90ZTogU29tZSB0b29scyBtYXkgbm90IHdvcmsgaWYgY3VycmVudCBkaXIgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2NhbCAkRU5WeyBMSUJPTVBfV09SSyB9ID0gc2hvcnRlciggJEVOVnsgTElCT01QX1dPUksgfSApOworICAgICAgICAgICAgICAgICRleGl0ID0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFrZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWYiLCAkbWFrZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyY2g9IiAuICR0YXJnZXRfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFya2VyPSRtYXJrZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAkYXJncworICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1pZ25vcmVfc3RhdHVzID0+IDEKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAoICRjbGVhbiBhbmQgJGV4aXQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgJGV4aXQgPSBjbGVhbiggJGRpciApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRmluaXNoZWQiLCB0c3RyKCAkZmluaXNoICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRWxhcHNlZCIsIGRzdHIoICRmaW5pc2ggLSAkc3RhcnQgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJSZXN1bHQiLCByc3RyKCAkZXhpdCApICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50KCAiXG4iICk7CisgICAgICAgIH07ICMgc3ViCisgICAgdGVlKCAkYWN0aW9ucywgImJ1aWxkLmxvZyIgKTsKKworICAgIGNoYW5nZV9kaXIoICRjd2QgKTsKKworICAgICMgU2F2ZSBjb21wbGV0ZWQgam9iIHRvIGJlIGFibGUgcHJpbnQgc3VtbWFyeSBsYXRlci4KKyAgICAkam9iLT57IHJjIH0gPSAkZXhpdDsKKyAgICBwdXNoKCBAam9icywgJGpvYiApOworCisgICAgcmV0dXJuICRleGl0OworCit9OyAjIHN1YiBtYWtlCisKKzE7CmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9saWIvTGliT01QLnBtIGIvcmMxL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEzNzFmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpAQCAtMCwwICsxLDg1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCitwYWNrYWdlIExpYk9NUDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIHRvb2xzOworCitzdWIgZW1wdHkoJCkgeworICAgIG15ICggJHZhciApID0gQF87CisgICAgcmV0dXJuIG5vdCBleGlzdHMoICRFTlZ7ICR2YXIgfSApIG9yIG5vdCBkZWZpbmVkKCAkRU5WeyAkdmFyIH0gKSBvciAkRU5WeyAkdmFyIH0gZXEgIiI7Cit9OyAjIHN1YiBlbXB0eQorCitteSAoICRiYXNlLCAkb3V0LCAkdG1wICk7CitpZiAoIGVtcHR5KCAiTElCT01QX1dPUksiICkgKSB7CisgICAgIyAkRmluZEJpbjo6QmluIGlzIG5vdCB1c2VkIGludGVudGlvbmFsbHkgYmVjYXVzZSBpdCBnaXZlcyByZWFsIHBhdGguIEkgd2FudCB0byB1c2UgYWJzb2x1dGUsCisgICAgIyBidXQgbm90IHJlYWwgb25lIChyZWFsIHBhdGggZG9lcyBub3QgY29udGFpbiBzeW1saW5rcyB3aGlsZSBhYnNvbHV0ZSBwYXRoIG1heSBjb250YWluCisgICAgIyBzeW1saW5rcykuCisgICAgJGJhc2UgPSBnZXRfZGlyKCBnZXRfZGlyKCBhYnNfcGF0aCggJDAgKSApICk7Cit9IGVsc2UgeworICAgICRiYXNlID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9XT1JLIH0gKTsKK307ICMgaWYKKworaWYgKCBlbXB0eSggIkxJQk9NUF9FWFBPUlRTIiApICkgeworICAgICRvdXQgPSBjYXRfZGlyKCAkYmFzZSwgImV4cG9ydHMiICk7Cit9IGVsc2UgeworICAgICRvdXQgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX0VYUE9SVFMgfSApOworfTsgIyBpZgorCitpZiAoIGVtcHR5KCAiTElCT01QX1RNUCIgKSApIHsKKyAgICAkdG1wID0gY2F0X2RpciggJGJhc2UsICJ0bXAiICk7Cit9IGVsc2UgeworICAgICR0bXAgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX1RNUCB9ICk7Cit9OyAjIGlmCisKKyRFTlZ7IExJQk9NUF9XT1JLICAgIH0gPSAkYmFzZTsKKyRFTlZ7IExJQk9NUF9FWFBPUlRTIH0gPSAkb3V0OworJEVOVnsgTElCT01QX1RNUCAgICAgfSA9ICR0bXA7CisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxMaWJPTVAucG0+IC0tCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIEZpbmRCaW47CisgICAgdXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworICAgIHVzZSBMaWJPTVA7CisKKyAgICAkRU5WeyBMSUJPTVBfV09SSyAgICB9CisgICAgJEVOVnsgTElCT01QX1RNUCAgICAgfQorICAgICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBtb2R1bGUgY2hlY2tzIEM8TElCT01QX1dPUks+LCBDPExJQk9NUF9FWFBPUlRTPiwgYW5kIEM8TElCT01QX1RNUD4gZW52aXJvbm1lbnRzIHZhcmlhYmxlcy4KK0lmIGEgdmFyaWFibGUgc2V0LCB0aGUgbW9kdWxlIG1ha2VzIHN1cmUgaXQgaXMgYWJzb2x1dGUuIElmIGEgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBtb2R1bGUKK3NldHMgaXQgdG8gZGVmYXVsdCB2YWx1ZS4KKworRGVmYXVsdCB2YWx1ZSBmb3IgQzxMSUJPTVBfRVhQT1JUUz4gaXMgQzwkTElCT01QX1dPUksvZXhwb3J0cz4sIGZvciBDPExJQk9NUF9UTVA+IC0tCitDPCRMSUJPTVBfV09SSy90bXA+LgorCitWYWx1ZSBmb3IgQzxMSUJPTVBfV09SSz4gaXMgZ3Vlc3NlZC4gVGhlIG1vZHVsZSBhc3N1bWVzIHRoZSBzY3JpcHQgKHdoaWNoIHVzZXMgdGhlIG1vZHVsZSkgaXMKK2xvY2F0ZWQgaW4gQzx0b29scy8+IGRpcmVjdG9yeSBvZiBsaWJvbXAgZGlyZWN0b3J5IHRyZWUsIGFuZCB1c2VzIHBhdGggb2YgdGhlIHNjcmlwdCB0byBjYWxjdWxhdGUKK0M8TElCT01QX1dPUks+LAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0gYi9yYzEvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzOTlmNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbQpAQCAtMCwwICsxLDM5NSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgdG8gYmUgdXNlZCBpbiBQZXJsIHNjcmlwdHMuCisjCisjIFRvIGdldCBoZWxwIGFib3V0IGV4cG9ydGVkIHZhcmlhYmxlcyBhbmQgc3Vicm91dGluZXMsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIworIyAgICAgcGVybGRvYyBQbGF0Zm9ybS5wbQorIworIyBvciBzZWUgUE9EIChQbGFpbiBPbGQgRG9jdW1lbnRhdGlvbikgaW1iZWRkZWQgdG8gdGhlIHNvdXJjZS4uLgorIworIworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitwYWNrYWdlIFBsYXRmb3JtOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgYmFzZSAiRXhwb3J0ZXIiOworCit1c2UgVW5hbWU7CisKK215IEB2YXJzOworCitCRUdJTiB7CisgICAgQHZhcnMgPSBxd3sgJGhvc3RfYXJjaCAkaG9zdF9vcyAkaG9zdF9wbGF0Zm9ybSAkdGFyZ2V0X2FyY2ggJHRhcmdldF9vcyAkdGFyZ2V0X3BsYXRmb3JtIH07Cit9CisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wMTQiOworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBxd3sgY2Fub25fYXJjaCBjYW5vbl9vcyBsZWdhbF9hcmNoIGFyY2hfb3B0IH0sIEB2YXJzICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0sIHZhcnMgPT4gXEB2YXJzICk7CisKKyMgQ2Fub25pemUgYXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoICRhcmNoID1+IG17XEFccyooPzozMnxJQS0/MzJ8SUEtPzMyIGFyY2hpdGVjdHVyZXxpWzM0NTZdODZ8eDg2KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMiI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86NDh8KD86aWEpPzMyZXxJbnRlbFxzKjY0fEludGVsXChSXClccyo2NHx4ODZbXy1dNjR8eDY0fEFNRDY0KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMmUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFybSg/OnY3XEQqKT9cen0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJhcm0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGFyY2ggPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGFyY2g7Cit9OyAjIHN1YiBjYW5vbl9hcmNoCisKK3sgICMgUmV0dXJuIGxlZ2FsIGFwcHJvdmVkIGFyY2hpdGVjdHVyZSBuYW1lLgorICAgIG15ICVsZWdhbCA9ICgKKyAgICAgICAgIjMyIiAgPT4gIklBLTMyIGFyY2hpdGVjdHVyZSIsCisgICAgICAgICIzMmUiID0+ICJJbnRlbChSKSA2NCIsCisgICAgICAgICJhcm0iID0+ICJBUk0iLAorICAgICk7CisKKyAgICBzdWIgbGVnYWxfYXJjaCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJGxlZ2FseyAkYXJjaCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkYXJjaDsKKyAgICB9OyAjIHN1YiBsZWdhbF9hcmNoCit9CisKK3sgICMgUmV0dXJuIGFyY2hpdGVjdHVyZSBuYW1lIHN1aXRhYmxlIGZvciBJbnRlbCBjb21waWxlciBzZXR1cCBzY3JpcHRzLgorICAgIG15ICVvcHRpb24gPSAoCisgICAgICAgICIzMiIgID0+ICJpYTMyIiwKKyAgICAgICAgIjMyZSIgPT4gImludGVsNjQiLAorICAgICAgICAiNjQiICA9PiAiaWE2NCIsCisgICAgICAgICJhcm0iID0+ICJhcm0iLAorICAgICk7CisKKyAgICBzdWIgYXJjaF9vcHQoJCkgeworICAgICAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICAgICAgJGFyY2ggPSBjYW5vbl9hcmNoKCAkYXJjaCApOworICAgICAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICRvcHRpb257ICRhcmNoIH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRhcmNoOworICAgIH07ICMgc3ViIGFyY2hfb3B0Cit9CisKKyMgQ2Fub25pemUgT1MgbmFtZS4KK3N1YiBjYW5vbl9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IEBfOworICAgIGlmICggZGVmaW5lZCggJG9zICkgKSB7CisgICAgICAgIGlmICggJG9zID1+IG17XEFccyooPzpMaW51eHxsaW58bClccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gImxpbiI7CisgICAgICAgIH0gZWxzaWYgKCAkb3MgPX4gbXtcQVxzKig/OmxyYilccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gImxyYiI7CisgICAgICAgIH0gZWxzaWYgKCAkb3MgPX4gbXtcQVxzKig/Ok1hYyg/OlxzKk9TKD86XHMqWCk/KT98bWFjfG18RGFyd2luKVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAibWFjIjsKKyAgICAgICAgfSBlbHNpZiAoICRvcyA9fiBte1xBXHMqKD86V2luKD86ZG93cyk/KD86KD86X3xccyopPyg/Ok5UfFhQfDk1fDk4fDIwMDMpKT98dylccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gIndpbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkb3MgPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgY2Fub25fb3MKKworbXkgKCAkX2hvc3Rfb3MsICRfaG9zdF9hcmNoLCAkX3RhcmdldF9vcywgJF90YXJnZXRfYXJjaCApOworCitzdWIgc2V0X3RhcmdldF9hcmNoKCQpIHsKKyAgICBteSAoICRhcmNoICkgPSBjYW5vbl9hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAkX3RhcmdldF9hcmNoICAgICAgID0gJGFyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkYXJjaDsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9hcmNoCisKK3N1YiBzZXRfdGFyZ2V0X29zKCQpIHsKKyAgICBteSAoICRvcyApID0gY2Fub25fb3MoICRfWyAwIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRvcyApICkgeworICAgICAgICAkX3RhcmdldF9vcyAgICAgICA9ICRvczsKKyAgICAgICAgJEVOVnsgTElCT01QX09TIH0gPSAkb3M7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBzZXRfdGFyZ2V0X29zCisKK3N1YiB0YXJnZXRfb3B0aW9ucygpIHsKKyAgICBteSBAb3B0aW9ucyA9ICgKKyAgICAgICAgInRhcmdldC1vc3xvcz1zIiA9PgorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBzZXRfdGFyZ2V0X29zKCAkX1sgMSBdICkgb3IKKyAgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtb3Mgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtYXJjaGl0ZWN0dXJlfHRhcmdlcnQtYXJjaHxhcmNoaXRlY3R1cmV8YXJjaD1zIiA9PgorICAgICAgICAgICBzdWIgeworICAgICAgICAgICAgICAgc2V0X3RhcmdldF9hcmNoKCAkX1sgMSBdICkgb3IKKyAgICAgICAgICAgICAgICAgICBkaWUgIkJhZCB2YWx1ZSBvZiAtLXRhcmdldC1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICApOworICAgIHJldHVybiBAb3B0aW9uczsKK307ICMgc3ViIHRhcmdldF9vcHRpb25zCisKKyMgRGV0ZWN0IGhvc3QgYXJjaC4KK3sKKyAgICBteSAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaTM4NiIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpYTY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYXJtIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYXJtIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIGhvc3QgaGFyZHdhcmUgcGxhdGZvcm06IFwiJGhhcmR3YXJlX3BsYXRmb3JtXCI7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30KKworIyBEZXRlY3QgaG9zdCBPUy4KK3sKKyAgICBteSAkb3BlcmF0aW5nX3N5c3RlbSA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtKCk7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiR05VL0xpbnV4IiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gImxpbiI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJGcmVlQlNEIiApIHsKKyAgICAgICAgIyBIb3N0IE9TIHJlc2VtYmxlcyBMaW51eC4KKyAgICAgICAgJF9ob3N0X29zID0gImxpbiI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJEYXJ3aW4iICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAibWFjIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIk1TIFdpbmRvd3MiICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAid2luIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbTogXCIkb3BlcmF0aW5nX3N5c3RlbVwiOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9CisKKyMgRGV0ZWN0IHRhcmdldCBhcmNoLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICkgKSB7CisgICAgIyBVc2UgYXJjaCBzcGVjaWZpZWQgaW4gTElCT01QX0FSQ0guCisgICAgJF90YXJnZXRfYXJjaCA9IGNhbm9uX2FyY2goICRFTlZ7IExJQk9NUF9BUkNIIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9hcmNoICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGluIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9BUkNIIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgaG9zdCBhcmNoaXRlY3R1cmUuCisgICAgJF90YXJnZXRfYXJjaCA9ICRfaG9zdF9hcmNoOworfTsgIyBpZgorJEVOVnsgTElCT01QX0FSQ0ggfSA9ICRfdGFyZ2V0X2FyY2g7CisKKyMgRGV0ZWN0IHRhcmdldCBPUy4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX09TIH0gKSApIHsKKyAgICAjIFVzZSBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TLgorICAgICRfdGFyZ2V0X29zID0gY2Fub25fb3MoICRFTlZ7IExJQk9NUF9PUyB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfb3MgKSApIHsKKyAgICAgICAgZGllICJVbmtub3duIE9TIHNwZWNpZmllZCBpbiBMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX09TIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgaG9zdCBPUy4KKyAgICAkX3RhcmdldF9vcyA9ICRfaG9zdF9vczsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9PUyB9ID0gJF90YXJnZXRfb3M7CisKK3VzZSB2YXJzIEB2YXJzOworCit0aWUoICRob3N0X2FyY2gsICAgICAgICJQbGF0Zm9ybTo6aG9zdF9hcmNoIiApOwordGllKCAkaG9zdF9vcywgICAgICAgICAiUGxhdGZvcm06Omhvc3Rfb3MiICk7Cit0aWUoICRob3N0X3BsYXRmb3JtLCAgICJQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybSIgKTsKK3RpZSggJHRhcmdldF9hcmNoLCAgICAgIlBsYXRmb3JtOjp0YXJnZXRfYXJjaCIgKTsKK3RpZSggJHRhcmdldF9vcywgICAgICAgIlBsYXRmb3JtOjp0YXJnZXRfb3MiICk7Cit0aWUoICR0YXJnZXRfcGxhdGZvcm0sICJQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtIiApOworCit7IHBhY2thZ2UgUGxhdGZvcm06OmJhc2U7CisKKyAgICB1c2UgQ2FycDsKKworICAgIHVzZSBUaWU6OlNjYWxhcjsKKyAgICB1c2UgYmFzZSAiVGllOjpTdGRTY2FsYXIiOworCisgICAgc3ViIFNUT1JFIHsKKyAgICAgICAgbXkgJHNlbGYgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgY3JvYWsoICJNb2RpZnlpbmcgXCQiIC4gcmVmKCAkc2VsZiApIC4gIiBpcyBub3QgYWxsb3dlZDsgc3RvcHBlZCIgKTsKKyAgICB9OyAjIHN1YiBTVE9SRQorCit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6YmFzZQorCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX2hvc3RfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfYXJjaAorCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3Rfb3M7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF9ob3N0X29zOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9vcworCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfcGxhdGZvcm07CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gIiR7X2hvc3Rfb3N9XyR7X2hvc3RfYXJjaH0iOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybQorCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfYXJjaAorCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9vczsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9vczsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9vcworCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybTsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAiJHtfdGFyZ2V0X29zfV8ke190YXJnZXRfYXJjaH0iOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtCisKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPFBsYXRmb3JtLnBtPiAtLSBGZXcgc3Vicm91dGluZXMgdG8gZ2V0IE9TLCBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIG5hbWUgaW4gZm9ybSBzdWl0YWJsZSBmb3IKK25hbWluZyBmaWxlcywgZGlyZWN0b3JpZXMsIG1hY3JvcywgZXRjLgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBQbGF0Zm9ybSAiOmFsbCI7CisgICAgdXNlIHRvb2xzOworCisgICAgbXkgJGFyY2ggICA9IGNhbm9uX2FyY2goICJlbTY0VCIgKTsgICAgICAgICMgUmV0dXJucyAiMzJlIi4KKyAgICBteSAkbGVnYWwgID0gbGVnYWxfYXJjaCggImVtNjR0IiApOyAgICAgICAgIyBSZXR1cm5zICJJbnRlbChSKSA2NCIuCisgICAgbXkgJG9wdGlvbiA9IGFyY2hfb3B0KCAiZW02NHQiICk7ICAgICAgICAgICMgUmV0dXJucyAiaW50ZWw2NCIuCisgICAgbXkgJG9zICAgICA9IGNhbm9uX29zKCAiV2luZG93cyBOVCIgKTsgICAgICMgUmV0dXJucyAid2luIi4KKworICAgIHByaW50KCAkaG9zdF9hcmNoLCAkaG9zdF9vcywgJGhvc3RfcGxhdGZvcm0gKTsKKyAgICBwcmludCggJHRhcmVndF9hcmNoLCAkdGFyZ2V0X29zLCAkdGFyZ2V0X3BsYXRmb3JtICk7CisKKyAgICB0b29sczo6Z2V0X29wdGlvbnMoCisgICAgICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICAgICAuLi4KKyAgICApOworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitFbnZpcm9ubWVudCB2YXJpYWJsZSBMSUJPTVBfT1Mgc3BlY2lmaWVzIHRhcmdldCBPUyB0byByZXBvcnQuIElmIExJQk9NUF9PUyBpZCBub3QgZGVmaW5lZCwKK3RoZSBzY3JpcHQgYXNzdW1lcyBob3N0IE9TIGlzIHRhcmdldCBPUy4KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX0FSQ0ggc3BlY2lmaWVzIHRhcmdldCBhcmNoaXRlY3R1cmUgdG8gcmVwb3J0LiBJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwKK3RoZSBzY3JpcHQgYXNzdW1lcyBob3N0IGFyY2hpdGVjdHVyZSBpcyB0YXJnZXQgb25lLgorCis9aGVhZDIgRnVuY3Rpb25zLgorCis9b3ZlcgorCis9aXRlbSBCPGNhbm9uX2FyY2goICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSB0byBjYW5vbml6ZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgbWFueSB2YXJpYW50cywgZm9yIGV4YW1wbGU6CitDPDMyZT4sIEM8SW50ZWw2ND4sIEM8SW50ZWwoUikgNjQ+LCBldGMuIFJldHVybmVkIHN0cmluZyBpcyBhIGNhbm9ub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lLAorb25lIG9mOiBDPDMyPiwgQzwzMmU+LCBDPDY0Piwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPGxlZ2FsX2FyY2goICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhcmNoaXRlY3R1cmUgbmFtZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHNhbWUgdmFyaWFudHMgYXMgQzxhcmNoX2Nhbm9uKCk+IGRvZXMuCitSZXR1cm5lZCBzdHJpbmcgaXMgYSBuYW1lIGFwcHJvdmVkIGJ5IEludGVsIExlZ2FsLCBvbmUgb2Y6IEM8SUEtMzIgYXJjaGl0ZWN0dXJlPiwgQzxJbnRlbChSKSA2ND4KK29yIEM8dW5kZWY+IGlmIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjxhcmNoX29wdCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFyY2hpdGVjdHVyZSBuYW1lLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgc2FtZSB2YXJpYW50cyBhcyBDPGFyY2hfY2Fub24oKT4gZG9lcy4KK1JldHVybmVkIHN0cmluZyBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBjb21waWxlciBzZXR1cCBzY3JpcHRzCisoZS4gZy4gQzxpY2N2YXJzLnNoPiksIG9uZSBvZjogQzxJQS0zMiBhcmNoaXRlY3R1cmU+LCBDPEludGVsKFIpIDY0PiBvciBDPHVuZGVmPiBpZiBpbnB1dCBzdHJpbmcgaXMgbm90CityZWNvZ25pemVkLgorCis9aXRlbSBCPGNhbm9uX29zKCAkb3MgKT4KKworSW5wdXQgc3RyaW5nIGlzIE9TIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOiBDPG1hYz4sIEM8T1MgWD4sIGV0Yy4gUmV0dXJuZWQgc3RyaW5nIGlzIGEgY2Fub25pemVkIE9TIG5hbWUsIG9uZSBvZjogQzxsaW4+LCBDPGxyYj4sCitDPG1hYz4sIEM8d2luPiwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPHRhcmdldF9vcHRpb25zKCk+CisKK1JldHVybnMgYXJyYXkgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQzx0b29sczo6Z2V0X29wdGlvbnMoKT4gdG8gbGV0IGEgc2NyaXB0IHJlY29nbml6ZQorQzwtLXRhcmdldC1hcmNoaXRlY3R1cmU9STxzdHI+PiBhbmQgQzwtLXRhcmdldC1vcz1JPHN0cj4+IG9wdGlvbnMuIFR5cGljYWwgdXNhZ2UgaXM6CisKKyAgICB1c2UgdG9vbHM7CisgICAgdXNlIFBsYXRmb3JtOworCisgICAgbXkgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKTsgICAgIyBHbG9iYWwgdmFyaWFibGVzLCBub3QgaW5pdGlhbGl6ZWQuCisKKyAgICAuLi4KKworICAgIGdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwgICMgTGV0IHNjcmlwdCByZWNvZ25pemUgLS10YXJnZXQtb3MgYW5kIC0tdGFyZ2V0LWFyY2ggb3B0aW9ucy4KKyAgICAgICAgLi4uCisgICAgKTsKKyAgICAjIEluaXRpYWxpemUgdmFyaWFibHMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUuCisgICAgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKSA9ICggUGxhdGZvcm06OnRhcmdldF9vcygpLCBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2goKSwgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSgpICk7CisKKz1iYWNrCisKKz1oZWFkMiBWYXJpYWJsZXMKKworPWl0ZW0gQjwkaG9zdF9hcmNoPgorCitDYW5vbml6ZWQgbmFtZSBvZiBob3N0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkaG9zdF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBPUy4KKworPWl0ZW0gQjwkaG9zdF9wbGF0Zm9ybT4KKworSG9zdCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9aXRlbSBCPCR0YXJnZXRfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkdGFyZ2V0X29zPgorCitDYW5vbml6ZWQgbmFtZSBvZiB0YXJnZXQgT1MuCisKKz1pdGVtIEI8JHRhcmdldF9wbGF0Zm9ybT4KKworVGFyZ2V0IHBsYXRmb3JtIG5hbWUgKGNvbmNhdGVuYXRlZCBjYW5vbml6ZWQgT1MgbmFtZSwgdW5kZXJzY29yZSwgYW5kIGNhbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSkuCisKKz1iYWNrCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbSBiL3JjMS9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjEyNTAxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtCkBAIC0wLDAgKzEsNjI3IEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgVW5hbWUucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGVtYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworcGFja2FnZSBVbmFtZTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSB3YXJuaW5nczo6cmVnaXN0ZXI7Cit1c2UgRXhwb3J0ZXI7CisKK3VzZSBQT1NJWDsKK3VzZSBGaWxlOjpHbG9iICI6Z2xvYiI7Cit1c2UgTmV0OjpEb21haW4gcXd7fTsKKworIyBGb2xsb3dpbmcgY29kZSBkb2VzIG5vdCB3b3JrIHdpdGggUGVybCA1LjYgb24gTGludXgqIE9TIGFuZCBXaW5kb3dzKiBPUzoKKyMKKyMgICAgIHVzZSBpZiAkXk8gZXEgImRhcndpbiIsIHRvb2xzID0+IHF3e307CisjCisjIFRoZSB3b3JrYXJvdW5kIGZvciBQZXJsIDUuNjoKKyMKK0JFR0lOIHsKKyAgICBpZiAoICReTyBlcSAiZGFyd2luIiBvciAkXk8gZXEgImxpbnV4IiApIHsKKwlyZXF1aXJlIHRvb2xzOworICAgICAgICBpbXBvcnQgdG9vbHM7CisgICAgfTsgIyBpZgorICAgIGlmICggJF5PIGVxICJNU1dpbjMyIiApIHsKKyAgICAgICAgcmVxdWlyZSBXaW4zMjsKKyAgICB9OyAjIGlmCit9OyAjIEJFR0lOCisKK215ICRtc3dpbiA9IHFye1xBKD86TVNXaW4zMnxXaW5kb3dzX05UKVx6fTsKKworbXkgQHBvc2l4ID0gcXd7IGtlcm5lbF9uYW1lIGZxZG4ga2VybmVsX3JlbGVhc2Uga2VybmVsX3ZlcnNpb24gbWFjaGluZSB9OworICAgICMgUHJvcGVydGllcyBzdXBwb3J0ZWQgYnkgUE9TSVg6OnVuYW1lKCkuCitteSBAbGludXggPQorICAgIHF3eyBwcm9jZXNzb3IgaGFyZHdhcmVfcGxhdGZvcm0gb3BlcmF0aW5nX3N5c3RlbSB9OworICAgICMgUHJvcGVydGllcyByZXBvcnRlZCBieSB1bmFtZSBpbiBMaW51eCogT1MuCitteSBAYmFzZSA9ICggQHBvc2l4LCBAbGludXggKTsKKyAgICAjIEJhc2UgcHJvcGVydGllcy4KK215IEBhdXggPQorICAgICgKKyAgICAgICAgcXd7IGhvc3RfbmFtZSBkb21haW5fbmFtZSB9LAorICAgICAgICBtYXAoICJvcGVyYXRpbmdfc3lzdGVtXyRfIiwgcXd7IG5hbWUgcmVsZWFzZSBjb2RlbmFtZSBkZXNjcmlwdGlvbiB9ICkKKyAgICApOworICAgICMgQXV4aWxpYXJ5IHByb3BlcnRpZXMuCitteSBAYWxsID0gKCBAYmFzZSwgQGF1eCApOworICAgICMgQWxsIHRoZSBwcm9wZXJ0aWVzLgorbXkgQG1ldGEgPSBxd3sgYmFzZV9uYW1lcyBhbGxfbmFtZXMgdmFsdWUgfTsKKyAgICAjIE1ldGEgZnVuY3Rpb25zLgorCitvdXIgJFZFUlNJT04gICAgID0gIjAuMDciOworb3VyIEBJU0EgICAgICAgICA9IHF3eyBFeHBvcnRlciB9Oworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBAYWxsLCBAbWV0YSApOworb3VyICVFWFBPUlRfVEFHUyA9CisgICAgKAorICAgICAgICBiYXNlID0+IFsgQGJhc2UgXSwKKyAgICAgICAgYWxsICA9PiBbIEBhbGwgIF0sCisgICAgICAgIG1ldGEgPT4gWyBAbWV0YSBdLAorICAgICk7CisKK215ICV2YWx1ZXM7CisgICAgIyBIYXNoIG9mIHZhbHVlcy4gU29tZSB2YWx1ZXMgYXJlIHN0cmluZ3MsIHNvbWUgbWF5IGJlIHJlZmVyZW5jZXMgdG8gY29kZSB3aGljaCBzaG91bGQgYmUKKyAgICAjIGV2YWx1YXRlZCB0byBnZXQgcmVhbCB2YWx1ZS4gVGhpcyB0cmljayBpcyBpbXBsZW1lbnRlZCBiZWNhdXNlIGNhbGwgdG8gTmV0OjpEb21haW46Omhvc3RmcWRuKCkKKyAgICAjIGlzIHJlbGF0aXZlbHkgc2xvdy4KKworIyBHZXQgdmFsdWVzIGZyb20gUE9TSVg6OnVuYW1lKCkuCitAdmFsdWVzeyBAcG9zaXggfSA9IFBPU0lYOjp1bmFtZSgpOworCisjIE9uIHNvbWUgc3lzdGVtcyBQT1NJWDo6dW5hbWUoKSByZXR1cm5zICJzaG9ydCIgbm9kZSBuYW1lICh3aXRob3V0IGRvbWFpbiBuYW1lKS4gVG8gYmUgY29uc2lzdGVudAorIyBvbiBhbGwgc3lzdGVtcywgd2Ugd2lsbCBnZXQgbm9kZSBuYW1lIGZyb20gYWx0ZXJuYXRpdmUgc291cmNlLgoraWYgKCAkXk8gPX4gbS9jeWd3aW4vaSApIHsKKyAgICAjIEZ1bmN0aW9uIGZyb20gTmV0OjpEb21haW4gbW9kdWxlIHdvcmtzIHdlbGwsIGJ1dCBvbiBDeWd3aW4gaXQgcHJpbnRzIHRvCisgICAgIyBzdGRlcnIgImRvbWFpbm5hbWU6IG5vdCBmb3VuZCIuIFNvIHdlIHdpbGwgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igbm93LgorICAgICR2YWx1ZXN7IGZxZG4gfSA9IGxjKCAkRU5WeyBDT01QVVRFUk5BTUUgfSAuICIuIiAuICRFTlZ7IFVTRVJETlNET01BSU4gfSApOworfSBlbHNlIHsKKyAgICAjIE9uIHN5c3RlbXMgb3RoZXIgdGhhbiBDeWd3aW4sIGxldCB1cyB1c2UgTmV0OjpEb21haW46Omhvc3RmcWRuKCksIGJ1dCBkbyBpdCBvbmx5IG5vZGUgbmFtZQorICAgICMgaXMgcmVhbGx5IHJlcXVlc3RlZC4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJGZxZG4gPSBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKTsgIyAiZnFkbiIgc3RhbmRzIGZvciAiZnVsbHkgcXVhbGlmaWVkIGRvYW1haW4gbmFtZSIuCisgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcyBQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0cyBkaWZmZXJlbnQgbmFtZXMuCisgICAgICAgICAgICAjIExldCB1cyBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhleSBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4gTmFtZXMgYXJlIGluc2lnbmlmaWNhbnRseQorICAgICAgICAgICAgIyBkaWZmZXJlbnQgaWYgUE9TSVg6OnVuYW1lKCkgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICRmcWRuIGVxIHN1YnN0ciggJGZxZG4sIDAsIGxlbmd0aCggJGZxZG4gKSApCisgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCggJGZxZG4gKSA9PSBsZW5ndGgoICRmcWRuICkKKyAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZnFkbiwgbGVuZ3RoKCAkZnFkbiApLCAxICkgZXEgIi4iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgIyBPay4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FybmluZ3M6Ondhcm5pZigKKyAgICAgICAgICAgICAgICAgICAgIlBPU0lYOjp1bmFtZSgpIGFuZCBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKSByZXBvcnRlZCBkaWZmZXJlbnQgbmFtZXM6ICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiJHZhbHVlc3sgZnFkbiB9XCIgYW5kIFwiJGZxZG5cIiByZXNwZWN0aXZlbHlcbiIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgcmV0dXJuICRmcWRuOworICAgICAgICB9OyAjIHN1YgorfTsgIyBpZgorCitpZiAoICReTyA9fiAkbXN3aW4gKSB7CisgICAgaWYgKAorICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSg/Ong4NnxbNTZdODYpXHp9CisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFQ1RVUkUgfSApIGFuZCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gZXEgIng4NiIKKyAgICAgICAgYW5kCisgICAgICAgIGV4aXN0cyggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9ICkKKyAgICApIHsKKyAgICAgICAgaWYgKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURVc2NDMyIH0gZXEgIkFNRDY0IiApIHsKKyAgICAgICAgICAgICR2YWx1ZXN7IG1hY2hpbmUgfSA9ICJ4ODZfNjQiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorfTsgIyBpZgorCisjIFNvbWUgdmFsdWVzIGFyZSBub3QgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCksIGxldCB1cyBjb21wdXRlIHRoZW0uCisKKyMgcHJvY2Vzc29yLgorJHZhbHVlc3sgcHJvY2Vzc29yIH0gPSAkdmFsdWVzeyBtYWNoaW5lIH07CisKKyMgaGFyZHdhcmVfcGxhdGZvcm0uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJF5PIGVxICJsaW51eCIgb3IgJF5PIGVxICJmcmVlYnNkIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSh4ODZfNjR8YW1kNjQpXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBYXJtdjdcRCpcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYXJtIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJkYXJ3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODYiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiaTM4NiIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPQorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBteSAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgIyBTb21lIE9TZXMgb24gSW50ZWwoUikgNjQgc3RpbGwgcmVwb3J0cyAiaTM4NiIgbWFjaGluZS4gVmVyaWZ5IGl0IGJ5IHVzaW5nCisgICAgICAgICAgICAgICAgIyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgJ3N5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjQnLiBPbiBJbnRlbChSKSA2NC1iaXQgc3lzdGVtcyB0aGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlID09IDE7IG9uIDMyLWJpdCBzeXN0ZW1zIHRoZSAnaHcub3B0aW9uYWwueDg2XzY0JyBwcm9wZXJ0eSBlaXRoZXIgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAjIG9yIHRoZSB2YWx1ZSA9PSAwLiBUaGUgcGF0aCB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluIGEgcGF0aCB0byBzeXNjdGwgd2hlbgorICAgICAgICAgICAgICAgICMgc3RhcnRlZCBieSBjcm9udGFiLgorICAgICAgICAgICAgICAgIG15ICRzeXNjdGwgPSAoIHdoaWNoKCAic3lzY3RsIiApIG9yICIvdXNyL3NiaW4vc3lzY3RsIiApOworICAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN5c2N0bC4uLiIgKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzeXNjdGwsICItbiIsICJody5vcHRpb25hbC54ODZfNjQiIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICBjaG9tcCggJG91dHB1dCApOworICAgICAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIiIG9yICIkb3V0cHV0IiBlcSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIxIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gIng4Nl82NCI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGllICJVbnN1cHBvcnRlZCB2YWx1ZSAoXCIkb3V0cHV0XCIpIHJldHVybmVkIGJ5IFwiJHN5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjRcIjsgc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIHJldHVybiAkcGxhdGZvcm07CisgICAgICAgICAgICB9OyAjIHN1YiB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKwkjIFNvbWUgT1MgWCogdmVyc2lvbnMgcmVwb3J0ICJ4ODZfNjQiLgorCSR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PID1+ICRtc3dpbiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKD86eDg2fFs1Nl04Nilcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImFtZDY0IiApIHsKKyAgICAgICAgIyBBY3RpdmVQZXJsIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgcmV0dXJucyAieDg2XzY0Iiwgd2hpbGUgQWN0aXZlUGVybCBmb3IgSW50ZWwoUikgNjQgcmV0dXJucyAiYW1kNjQiLgorICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiY3lnd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQgT1MgKFwiJF5PXCIpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBvcGVyYXRpbmdfc3lzdGVtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkxpbnV4IiApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiR05VL0xpbnV4IjsKKyAgICBteSAkcmVsZWFzZTsgICAgIyBOYW1lIG9mIGNob3NlbiAiKi1yZWxlYXNlIiBmaWxlLgorICAgIG15ICRidWxrOyAgICAgICAjIENvbnRlbnQgb2YgcmVsZWFzZSBmaWxlLgorICAgICMgT24gVWJ1bnR1LCBsc2ItcmVsZWFzZSBpcyBxdWl0ZSBpbmZvcm1hdGl2ZSwgZS4gZy46CisgICAgIyAgICAgRElTVFJJQl9JRD1VYnVudHUKKyAgICAjICAgICBESVNUUklCX1JFTEVBU0U9OS4wNAorICAgICMgICAgIERJU1RSSUJfQ09ERU5BTUU9amF1bnR5CisgICAgIyAgICAgRElTVFJJQl9ERVNDUklQVElPTj0iVWJ1bnR1IDkuMDQiCisgICAgIyBUcnkgbHNiLXJlbGVhc2UgZmlyc3QuIEJ1dCBvbiBzb21lIG9sZGVyIHN5c3RlbXMgbHNiLXJlbGVhc2UgaXMgbm90IGluZm9ybWF0aXZlLgorICAgICMgSXQgbWF5IGNvbnRhaW4ganVzdCBvbmUgbGluZToKKyAgICAjICAgICBMU0JfVkVSU0lPTj0iMS4zIgorICAgICRyZWxlYXNlID0gIi9ldGMvbHNiLXJlbGVhc2UiOworICAgIGlmICggLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRidWxrID0gIiI7CisgICAgfTsgIyBpZgorICAgIGlmICggJGJ1bGsgPX4gbXteRElTVFJJQl99ICkgeworICAgICAgICAjIE9rLCB0aGlzIGxzYi1yZWxlYXNlIGlzIGluZm9ybWF0aXZlLgorICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0lEXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfSUQ6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9SRUxFQVNFXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfUkVMRUFTRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0NPREVOQU1FXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfQ09ERU5BTUU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfREVTQ1JJUFRJT05ccyo9Ij9ccyooLio/KSI/XHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfREVTQ1JJUFRJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBPb3BzLiBsc2ItcmVsZWFzZSBpcyBtaXNzZWQgb3Igbm90IGluZm9ybWF0aXZlLiBUcnkgb3RoZXIgKi1yZWxlYXNlIGZpbGVzLgorICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL3N5c3RlbS1yZWxlYXNlIjsKKyAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7ICAgICMgVXNlIC9ldGMvc3lzdGVtLXJlbGVhc2UiIGlmIHN1Y2ggZmlsZSBleGlzdHMuCisgICAgICAgICAgICAjIE90aGVyd2lzZSB0cnkgb3RoZXIgIi9ldGMvKi1yZWxlYXNlIiBmaWxlcywgYnV0IGlnbm9yZSAiL2V0Yy9sc2ItcmVsZWFzZSIuCisgICAgICAgICAgICBteSBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9sc2ItcmVsZWFzZSIsIGJzZF9nbG9iKCAiL2V0Yy8qLXJlbGVhc2UiICkgKTsKKyAgICAgICAgICAgICMgT24gc29tZSBGZWRvcmEgc3lzdGVtcyB0aGVyZSBhcmUgdHdvIGZpbGVzOiBmZWRvcmEtcmVsZWFzZSBhbmQgcmVkaGF0LXJlbGVhc2UKKyAgICAgICAgICAgICMgd2l0aCBpZGVudGljYWwgY29udGVudC4gSWYgZmVkb3JhLXJlbGVhc2UgcHJlc2VudCwgaWdub3JlIHJlZGphdC1yZWxlYXNlLgorICAgICAgICAgICAgaWYgKCBncmVwKCAkXyBlcSAiL2V0Yy9mZWRvcmEtcmVsZWFzZSIsIEByZWxlYXNlcyApICkgeworICAgICAgICAgICAgICAgIEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL3JlZGhhdC1yZWxlYXNlIiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAxICkgeworICAgICAgICAgICAgICAgICRyZWxlYXNlID0gJHJlbGVhc2VzWyAwIF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICMgTm8gKi1yZWxlYXNlIGZpbGVzIGZvdW5kLCB0cnkgZGViaWFuX3ZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gIi9ldGMvZGViaWFuX3ZlcnNpb24iOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTm8gcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeToiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVsZWFzZSApICkgeworICAgICAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgICAgICAgICBpZiAoICRyZWxlYXNlID1+IG17c3lzdGVtfHJlZGhhdHxmZWRvcmF9ICkgeworICAgICAgICAgICAgICAgICMgUmVkIEhhdCBvciBGZWRvcmEuIFBhcnNlIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIHZhbHVlcyBvZiAqLXJlbGVhc2UgKG9uZSBvZik6CisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIgcmVsZWFzZSA1LjIgKFRpa2FuZ2EpCisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBBUyByZWxlYXNlIDMgKFRhcm9vbiBVcGRhdGUgNCkKKyAgICAgICAgICAgICAgICAjICAgICBGZWRvcmEgcmVsZWFzZSAxMCAoQ2FtYnJpZGdlKQorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XEEoLio/KVxzK3JlbGVhc2VccysoLio/KSg/OlxzK1woKC4qPykoPzpccytVcGRhdGVccysoLio/KSk/XCkpP1xzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICB9ICA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ICA9ICQyIC4gKCBkZWZpbmVkKCAkNCApID8gIi4kNCIgOiAiIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQzOworICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17U3VTRX0gKSB7CisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIFN1U0UtcmVsZWFzZToKKyAgICAgICAgICAgICAgICAjICAgICBTVVNFIExpbnV4KiBPUyBFbnRlcnByaXNlIFNlcnZlciAxMCAoeDg2XzY0KQorICAgICAgICAgICAgICAgICMgICAgIFZFUlNJT04gPSAxMAorICAgICAgICAgICAgICAgICMgICAgIFBBVENITEVWRUwgPSAyCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXteKC4qPylccyooXGQrKVxzKlwoLio/XClccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XlZFUlNJT05ccyo9XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIFZFUlNJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAgICAgICAgIGlmICggJGJ1bGsgPX4gbXteUEFUQ0hMRVZFTFxzKj1ccyooLiopXHMqJH1tICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAuPSAiLiQxIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtkZWJpYW5fdmVyc2lvbn0gKSB7CisgICAgICAgICAgICAgICAgIyBEZWJpYW4uIFRoZSBmaWxlIGRlYmlhbl92ZXJzaW9uIGNvbnRhaW5zIGp1c3QgdmVyc2lvbiBudW1iZXIsIG5vdGhpbmcgbW9yZToKKyAgICAgICAgICAgICAgICAjICAgICA0LjAKKyAgICAgICAgICAgICAgICBteSAkbmFtZSA9ICJEZWJpYW4iOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICR2ZXJzaW9uOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMiLCAkbmFtZSwgJHZlcnNpb24gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICJHTlUvTGludXgiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJEYXJ3aW4iICkgeworICAgIG15ICVjb2RlbmFtZXMgPSAoCisgICAgICAgIDEwLjQgPT4gIlRpZ2VyIiwKKyAgICAgICAgMTAuNSA9PiAiTGVvcGFyZCIsCisgICAgICAgIDEwLjYgPT4gIlNub3cgTGVvcGFyZCIsCisgICAgKTsKKyAgIG15ICRkYXJ3aW47CisgICBteSAkZ2V0X29zX2luZm8gPQorICAgICAgIHN1YiB7CisgICAgICAgICAgIG15ICggJG5hbWUgKSA9IEBfOworICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkICRkYXJ3aW4gKSB7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJEYXJ3aW4iOworICAgICAgICAgICAgICAgIyBzd192ZXJzIHByaW50cyBPUyBYKiB2ZXJzaW9uIHRvIHN0ZG91dDoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3ROYW1lOiAgICAgICBPUyBYKgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdFZlcnNpb246ICAgIDEwLjQuMTEKKyAgICAgICAgICAgICAgICMgICAgIEJ1aWxkVmVyc2lvbjogICAgICA4UzIxNjcKKyAgICAgICAgICAgICAgICMgSXQgZG9lcyBub3QgcHJpbnQgY29kZW5hbWUsIHNvIHdlIGNvZGUgT1MgWCogY29kZW5hbWVzIGhlcmUuCisgICAgICAgICAgICAgICBteSAkc3dfdmVycyA9IHdoaWNoKCAic3dfdmVycyIgKSB8fCAiL3Vzci9iaW4vc3dfdmVycyI7CisgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN3X3ZlcnMuLi4iICk7CisgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzd192ZXJzIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdE5hbWU6XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0TmFtZSBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkbmFtZSA9ICQxOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0VmVyc2lvbjpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3RWZXJzaW9uIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRyZWxlYXNlID0gJDE7CisgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyByZWxlYXNlIHJlcG9ydGVkIGFzICIxMC40LjExIiAoMyBjb21wb25lbnRlcyksIHNvbWV0aW1lcyBhcyAiMTAuNiIuCisgICAgICAgICAgICAgICAjIEhhbmRsZSBib3RoIHZhcmlhbnRzLgorICAgICAgICAgICAgICAgJHJlbGVhc2UgPX4gbXteKFxkKy5cZCspKD86XC5cZCspPyg/PVxzfCQpfQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDYW5ub3QgcGFyc2UgT1MgWCogdmVyc2lvbjogJHJlbGVhc2UiICk7CisgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgbXkgJGNvZGVuYW1lID0gKCAkY29kZW5hbWVzeyAkdmVyc2lvbiB9IG9yICJ1bmtub3duIiApOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHJlbGVhc2U7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICRjb2RlbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzICglcykiLCAkbmFtZSwgJHJlbGVhc2UsICRjb2RlbmFtZSApOworICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgIHJldHVybiAkZGFyd2luLT57ICRuYW1lIH07CisgICAgICAgfTsgIyBzdWIKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtICAgICAgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW0iICAgICAgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX25hbWUiICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIiAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUiICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIiApOyB9OworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQVdpbmRvd3NbIF9dTlRcen0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworICAgICMgbXkgQG9zX25hbWUgPSBXaW4zMjo6R2V0T1NOYW1lKCk7CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICRvc19uYW1lWyAwIF07CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3VwZGF0ZSAgfSA9ICRvc19uYW1lWyAxIF07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBQ1lHV0lOX05ULX0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUZyZWVCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJGcmVlQlNEIjsKK30gZWxzZSB7CisgICAgZGllICJVbnN1cHBvcnRlZCBrZXJuZWxfbmFtZSAoXCIkdmFsdWVzeyBrZXJuZWxfbmFtZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBob3N0X25hbWUgYW5kIGRvbWFpbl9uYW1lCiskdmFsdWVzeyBob3N0X25hbWUgfSA9CisgICAgc3ViIHsKKyAgICAgICAgbXkgJGZxZG4gPSB2YWx1ZSggImZxZG4iICk7CisgICAgICAgICRmcWRuID1+IG17XEEoW14uXSopKD86XC4oLiopKT9cen07CisgICAgICAgIG15ICRob3N0X25hbWUgPSAkMTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGhvc3RfbmFtZSApIG9yICRob3N0X25hbWUgZXEgIiIgKSB7CisgICAgICAgICAgICBkaWUgIlVuZXhwZWN0ZWQgZXJyb3I6IHVuZGVmaW5lZCBvciBlbXB0eSBob3N0IG5hbWU7IHN0b3BwZWQiOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkaG9zdF9uYW1lOworICAgIH07CiskdmFsdWVzeyBkb21haW5fbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGRvbWFpbl9uYW1lID0gJDI7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRkb21haW5fbmFtZSApIG9yICRkb21haW5fbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGRvbWFpbiBuYW1lOyBzdG9wcGVkIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGRvbWFpbl9uYW1lOworICAgIH07CisKKyMgUmVwbGFjZSB1bmRlZmluZWQgdmFsdWVzIHdpdGggInVua25vd24iLgorZm9yZWFjaCBteSAkbmFtZSAoIEBhbGwgKSB7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJHZhbHVlc3sgJG5hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyAkbmFtZSB9ID0gInVua25vd24iOworICAgIH07ICMgaWYKK307ICMgZm9yZWFjaCAkbmFtZQorCisjIEV4cG9ydCBmdW5jdGlvbnMgcmVwb3J0aW5nIHByb3BlcnRpZXMuCitmb3JlYWNoIG15ICRuYW1lICggQGFsbCApIHsKKyAgICBubyBzdHJpY3QgInJlZnMiOworICAgICokbmFtZSA9IHN1YiB7IHJldHVybiB2YWx1ZSggJG5hbWUgKTsgfTsKK307ICMgZm9yZWFjaCAkbmFtZQorCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiYXNlIG5hbWVzLgorc3ViIGJhc2VfbmFtZXMgeworICAgIHJldHVybiBAYmFzZTsKK307ICMgc3ViIGJhc2VfbmFtZXMKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYWxsIHRoZSBuYW1lcy4KK3N1YiBhbGxfbmFtZXMgeworICAgIHJldHVybiBAYWxsOworfTsgIyBzdWIgYWxsX25hbWVzCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIGJ5IHRoZSBzcGVjaWZpZWQgbmFtZS4KK3N1YiB2YWx1ZSgkKSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdCggQF8gKTsKKyAgICBpZiAoIHJlZiggJHZhbHVlc3sgJG5hbWUgfSApICkgeworICAgICAgICBteSAkdmFsdWUgPSAkdmFsdWVzeyAkbmFtZSB9LT4oKTsKKyAgICAgICAgJHZhbHVlc3sgJG5hbWUgfSA9ICR2YWx1ZTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICR2YWx1ZXN7ICRuYW1lIH07Cit9OyAjIHN1YiB2YWx1ZQorCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8VW5hbWUucG0+IC0tIEEgZmV3IHN1YnJvdXRpbmVzIHRvIGdldCBzeXN0ZW0gaW5mb3JtYXRpb24gdXN1YWxseSBwcm92aWRlZCBieQorQzwvYmluL3VuYW1lPiBhbmQgQzxQT1NJWDo6dW5hbWUoKT4uCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIFVuYW1lOworCisgICAgIyBCYXNlIHByb3BlcnR5IGZ1bmN0aW9ucy4KKyAgICAka2VybmVsX25hbWUgICAgICAgPSBVbmFtZTo6a2VybmVsX25hbWUoKTsKKyAgICAkZnFkbiAgICAgICAgICAgICAgPSBVbmFtZTo6ZnFkbigpOworICAgICRrZXJuZWxfcmVsZWFzZSAgICA9IFVuYW1lOjprZXJuZWxfcmVsZWFzZSgpOworICAgICRrZXJuZWxfdmVyc2lvbiAgICA9IFVuYW1lOjprZXJuZWxfdmVyc2lvbigpOworICAgICRtYWNoaW5lICAgICAgICAgICA9IFVuYW1lOjptYWNoaW5lKCk7CisgICAgJHByb2Nlc3NvciAgICAgICAgID0gVW5hbWU6OnByb2Nlc3NvcigpOworICAgICRoYXJkd2FyZV9wbGF0Zm9ybSA9IFVuYW1lOjpoYXJkd2FyZV9wbGF0Zm9ybSgpOworICAgICRvcGVyYXRpbmdfc3lzdGVtICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtKCk7CisKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0eSBmdW5jdGlvbnMuCisgICAgJGhvc3RfbmFtZSAgICAgICAgID0gVW5hbWU6Omhvc3RfbmFtZSgpOworICAgICRkb21haW5fbmFtZSAgICAgICA9IFVuYW1lOjpkb21haW5fbmFtZSgpOworICAgICRvc19uYW1lICAgICAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX25hbWUoKTsKKyAgICAkb3NfcmVsZWFzZSAgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlKCk7CisgICAgJG9zX2NvZGVuYW1lICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUoKTsKKyAgICAkb3NfZGVzY3JpcHRpb24gICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbigpOworCisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKyAgICBAYmFzZV9uYW1lcyAgPSBVbmFtZTo6YmFzZV9uYW1lcygpOworICAgIEBhbGxfbmFtZXMgICA9IFVuYW1lOjphbGxfbmFtZXMoKTsKKyAgICAka2VybmVsX25hbWUgPSBVbmFtZTo6dmFsdWUoICJrZXJuZWxfbmFtZSIgKTsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8VW5hbWUucG0+IHJlc2VtYmxlcyBmdW5jdGlvbmFsaXR5IGZvdW5kIGluIEM8UE9TSVg6OnVuYW1lKCk+IGZ1bmN0aW9uIG9yIGluIEM8dW5hbWU+IHByb2dyYW0uCitIb3dldmVyLCBib3RoIEM8UE9TSVg6OnVuYW1lKCk+IGFuZCBDPC9iaW4vdW5hbWU+IGhhdmUgc29tZSBkaXNhZHZhbnRhZ2VzOgorCis9b3ZlcgorCis9aXRlbSAqCisKK0M8dW5hbWU+IG1heSBiZSBub3QgYXZhaWxhYmxlIGluIHNvbWUgZW52aXJvbm1lbnRzLCBmb3IgZXhhbXBsZSwgaW4gV2luZG93cyogT1MKKyhDPHVuYW1lPiBtYXkgYmUgZm91bmQgaW4gc29tZSB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSBwYWNrYWdlcywgbGlrZSBNS1MgVG9vbGtpdCBvciBDeWd3aW4sIGJ1dCBpdCBpcworbm90IGEgcGFydCBvZiBPUykuCisKKz1pdGVtICoKKworVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHZlcnNpb25zIG9mIEM8dW5hbWU+LiBGb3IgZXhhbXBsZSwgQzx1bmFtZT4gb24gT1MgWCogZG9lcyBub3QKK3JlY29nbml6ZSBvcHRpb25zIEM8LWk+LCBDPC1vPiwgYW5kIGFueSBsb25nIG9wdGlvbnMuCisKKz1pdGVtICoKKworRGlmZmVyZW50IHZlcnNpb25zIG9mIEM8dW5hbWU+IG1heSByZXBvcnQgdGhlIHNhbWUgcHJvcGVydHkgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLAorQzx1bmFtZT4gb24gTGludXgqIE9TIHJlcG9ydHMgbWFjaGluZSBhcyBDPGk2ODY+LCB3aGlsZSBDPHVuYW1lPiBvbiBPUyBYKiByZXBvcnRzIHRoZSBzYW1lIG1hY2hpbmUgYXMKK0M8eDg2Pi4KKworPWl0ZW0gKgorCitDPFBPU0lYOjp1bmFtZSgpPiByZXR1cm5zIGxpc3Qgb2YgdmFsdWVzLiBJIGNhbm5vdCByZWNhbGwgd2hhdCBpcyB0aGUgZm91cnRoIGVsZW1lbnQgb2YgdGhlIGxpc3QuCisKKz1iYWNrCisKKz1oZWFkMiBCYXNlIEZ1bmN0aW9ucworCitCYXNlIHByb3BlcnR5IGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBhcyBDPHVuYW1lPiBwcm9ncmFtLgorCis9b3ZlcgorCis9aXRlbSBCPGtlcm5lbF9uYW1lKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCBuYW1lLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4KKworPWl0ZW0gQjxmcWRuKCk+CisKK1JldHVybnMgdGhlIEZRRE4sIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZS4gT24gc29tZSBzeXN0ZW1zIEM8UE9TSVg6OnVuYW1lKCk+IHJlcG9ydHMgc2hvcnQgbm9kZQorbmFtZSAod2l0aCBubyBkb21haW4gbmFtZSksIG9uIG90aGVycyBDPFBPU0lYOjp1bmFtZSgpPiByZXBvcnRzIGZ1bGwgbm9kZSBuYW1lLiBUaGlzCitmdW5jdGlvbiBzdHJpdmUgdG8gcmV0dXJuIEZRRE4gYWx3YXlzIChieSByZWZpbmluZyBDPFBPU0lYOjp1bmFtZSgpPiB3aXRoCitDPE5ldDo6RG9tYWluOjpob3N0ZnFkbigpPikuCisKKz1pdGVtIEI8a2VybmVsX3JlbGVhc2UoKT4KKworUmV0dXJucyB0aGUga2VybmVsIHJlbGVhc2Ugc3RyaW5nLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4gVXN1YWxseSB0aGUgc3RyaW5nIGNvbnNpc3RzIG9mCitzZXZlcmFsIG51bWJlcnMsIHNlcGFyYXRlZCBieSBkb3RzIGFuZCBkYXNoZXMsIGJ1dCBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgbm9uLW51bWVyaWMgc3Vic3RyaW5ncyBsaWtlCisic21wIi4KKworPWl0ZW0gQjxrZXJuZWxfdmVyc2lvbigpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgdmVyc2lvbiBzdHJpbmcsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LiBJdCBpcyBCPG5vdD4gc2V2ZXJhbAorZG90LXNlcGFyYXRlZCBudW1iZXJzIGJ1dCBtdWNoIGxvbmdlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUga2VybmVsLgorRm9yIGV4YW1wbGUsIG9uIExpbnV4KiBPUyBpdCBpbmNsdWRlcyBidWlsZCBkYXRlLgorSWYgeW91IGxvb2sgZm9yIHNvbWV0aGluZyBpZGVudGlmeWluZyB0aGUga2VybmVsLCBsb29rIGF0IEw8a2VybmVsX3JlbGVhc2U+LgorCis9aXRlbSBCPG1hY2hpbmUoKT4KKworUmV0dXJucyB0aGUgbWFjaGluZSBoYXJkd2FyZSBuYW1lLCBhcyByZXBvcnRlZCBieSBQT1NJWDo6dW5hbWUoKS4gTm90IHJlbGlhYmxlLiBEaWZmZXJlbnQgT1NlcyBtYXkKK3JlcG9ydCB0aGUgc2FtZSBtYWNoaW5lIGhhcmR3YXJlIG5hbWUgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLCBMaW51eCogT1MgcmVwb3J0cyBDPGk2ODY+LCB3aGlsZSBPUyBYKgorcmVwb3J0cyBDPHg4Nj4gb24gdGhlIHNhbWUgbWFjaGluZS4KKworPWl0ZW0gQjxwcm9jZXNzb3IoKT4KKworUmV0dXJucyB0aGUgcHJvY2Vzc29yIHR5cGUuIE5vdCByZWxpYWJsZS4gVXN1YWxseSB0aGUgc2FtZSBhcyBDPG1hY2hpbmU+LgorCis9aXRlbSBCPGhhcmR3YXJlX3BsYXRmb3JtKCk+CisKK09uZSBvZjogQzxpMzg2PiBvciBDPHg4Nl82ND4uCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbSgpPgorCitPbmUgb2Y6IEM8R05VL0xpbnV4PiwgQzxPUyBYKj4sIG9yIEM8TVMgV2luZG93cz4uCisKKz1iYWNrCisKKz1oZWFkMiBBdXhpbGlhcnkgRnVuY3Rpb25zCisKK0F1eGlsaWFyeSBmdW5jdGlvbnMgZXh0ZW5kcyBiYXNlIGZ1bmN0aW9ucyB3aXRoIGluZm9ybWF0aW9uIG5vdCByZXBvcnRlZCBieSBDPHVuYW1lPiBwcm9ncmFtLgorCitBdXhpbGlhcnkgZnVuY3Rpb25zIGNvbGxlY3QgaW5mb3JtYXRpb24gZnJvbSBkaWZmZXJlbnQgc291cmNlcy4gRm9yIGV4YW1wbGUsIG9uIE9TIFgqLCB0aGV5IG1heQorY2FsbCBDPHN3X3ZlcnM+IHByb2dyYW0gdG8gZmluZCBvdXQgT1MgcmVsZWFzZTsgb24gTGludXgqIE9TIHRoZXkgbWF5IHBhcnNlIEM8L2V0Yy9yZWRoYXQtcmVsZWFzZT4gZmlsZSwKK2V0Yy4KKworPW92ZXIKKworPWl0ZW0gQjxob3N0X25hbWUoKT4KKworUmV0dXJucyBob3N0IG5hbWUgKEZRRE4gd2l0aCBkcm9wcGVkIGRvbWFpbiBwYXJ0KS4KKworPWl0ZW0gQjxkb21haW5fbmFtZSgpPgorCitSZXR1cm5zIGRvbWFpbiBuYW1lIChGUUROIHdpdGggZHJvcHBlZCBob3N0IHBhcnQpLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fbmFtZT4KKworTmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9yIG5hbWUgb2YgTGludXgqIE9TIGRpc3RyaWJ1dGlvbiwgbGlrZSAiRmVkb3JhIiBvcgorIlJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgU2VydmVyIi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2U+CisKK1JlbGVhc2UgKHZlcnNpb24pIG9mIG9wZXJhdGluZyBzeXN0ZW0gb3IgTGludXgqIE9TIGRpc3RyaWJ1dGlvbi4gVXN1YWxseSBpdCBpcyBhIHNlcmllcyBvZgorZG90LXNlcGFyYXRlZCBudW1iZXJzLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWU+CisKK0NvZGVuYW1lIG9mIG9wZXJhdGluZyBzeXN0ZW0gcmVsZWFzZSBvciBMaW51eCogT1MgZGlzdHJpYnV0aW9uLiBGb3IgZXhhbXBsZSwgRmVkb3JhIDEwIGlzICJDYW1icmlkZ2UiCit3aGlsZSBPUyBYKiAxMC40IGlzICJUaWdlciIuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbj4KKworTG9uZ2VyIHN0cmluZy4gVXN1YWxseSBpdCBpbmNsdWRlcyBhbGwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvcGVydGluZyBtZW50aW9uZWQgYWJvdmUgLS0gbmFtZSwKK3JlbGVhc2UsIGNvZGVuYW1lIGluIHBhcmVudGhlc2VzLgorCis9YmFjaworCis9aGVhZDIgTWV0YSBGdW5jdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjxiYXNlX25hbWVzKCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlzdCBvZiBiYXNlIHByb3BlcnR5IG5hbWVzLgorCis9aXRlbSBCPGFsbF9uYW1lcygpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHByb3BlcnR5IG5hbWVzLgorCis9aXRlbSBCPHZhbHVlKD4gSTxuYW1lPiBCPCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHNwZWNpZmllZCBieSBJPG5hbWU+LgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgIHVzZSBVbmFtZTsKKworICAgIHByaW50KCBVbmFtZTo6c3RyaW5nKCksICJcbiIgKTsKKworICAgIGZvcmVhY2ggbXkgJG5hbWUgKCBVbmFtZTo6YWxsX25hbWVzKCkgKSB7CisgICAgICAgIHByaW50KCAiJG5hbWU9XCIiIC4gVW5hbWU6OnZhbHVlKCAkbmFtZSApIC4gIlwiXG4iICk7CisgICAgfTsgIyBmb3JlYWNoICRuYW1lCisKKz1oZWFkMSBTRUUgQUxTTworCitMPFBPU0lYOjp1bmFtZT4sIEw8dW5hbWU+LgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9saWIvdG9vbHMucG0gYi9yYzEvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbQpAQCAtMCwwICsxLDE5ODEgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIHRvIGJlIHVzZWQgaW4gb3RoZXIgc2NyaXB0cy4KKyMKKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgcGxlYXNlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIworIyAgICAgcGVybGRvYyB0b29scy5wbQorIworIyBvciBzZWUgUE9EIChQbGFpbiBPbGQgRG9jdW1lbnRhdGlvbikgaW1iZWRkZWQgdG8gdGhlIHNvdXJjZS4uLgorIworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCis9aGVhZDEgTkFNRQorCitCPHRvb2xzLnBtPiAtLSBBIGNvbGxlY3Rpb24gb2Ygc3Vicm91dGluZXMgd2hpY2ggYXJlIHdpZGVseSB1c2VkIGluIFBlcmwgc2NyaXB0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgRmluZEJpbjsKKyAgICB1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisgICAgdXNlIHRvb2xzOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxOb3RlOj4gQmVjYXVzZSB0aGlzIGNvbGxlY3Rpb24gaXMgc21hbGwgYW5kIGludGVuZGVkIGZvciB3aWRlbHkgdXNpbmcgaW4gcGFydGljdWxhciBwcm9qZWN0LAorYWxsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LgorCitCPE5vdGU6PiBJIGhhdmUgc29tZSBpZGVhcyBob3cgdG8gaW1wcm92ZSB0aGlzIGNvbGxlY3Rpb24sIGJ1dCBpdCBpcyBpbiBteSBsb25nLXRlcm0gcGxhbnMuCitDdXJyZW50IHNoYXBlIGlzIG5vdCBpZGVhbCwgYnV0IGdvb2QgZW5vdWdoIHRvIHVzZS4KKworPWN1dAorCitwYWNrYWdlIHRvb2xzOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdmFycyBxdyggQElTQSBARVhQT1JUIEBFWFBPUlRfT0sgJUVYUE9SVF9UQUdTICk7CityZXF1aXJlIEV4cG9ydGVyOworQElTQSA9IHF3KCBFeHBvcnRlciApOworCitteSBAdmFycyAgID0gcXcoICR0b29sICk7CitteSBAdXRpbHMgID0gcXcoIGNoZWNrX29wdHMgdmFsaWRhdGUgKTsKK215IEBvcHRzICAgPSBxdyggZ2V0X29wdGlvbnMgKTsKK215IEBwcmludCAgPSBxdyggZGVidWcgaW5mbyB3YXJuaW5nIGNtZGxpbmVfZXJyb3IgcnVudGltZV9lcnJvciBxdWVzdGlvbiApOworbXkgQG5hbWUgICA9IHF3KCBnZXRfdm9sIGdldF9kaXIgZ2V0X2ZpbGUgZ2V0X25hbWUgZ2V0X2V4dCBjYXRfZmlsZSBjYXRfZGlyICk7CitteSBAZmlsZSAgID0gcXcoIHdoaWNoIGFic19wYXRoIHJlbF9wYXRoIHJlYWxfcGF0aCBtYWtlX2RpciBjbGVhbl9kaXIgY29weV9kaXIgbW92ZV9kaXIgZGVsX2RpciBjaGFuZ2VfZGlyIGNvcHlfZmlsZSBtb3ZlX2ZpbGUgZGVsX2ZpbGUgKTsKK215IEBpbyAgICAgPSBxdyggcmVhZF9maWxlIHdyaXRlX2ZpbGUgKTsKK215IEBleGVjICAgPSBxdyggZXhlY3V0ZSBiYWNrdGlja3MgKTsKK215IEBzdHJpbmcgPSBxd3sgcGFkIH07CitARVhQT1JUID0gKCBAdXRpbHMsIEBvcHRzLCBAdmFycywgQHByaW50LCBAbmFtZSwgQGZpbGUsIEBpbywgQGV4ZWMsIEBzdHJpbmcgKTsKKwordXNlIFVOSVZFUlNBTCAgICAoKTsKKwordXNlIEZpbmRCaW47Cit1c2UgSU86OkhhbmRsZTsKK3VzZSBJTzo6RmlsZTsKK3VzZSBJTzo6RGlyOworIyBOb3QgYXZhaWxhYmxlIG9uIHNvbWUgbWFjaGluZXM6IHVzZSBJTzo6WmxpYjsKKwordXNlIEdldG9wdDo6TG9uZyAoKTsKK3VzZSBQb2Q6OlVzYWdlICAgKCk7Cit1c2UgQ2FycCAgICAgICAgICgpOwordXNlIEZpbGU6OkNvcHkgICAoKTsKK3VzZSBGaWxlOjpQYXRoICAgKCk7Cit1c2UgRmlsZTo6VGVtcCAgICgpOwordXNlIEZpbGU6OlNwZWMgICAoKTsKK3VzZSBQT1NJWCAgICAgICAgcXd7IDpmY250bF9oIDplcnJub19oIH07Cit1c2UgQ3dkICAgICAgICAgICgpOwordXNlIFN5bWJvbCAgICAgICAoKTsKKwordXNlIERhdGE6OkR1bXBlcjsKKwordXNlIHZhcnMgcXcoICR0b29sICR2ZXJib3NlICR0aW1lc3RhbXBzICk7CiskdG9vbCA9ICRGaW5kQmluOjpTY3JpcHQ7CisKK215IEB3YXJuaW5nID0gKCBzdWIge30sIFwmd2FybmluZywgXCZydW50aW1lX2Vycm9yICk7CisKKworc3ViIGNoZWNrX29wdHMoXCUkOyQpIHsKKworICAgIG15ICRvcHRzID0gc2hpZnQoIEBfICk7ICAjIFJlZmVyZW5zZSB0byBoYXNoIGNvbnRhaW5pbmcgcmVhbCBvcHRpb25zIGFuZCB0aGVpciB2YWx1ZXMuCisgICAgbXkgJGdvb2QgPSBzaGlmdCggQF8gKTsgICMgUmVmZXJlbmNlIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGtub3duIG9wdGlvbiBuYW1lcy4KKyAgICBteSAkbXNnICA9IHNoaWZ0KCBAXyApOyAgIyBPcHRpb25hbCAobm9uLW1hbmRhdG9yeSkgbWVzc2FnZS4KKworICAgIGlmICggbm90IGRlZmluZWQoICRtc2cgKSApIHsKKyAgICAgICAgJG1zZyA9ICJ1bmtub3duIG9wdGlvbihzKSBwYXNzZWQiOyAgICMgRGVmYXVsdCB2YWx1ZSBmb3IgJG1zZy4KKyAgICB9OyAjIGlmCisKKyAgICAjIEknbGwgdXNlIHRoZXNlIGhhc2hlcyBhcyBzZXRzIG9mIG9wdGlvbnMuCisgICAgbXkgJWdvb2QgPSBtYXAoICggJF8gPT4gMSApLCBAJGdvb2QgKTsgICAjICVnb29kIG5vdyBpcyBmaWxsZWQgd2l0aCBhbGwga25vd24gb3B0aW9ucy4KKyAgICBteSAlYmFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJWJhZCBpcyBlbXB0eS4KKworICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkb3B0cyApICkgeyAgICAgIyBGb3IgZWFjaCByZWFsIG9wdGlvbi4uLgorICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRnb29keyAkb3B0IH0gKSApIHsgIyBMb29rIGl0cyBuYW1lIGluIHRoZSBzZXQgb2Yga25vd24gb3B0aW9ucy4uLgorICAgICAgICAgICAgJGJhZHsgJG9wdCB9ID0gMTsgICAgICAgICAgICAgICAgIyBBZGQgdW5rbm93biBvcHRpb24gdG8gJWJhZCBzZXQuCisgICAgICAgICAgICBkZWxldGUoICRvcHRzLT57ICRvcHQgfSApOyAgICAgICAjIEFuZCBkZWxldGUgb3JpZ2luYWwgb3B0aW9uLgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvcHQKKyAgICBpZiAoICViYWQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgJWJhZCBzZXQgaXMgbm90IGVtcHR5Li4uCisgICAgICAgIG15IEBjYWxsZXIgPSBjYWxsZXIoIDEgKTsgICAgICAgICAgICAjIElzc3VlIGEgd2FybmluZy4KKyAgICAgICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDI7CisgICAgICAgIENhcnA6OmNsdWNrKCAkY2FsbGVyWyAzIF0gLiAiOiAiIC4gJG1zZyAuICI6ICIgLiBqb2luKCAiLCAiLCBzb3J0KCBrZXlzKCAlYmFkICkgKSApICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIDE7CisKK307ICMgc3ViIGNoZWNrX29wdHMKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1cnBvc2U6CisjICAgICBDaGVjayBzdWJyb3V0aW5lIGFyZ3VtZW50cy4KKyMgU3lub3BzaXM6CisjICAgICBteSAlb3B0cyA9IHZhbGlkYXRlKCBwYXJhbXMgPT4gXEBfLCBzcGVjID0+IHsgLi4uIH0sIGNhbGxlciA9PiBuICk7CisjIEFyZ3VtZW50czoKKyMgICAgIHBhcmFtcyAtLSBBIHJlZmVyZW5jZSB0byBzdWJyb3V0aW5lJ3MgYWN0dWFsIGFyZ3VtZW50cy4KKyMgICAgIHNwZWMgICAtLSBTcGVjaWZpY2F0aW9uIG9mIGV4cGVjdGVkIGFyZ3VtZW50cy4KKyMgICAgIGNhbGxlciAtLSAuLi4KKyMgUmV0dXJuIHZhbHVlOgorIyAgICAgQSBoYXNoIG9mIHZhbGlkYXRlZCBvcHRpb25zLgorIyBEZXNjcmlwdGlvbjoKKyMgICAgIEkgd291bGQgbGlrZSB0byB1c2UgUGFyYW1zOjpWYWxpZGF0ZSBtb2R1bGUsIGJ1dCBpdCBpcyBub3QgYSBwYXJ0IG9mIGRlZmF1bHQgUGVybAorIyAgICAgZGlzdHJpYnV0aW9uLCBzbyBJIGNhbm5vdCByZWx5IG9uIGl0LiBUaGlzIHN1YnJvdXRpbmUgcmVzZW1ibGVzIHRvIHNvbWUgZXh0ZW50IHRvCisjICAgICBQYXJhbXM6OlZhbGlkYXRlOjp2YWxpZGF0ZV93aXRoKCkuCisjICAgICBTcGVjaWZpY2F0aW9uIG9mIGV4cGVjdGVkIGFyZ3VtZW50czoKKyMgICAgICAgIHsgJG9wdCA9PiB7IHR5cGUgPT4gJHR5cGUsIGRlZmF1bHQgPT4gJGRlZmF1bHQgfSwgLi4uIH0KKyMgICAgICAgICRvcHQgICAgIC0tIFN0cmluZywgb3B0aW9uIG5hbWUuCisjICAgICAgICAkdHlwZSAgICAtLSBTdHJpbmcsIGV4cGVjdGVkIHR5cGUocykuIEFsbG93ZWQgdmFsdWVzIGFyZSAiU0NBTEFSIiwgIlVOREVGIiwgIkJPT0xFQU4iLAorIyAgICAgICAgICAgICAgICAgICAgIkFSUkFZUkVGIiwgIkhBU0hSRUYiLCAiQ09ERVJFRiIuIE11bHRpcGxlIHR5cGVzIG1heSBsaXN0ZWQgdXNpbmcgYmFyOgorIyAgICAgICAgICAgICAgICAgICAgIlNDQUxBUnxBUlJBWVJFRiIuIFRoZSB0eXBlIHN0cmluZyBpcyBjYXNlLWluc2Vuc2l0aXZlLgorIyAgICAgICAgJGRlZmF1bHQgLS0gRGVmYXVsdCB2YWx1ZSBmb3IgYW4gb3B0aW9uLiBXaWxsIGJlIHVzZWQgaWYgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3IKKyMgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyMKK3N1YiB2YWxpZGF0ZShAKSB7CisKKyAgICBteSAlb3B0cyA9IEBfOyAgICAjIFRlbXBvcmFyeSB1c2UgJW9wdHMgZm9yIHBhcmFtZXRlcnMgb2YgYHZhbGlkYXRlJyBzdWJyb3V0aW5lLgorICAgIG15ICRwYXJhbXMgPSAkb3B0c3sgcGFyYW1zIH07CisgICAgbXkgJGNhbGxlciA9ICggJG9wdHN7IGNhbGxlciB9IG9yIDAgKSArIDE7CisgICAgbXkgJHNwZWMgICA9ICRvcHRzeyBzcGVjIH07CisgICAgdW5kZWYoICVvcHRzICk7ICAgIyBPaywgQ2xlYW4gJW9wdHMsIG5vdyB3ZSB3aWxsIGNvbGxlY3QgcmVzdWx0IG9mIHRoZSBzdWJyb3V0aW5lLgorCisgICAgIyBGaW5kIG91dCBjYWxsZXIgcGFja2FnZSwgZmlsZW5hbWUsIGxpbmUsIGFuZCBzdWJyb3V0aW5lIG5hbWUuCisgICAgbXkgKCAkcGtnLCAkZmlsZSwgJGxpbmUsICRzdWJyICkgPSBjYWxsZXIoICRjYWxsZXIgKTsKKyAgICBteSBAZXJyb3JzOyAgICAjIFdlIHdpbGwgY29sbGVjdCBlcnJvcnMgaW4gYXJyYXkgbm90IHRvIHN0b3Agb24gdGhlIGZpcnN0IGZvdW5kIGVycm9yLgorICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiAoJCkgeworICAgICAgICAgICAgbXkgJG1zZyA9IHNoaWZ0KCBAXyApOworICAgICAgICAgICAgcHVzaCggQGVycm9ycywgIiRtc2cgYXQgJGZpbGUgbGluZSAkbGluZS5cbiIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgICMgQ2hlY2sgb3B0aW9ucy4KKyAgICB3aGlsZSAoIEAkcGFyYW1zICkgeworICAgICAgICAjIENoZWNrIG9wdGlvbiBuYW1lLgorICAgICAgICBteSAkb3B0ID0gc2hpZnQoIEAkcGFyYW1zICk7CisgICAgICAgIGlmICggbm90IGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9ICkgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIkludmFsaWQgb3B0aW9uIGAkb3B0JyIgKTsKKyAgICAgICAgICAgIHNoaWZ0KCBAJHBhcmFtcyApOyAjIFNraXAgdmFsdWUgb2YgdW5rbm93IG9wdGlvbi4KKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBDaGVjayBvcHRpb24gdmFsdWUgZXhpc3RzLgorICAgICAgICBpZiAoIG5vdCBAJHBhcmFtcyApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyBkb2VzIG5vdCBoYXZlIGEgdmFsdWUiICk7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgIG15ICR2YWwgPSBzaGlmdCggQCRwYXJhbXMgKTsKKyAgICAgICAgIyBDaGVjayBvcHRpb24gdmFsdWUgdHlwZS4KKyAgICAgICAgaWYgKCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyB0eXBlIH0gKSApIHsKKyAgICAgICAgICAgICMgVHlwZSBzcGVjaWZpY2F0aW9uIGV4aXN0cy4gQ2hlY2sgb3B0aW9uIHZhbHVlIHR5cGUuCisgICAgICAgICAgICBteSAkYWN0dWFsX3R5cGU7CisgICAgICAgICAgICBpZiAoIHJlZiggJHZhbCApIG5lICIiICkgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9IHJlZiggJHZhbCApIC4gIlJFRiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9ICggZGVmaW5lZCggJHZhbCApID8gIlNDQUxBUiIgOiAiVU5ERUYiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSBAd2FudGVkX3R5cGVzID0gc3BsaXQoIG17XHx9LCBsYyggJHNwZWMtPnsgJG9wdCB9LT57IHR5cGUgfSApICk7CisgICAgICAgICAgICBteSAkd2FudGVkX3R5cGVzID0gam9pbiggInwiLCBtYXAoICRfIGVxICJib29sZWFuIiA/ICJzY2FsYXJ8dW5kZWYiIDogcXVvdGVtZXRhKCAkXyApLCBAd2FudGVkX3R5cGVzICkgKTsKKyAgICAgICAgICAgIGlmICggJGFjdHVhbF90eXBlICF+IG17XEEoPzokd2FudGVkX3R5cGVzKVx6fWkgKSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gbGMoICRhY3R1YWxfdHlwZSApOworICAgICAgICAgICAgICAgICR3YW50ZWRfdHlwZXMgPSBsYyggam9pbiggIiBvciAiLCBtYXAoICJgJF8nIiwgQHdhbnRlZF90eXBlcyApICkgKTsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgdmFsdWUgdHlwZSBpcyBgJGFjdHVhbF90eXBlJyBidXQgZXhwZWN0ZWQgdG8gYmUgJHdhbnRlZF90eXBlcyIgKTsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgdmFsdWVzIH0gKSAgKSB7CisgICAgICAgICAgICBteSAkdmFsdWVzID0gJHNwZWMtPnsgJG9wdCB9LT57IHZhbHVlcyB9OworICAgICAgICAgICAgaWYgKCBub3QgZ3JlcCggJF8gZXEgJHZhbCwgQCR2YWx1ZXMgKSApIHsKKyAgICAgICAgICAgICAgICAkdmFsdWVzID0gam9pbiggIiwgIiwgbWFwKCAiYCRfJyIsIEAkdmFsdWVzICkgKTsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgdmFsdWUgaXMgYCR2YWwnIGJ1dCBleHBlY3RlZCB0byBiZSBvbmUgb2YgJHZhbHVlcyIgKTsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgICRvcHRzeyAkb3B0IH0gPSAkdmFsOworICAgIH07ICMgd2hpbGUKKworICAgICMgQXNzaWduIGRlZmF1bHQgdmFsdWVzLgorICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkc3BlYyApICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3B0c3sgJG9wdCB9ICkgYW5kIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IGRlZmF1bHQgfSApICkgeworICAgICAgICAgICAgJG9wdHN7ICRvcHQgfSA9ICRzcGVjLT57ICRvcHQgfS0+eyBkZWZhdWx0IH07CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJG9wdAorCisgICAgIyBJZiB3ZSBmb3VuZCBhbnkgZXJyb3JzLCByYWlzZSB0aGVtLgorICAgIGlmICggQGVycm9ycyApIHsKKyAgICAgICAgZGllIGpvaW4oICIiLCBAZXJyb3JzICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICVvcHRzOworCit9OyAjIHN1YiB2YWxpZGF0ZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgR2V0IG9wdGlvbiBoZWxwZXJzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBHZXQgb3B0aW9uIGhlbHBlcnMuCisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBnZXRfb3B0aW9ucworCitCPFN5bm9wc2lzOj4KKworICAgIGdldF9vcHRpb25zKCBAYXJndW1lbnRzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0l0IGlzIHZlcnkgc2ltcGxlIHdyYXBwZXIgYXJvdW5mIEdldG9wdDo6TG9uZzo6R2V0T3B0aW9ucy4gSXQgcGFzc2VzIGFsbCBhcmd1bWVudHMgdG8gR2V0T3B0aW9ucywKK2FuZCBhZGQgZGVmaW5pdGlvbnMgZm9yIHN0YW5kYXJkIGhlbHAgb3B0aW9uczogLS1oZWxwLCAtLWRvYywgLS12ZXJib3NlLCBhbmQgLS1xdWlldC4KK1doZW4gR2V0T3B0aW9ucyBmaW5paGVzLCB0aGlzIHN1YnJvdXRpbmUgY2hlY2tzIGV4aXQgY29kZSwgaWYgaXQgaXMgbm9uLXplcm8sIHN0YW5kYXJkIGVycm9yCittZXNzYWdlIGlzIGlzc3VlZCBhbmQgc2NyaXB0IHRlcm1pbmF0ZWQuCisKK0lmIC0tdmVyYm9zZSBvciAtLXF1aWV0IG9wdGlvbiBpcyBzcGVjaWZpZWQsIEM8dG9vbHMucG1fdmVyYm9zZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LgorSXQgaXMgdGhlIHdheSB0byBwcm9wYWdhdGUgdmVyYm9zZS9xdWlldCBtb2RlIHRvIGNhbGxlZSBQZXJsIHNjcmlwdHMuCisKKz1jdXQKKworc3ViIGdldF9vcHRpb25zIHsKKworICAgIEdldG9wdDo6TG9uZzo6Q29uZmlndXJlKCAibm9faWdub3JlX2Nhc2UiICk7CisgICAgR2V0b3B0OjpMb25nOjpHZXRPcHRpb25zKAorICAgICAgICAiaDB8dXNhZ2UiICAgICAgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDAgKTsgfSwKKyAgICAgICAgImgxfGh8aGVscCIgICAgICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAxICk7IH0sCisgICAgICAgICJoMnxkb2N8bWFudWFsIiAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMiApOyB9LAorICAgICAgICAidmVyc2lvbiIgICAgICAgICA9PiBzdWIgeyBwcmludCggIiR0b29sIHZlcnNpb24gJG1haW46OlZFUlNJT05cbiIgKTsgZXhpdCggMCApOyB9LAorICAgICAgICAidnx2ZXJib3NlIiAgICAgICA9PiBzdWIgeyArKyAkdmVyYm9zZTsgICAgICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiAgICB9ID0gJHZlcmJvc2U7ICAgIH0sCisgICAgICAgICJxdWlldCIgICAgICAgICAgID0+IHN1YiB7IC0tICR2ZXJib3NlOyAgICAgJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiICAgIH0gPSAkdmVyYm9zZTsgICAgfSwKKyAgICAgICAgIndpdGgtdGltZXN0YW1wcyIgPT4gc3ViIHsgJHRpbWVzdGFtcHMgPSAxOyAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSA9ICR0aW1lc3RhbXBzOyB9LAorICAgICAgICBAXywgIyBDYWxsZXIgYXJndW1ldHNhIGFyZSBhdCB0aGUgZW5kIHNvIGNhbGxlciBvcHRpb25zIG92ZXJyaWRlcyBzdGFuZGFyZC4KKyAgICApIG9yIGNtZGxpbmVfZXJyb3IoKTsKKworfTsgIyBzdWIgZ2V0X29wdGlvbnMKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUHJpbnQgdXRpbGl0aWVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1wb2QKKworPWhlYWQyIFByaW50IHV0aWxpdGllcy4KKworRWFjaCBvZiB0aGUgcHJpbnQgc3Vicm91dGluZXMgcHJlcGVuZHMgZWFjaCBsaW5lIG9mIGl0cyBvdXRwdXQgd2l0aCB0aGUgbmFtZSBvZiBjdXJyZW50IHNjcmlwdCBhbmQKK3RoZSB0eXBlIG9mIGluZm9ybWF0aW9uLCBmb3IgZXhhbXBsZToKKworICAgIGluZm8oICJXcml0aW5nIGZpbGUuLi4iICk7CisKK3dpbGwgcHJpbnQKKworICAgIDxzY3JpcHQ+OiAoaSk6IFdyaXRpbmcgZmlsZS4uLgorCit3aGlsZQorCisgICAgd2FybmluZyggIkZpbGUgZG9lcyBub3QgZXhpc3QhIiApOworCit3aWxsIHByaW50CisKKyAgICA8c2NyaXB0PjogKCEpOiBGaWxlIGRvZXMgbm90IGV4aXN0IQorCitIZXJlIGFyZSBleHBvcnRlZCBpdGVtczoKKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIF9mb3JtYXRfbWVzc2FnZSgkXEA7JCkgeworCisgICAgbXkgJHByZWZpeCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYXJncyAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRub19lb2wgID0gc2hpZnQoIEBfICk7ICAjIERvIG5vdCBhcHBlbmQgIlxuIiB0byB0aGUgbGFzdCBsaW5lLgorICAgIG15ICRtZXNzYWdlID0gIiI7CisKKyAgICBteSAkdHMgPSAiIjsKKyAgICBpZiAoICR0aW1lc3RhbXBzICkgeworICAgICAgICBteSAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSBnbXRpbWUoKTsKKyAgICAgICAgJG1vbnRoICs9IDE7CisgICAgICAgICR5ZWFyICArPSAxOTAwOworICAgICAgICAkdHMgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgVVRDOiAiLCAkeWVhciwgJG1vbnRoLCAkZGF5LCAkaG91ciwgJG1pbiwgJHNlYyApOworICAgIH07ICMgaWYKKyAgICBmb3IgbXkgJGkgKCAxIC4uIEAkYXJncyApIHsKKyAgICAgICAgbXkgQGxpbmVzID0gc3BsaXQoICJcbiIsICRhcmdzLT5bICRpIC0gMSBdICk7CisgICAgICAgIGZvciBteSAkaiAoIDEgLi4gQGxpbmVzICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkbGluZXNbICRqIC0gMSBdOworICAgICAgICAgICAgbXkgJGxhc3RfbGluZSA9ICggKCAkaSA9PSBAJGFyZ3MgKSBhbmQgKCAkaiA9PSBAbGluZXMgKSApOworICAgICAgICAgICAgbXkgJGVvbCA9ICggKCBzdWJzdHIoICRsaW5lLCAtMSApIGVxICJcbiIgKSBvciBkZWZpbmVkKCAkbm9fZW9sICkgPyAiIiA6ICJcbiIgKTsKKyAgICAgICAgICAgICRtZXNzYWdlIC49ICIkdHMkdG9vbDogKCRwcmVmaXgpICIgLiAkbGluZSAuICRlb2w7CisgICAgICAgIH07ICMgZm9yZWFjaCAkagorICAgIH07ICMgZm9yZWFjaCAkaQorICAgIHJldHVybiAkbWVzc2FnZTsKKworfTsgIyBzdWIgX2Zvcm1hdF9tZXNzYWdlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyAkdmVyYm9zZQorCitCPFN5bm9wc2lzOj4KKworICAgICR2ZXJib3NlCisKK0I8RGVzY3JpcHRpb246PgorCitQYWNrYWdlIHZhcmlhYmxlLiBJdCBkZXRlcm1pbmVzIHZlcmJvc2l0eSBsZXZlbCwgd2hpY2ggYWZmZWN0cyBDPHdhcm5pbmcoKT4sIEM8aW5mbygpPiwgYW5kCitDPGRlYnVnKCk+IHN1YnJvdXRuZXMgLgorCitUaGUgdmFyaWFibGUgZ2V0cyBpbml0aWFsIHZhbHVlIGZyb20gQzx0b29scy5wbV92ZXJib3NlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBpcyBleGlzdHMuCitJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHZhcmlhYmxlIGlzIHNldCB0byAyLgorCitJbml0aWFsIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyIGRpcmVjdGx5IG9yIGJ5IEM8Z2V0X29wdGlvbnM+IGZ1bmN0aW9uLgorCis9Y3V0CisKKyR2ZXJib3NlID0gZXhpc3RzKCAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgfSApID8gJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiIH0gOiAyOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgJHRpbWVzdGFtcHMKKworQjxTeW5vcHNpczo+CisKKyAgICAkdGltZXN0YW1wcworCitCPERlc2NyaXB0aW9uOj4KKworUGFja2FnZSB2YXJpYWJsZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIEM8ZGVidWcoKT4sIEM8aW5mbygpPiwgQzx3YXJuaW5nKCk+LCBDPHJ1bnRpbWVfZXJyb3IoKT4KK3N1YnJvdXRuZXMgcHJpbnQgdGltZXN0YW1wcyBvciBub3QuCisKK1RoZSB2YXJpYWJsZSBnZXRzIGluaXRpYWwgdmFsdWUgZnJvbSBDPHRvb2xzLnBtX3RpbWVzdGFtcHM+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIGV4aXN0cy4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdmFyaWFibGUgaXMgc2V0IHRvIGZhbHNlLgorCitJbml0aWFsIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyIGRpcmVjdGx5IG9yIGJ5IEM8Z2V0X29wdGlvbnMoKT4gZnVuY3Rpb24uCisKKz1jdXQKKworJHRpbWVzdGFtcHMgPSBleGlzdHMoICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9ICkgPyAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSA6IDA7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyBkZWJ1ZworCitCPFN5bm9wc2lzOj4KKworICAgIGRlYnVnKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDMgb3IgaGlnaGVyLCBwcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggIigjKSIKK3ByZWZpeC4KKworPWN1dAorCitzdWIgZGVidWcoQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAzICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggIiMiLCBAXyApICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAxOworCit9OyAjIHN1YiBkZWJ1ZworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgaW5mbworCitCPFN5bm9wc2lzOj4KKworICAgIGluZm8oIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMiBvciBoaWdoZXIsIHByaW50IGluZm9ybWF0aW9uIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAiKGkpIiBwcmVmaXguCisKKz1jdXQKKworc3ViIGluZm8oQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAyICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggImkiLCBAXyAgKSApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgaW5mbworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHdhcm5pbmcKKworQjxTeW5vcHNpczo+CisKKyAgICB3YXJuaW5nKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDEgb3IgaGlnaGVyLCBpc3N1ZSBhIHdhcm5pbmcsIHByZXBlbmRpbmcgaXQgd2l0aCAiKCEpIiBwcmVmaXguCisKKz1jdXQKKworc3ViIHdhcm5pbmcoQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAxICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIHdhcm4oIF9mb3JtYXRfbWVzc2FnZSggIiEiLCBAXyAgKSApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgd2FybmluZworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIGNtZGxpbmVfZXJyb3IKKworQjxTeW5vcHNpczo+CisKKyAgICBjbWRsaW5lX2Vycm9yKCBAbWVzc2FnZSApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCBlcnJvciBtZXNzYWdlIGFuZCBleGl0IHRoZSBwcm9ncmFtIHdpdGggc3RhdHVzIDIuCisKK1RoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGxhaW4gb24gY29tbWFuZCBsaW5lIGVycm9ycywgZS4gZy4gdW5rbm93bgorb3B0aW9ucywgaW52YWxpZCBhcmd1bWVudHMsIGV0Yy4KKworPWN1dAorCitzdWIgY21kbGluZV9lcnJvcig7JCkgeworCisgICAgbXkgJG1lc3NhZ2UgPSBzaGlmdCggQF8gKTsKKworICAgIGlmICggZGVmaW5lZCggJG1lc3NhZ2UgKSApIHsKKyAgICAgICAgaWYgKCBzdWJzdHIoICRtZXNzYWdlLCAtMSwgMSApIG5lICJcbiIgKSB7CisgICAgICAgICAgICAkbWVzc2FnZSAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgJG1lc3NhZ2UgPSAiIjsKKyAgICB9OyAjIGlmCisgICAgU1RET1VULT5mbHVzaCgpOworICAgIGRpZSAkbWVzc2FnZSAuICJUcnkgLS1oZWxwIG9wdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7CisKK307ICMgc3ViIGNtZGxpbmVfZXJyb3IKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBydW50aW1lX2Vycm9yCisKK0I8U3lub3BzaXM6PgorCisgICAgcnVudGltZV9lcnJvciggQG1lc3NhZ2UgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgdGhlIHByb2dyYW0gd2l0aCBzdGF0dXMgMy4KKworVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wbGFpbiBvbiBydW50aW1lIGVycm9ycywgZS4gZy4KK2RpcmVjdG9yaWVzIHdoaWNoIGFyZSBub3QgZm91bmQsIG5vbi13cml0YWJsZSBmaWxlcywgZXRjLgorCis9Y3V0CisKK3N1YiBydW50aW1lX2Vycm9yKEApIHsKKworICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICBkaWUgX2Zvcm1hdF9tZXNzYWdlKCAieCIsIEBfICk7CisKK307ICMgc3ViIHJ1bnRpbWVfZXJyb3IKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBxdWVzdGlvbgorCitCPFN5bm9wc2lzOj4KKworICAgIHF1ZXN0aW9uKCAkcHJvbXB0OyAkYW5zd2VyLCAkY2hvaWNlcyAgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgJHByb21wIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAicXVlc3Rpb246IiBwcmVmaXguIFJlYWQgYSBsaW5lIGZyb20gc3RkaW4sIGNob3AKKyJcbiIgZnJvbSB0aGUgZW5kLCBpdCBpcyBhbnN3ZXIuCisKK0lmICRhbnN3ZXIgaXMgZGVmaW5lZCwgaXQgaXMgdHJlYXRlZCBhcyBmaXJzdCB1c2VyIGlucHV0LgorCitJZiAkY2hvaWNlcyBpcyBzcGVjaWZpZWQsIGl0IGNvdWxkIGJlIGEgcmVnZXhwIGZvciB2YWxpZGF0aW5nIHVzZXIgaW5wdXQsIG9yIGEgc3RyaW5nLiBJbiBsYXR0ZXIKK2Nhc2UgaXQgaW50ZXJwcmV0ZWQgYXMgbGlzdCBvZiBjaGFyYWN0ZXJzLCBhY2NlcHRhYmxlIChjYXNlLWluc2Vuc2l0aXZlKSBjaG9pY2VzLiBJZiB1c2VyIGVudGVycworbm9uLWFjY2VwdGFibGUgYW5zd2VyLCBxdWVzdGlvbiBjb250aW51ZSBhc2tpbmcgdW50aWwgYW5zd2VyIGlzIGFjY2VwdGFibGUuCitJZiAkY2hvaWNlcyBpcyBub3Qgc3BlY2lmaWVkLCBhbnkgYW5zd2VyIGlzIGFjY2VwdGFibGUuCisKK0luIGNhc2Ugb2YgZW5kLW9mLWZpbGUgKG9yIEN0cmwrRCBwcmVzc2VkIGJ5IHVzZXIpLCAkYW5zd2VyIGlzIEM8dW5kZWY+LgorCitCPEV4YW1wbGVzOj4KKworICAgIG15ICRhbnN3ZXI7CisgICAgcXVlc3Rpb24oICJTYXZlIGZpbGUgW3luXT8gIiwgJGFuc3dlciwgInluIiApOworICAgICAgICAjIFdlIGFjY2VwdHMgb25seSAieSIsICJZIiwgIm4iLCBvciAiTiIuCisgICAgcXVlc3Rpb24oICJQcmVzcyBlbnRlciB0byBjb250aW51ZSBvciBDdHJsK0MgdG8gYWJvcnQuLi4iICk7CisgICAgICAgICMgV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGFuc3dlciB2YWx1ZSAtLSBpbiBjYXNlIG9mIEN0cmwrQyB0aGUgc2NyaXB0IHdpbGwgYmUgdGVybWluYXRlZCwKKyAgICAgICAgIyBvdGhlcndpc2Ugd2UgY29udGludWUgZXhlY3V0aW9uLgorICAgIHF1ZXN0aW9uKCAiRmlsZSBuYW1lPyAiLCAkYW5zd2VyICk7CisgICAgICAgICMgQW55IGFuc3dlciBpcyBhY2NlcHRhYmxlLgorCis9Y3V0CisKK3N1YiBxdWVzdGlvbigkO1wkJCkgeworCisgICAgbXkgJHByb21wdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYW5zd2VyICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRjaG9pY2VzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGEgICAgICAgPSAoIGRlZmluZWQoICRhbnN3ZXIgKSA/ICQkYW5zd2VyIDogdW5kZWYgKTsKKworICAgIGlmICggcmVmKCAkY2hvaWNlcyApIGVxICJSZWdleHAiICkgeworICAgICAgICAjIEl0IGlzIGFscmVhZHkgYSByZWd1bGFyIGV4cHJlc3Npb24sIGRvIG5vdGhpbmcuCisgICAgfSBlbHNpZiAoIGRlZmluZWQoICRjaG9pY2VzICkgKSB7CisgICAgICAgICMgQ29udmVydCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgICRjaG9pY2VzID0gcXIvW0B7IFsgcXVvdGVtZXRhKCAkY2hvaWNlcyApIF0gfV0vaTsKKyAgICB9OyAjIGlmCisKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggIj8iLCBAeyBbICRwcm9tcHQgXSB9LCAibm9fZW9sIiApICk7CisgICAgICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYSApICkgeworICAgICAgICAgICAgU1RET1VULT5wcmludCggJGEgLiAiXG4iICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkYSA9IDxTVERJTj47CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGEgKSApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgY2hvbXAoICRhICk7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRjaG9pY2VzICkgb3IgKCAkYSA9fiBtL14kY2hvaWNlcyQvICkgKSB7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICRhID0gdW5kZWY7CisgICAgfTsgIyBmb3JldmVyCisgICAgaWYgKCBkZWZpbmVkKCAkYW5zd2VyICkgKSB7CisgICAgICAgICQkYW5zd2VyID0gJGE7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBxdWVzdGlvbgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBSZXR1cm5zIHZvbHVtZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X3ZvbCgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggJHZvbCwgdW5kZWYsIHVuZGVmICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgcmV0dXJuICR2b2w7CisKK307ICMgc3ViIGdldF92b2wKKworIyBSZXR1cm5zIGRpcmVjdG9yeSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2RpcigkKSB7CisKKyAgICBteSAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggc2hpZnQoIEBfICkgKTsKKyAgICBteSAoICR2b2wsICRkaXIsIHVuZGVmICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgbXkgQGRpcnMgPSBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpciApOworICAgIHBvcCggQGRpcnMgKTsKKyAgICAkZGlyID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRkaXIgPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyLCB1bmRlZiApOworICAgIHJldHVybiAkZGlyOworCit9OyAjIHN1YiBnZXRfZGlyCisKKyMgUmV0dXJucyBmaWxlIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZmlsZSgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHJldHVybiAkZmlsZTsKKworfTsgIyBzdWIgZ2V0X2ZpbGUKKworIyBSZXR1cm5zIGZpbGUgcGFydCBvZiBwYXRoIHdpdGhvdXQgbGFzdCBzdWZmaXguCitzdWIgZ2V0X25hbWUoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICAkZmlsZSA9fiBze1wuW14uXSpcen17fTsKKyAgICByZXR1cm4gJGZpbGU7CisKK307ICMgc3ViIGdldF9uYW1lCisKKyMgUmV0dXJucyBsYXN0IHN1ZmZpeCBvZiBmaWxlIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZXh0KCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgbXkgJGV4dCA9ICIiOworICAgIGlmICggJGZpbGUgPX4gbXsoXC5bXi5dKilcen0gKSB7CisgICAgICAgICRleHQgPSAkMTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRleHQ7CisKK307ICMgc3ViIGdldF9leHQKKworc3ViIGNhdF9maWxlKEApIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGZpbGUgPSBwb3AoIEBfICk7CisgICAgbXkgQGRpcnMgPSBAXzsKKworICAgIG15ICggJHZvbCwgJGRpcnMgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICJub19maWxlIiApOworICAgIEBkaXJzID0gKCBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpcnMgKSwgQGRpcnMgKTsKKyAgICAkZGlycyA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXJzLCAkZmlsZSApOworCisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBjYXRfZmlsZQorCitzdWIgY2F0X2RpcihAKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15IEBkaXJzID0gQF87CisKKyAgICBteSAoICR2b2wsICRkaXJzICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoLCAibm9fZmlsZSIgKTsKKyAgICBAZGlycyA9ICggRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICksIEBkaXJzICk7CisgICAgJGRpcnMgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlycywgIiIgKTsKKworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgY2F0X2RpcgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRmlsZSBhbmQgZGlyZWN0b3J5IG1hbmlwdWxhdGlvbiBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRmlsZSBhbmQgZGlyZWN0b3J5IG1hbmlwdWxhdGlvbiBzdWJyb3V0aW5lcy4KKworPW92ZXIKKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzx3aGljaCggJGZpbGUsIEBvcHRpb25zICk+CisKK1NlYXJjaGVzIGZvciBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlIGluIHRoZSAoc3BlY2lmaWVkKSBkaXJlY3Rvcmllcy4KK1JhaXNlcyBhIHJ1bnRpbWUgZXJvcm9yIGlmIG5vIGV4ZWN1dGFibGUgZmlsZSBmb3VuZC4gUmV0dXJucyBhIGZ1bGwgcGF0aCBvZiBmb3VuZCBleGVjdXRhYmxlKHMpLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1hbGw+ID1FPGd0PiBJPGJvb2w+CisKK0RvIG5vdCBzdG9wIG9uIHRoZSBmaXJzdCBmb3VuZCBmaWxlLiBOb3RlLCB0aGF0IGxpc3Qgb2YgZnVsbCBwYXRocyBpcyByZXR1cm5lZCBpbiB0aGlzIGNhc2UuCisKKz1pdGVtIEM8LWRpcnM+ID1FPGd0PiBJPHJlZl90b19hcnJheT4KKworU3BlY2lmeSBkaXJlY3RvcnkgbGlzdCB0byBzZWFyY2ggdGhyb3VnaC4gSWYgb3B0aW9uIGlzIG5vdCBwYXNzZWQsIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUKK2lzIHVzZWQgZm9yIGRpcmVjdG9yeSBsaXN0LgorCis9aXRlbSBDPC1leGVjPiA9RTxndD4gSTxib29sPgorCitXaGV0aGVyIGNoZWNrIGZvciBleGVjdXRhYmxlIGZpbGVzIG9yIG5vdC4gQnkgZGVmYXVsdCwgQzx3aGljaD4gc2VhcmNoZXMgZXhlY3V0YWJsZSBmaWxlcy4KK0hvd2V2ZXIsIG9uIEN5Z3dpbiBleGVjdXRhYmxlIGNoZWNrIG5ldmVyIHBlcmZvcm1lZC4KKworPWJhY2sKKworRXhhbXBsZXM6CisKK0xvb2sgZm9yICJlY2hvIiBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIFBBVEg6CisKKyAgICBteSAkZWNobyA9IHdoaWNoKCAiZWNobyIgKTsKKworTG9vayBmb3IgYWxsIG9jY3VyZW5zZXMgb2YgImNwIiBpbiB0aGUgUEFUSDoKKworICAgIG15IEBjcHMgPSB3aGljaCggImNwIiwgLWFsbCA9PiAxICk7CisKK0xvb2sgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICJpY2MiIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXM6CisKKyAgICBteSAkaWNjID0gd2hpY2goICJpY2MiLCAtZGlycyA9PiBbICIuIiwgIi91c3IvbG9jYWwvYmluIiwgIi91c3IvYmluIiwgIi9iaW4iIF0gKTsKKworTG9vayBmb3IgdGhlIHRoZSBDPG9tcF9saWIuZj4gZmlsZToKKworICAgIG15IEBvbXBfbGliID0gd2hpY2goICJvbXBfbGliLmYiLCAtYWxsID0+IDEsIC1leGVjID0+IDAsIC1kaXJzID0+IFsgQGluY2x1ZGUgXSApOworCis9Y3V0CisKK3N1YiB3aGljaCgkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1hbGwgLWRpcnMgLWV4ZWMgKSBdICk7CisgICAgaWYgKCAkb3B0c3sgLWFsbCB9IGFuZCBub3Qgd2FudGFycmF5KCkgKSB7CisgICAgICAgIGxvY2FsICRDYXJwOjpDYXJwTGV2ZWwgPSAxOworICAgICAgICBDYXJwOjpjbHVjayggImAtYWxsJyBvcHRpb24gcGFzc2VkIHRvIGB3aGljaCcgYnV0IGxpc3QgaXMgbm90IGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3B0c3sgLWV4ZWMgfSApICkgeworICAgICAgICAkb3B0c3sgLWV4ZWMgfSA9IDE7CisgICAgfTsgIyBpZgorCisgICAgbXkgJGRpcnMgPSAoIGV4aXN0cyggJG9wdHN7IC1kaXJzIH0gKSA/ICRvcHRzeyAtZGlycyB9IDogWyBGaWxlOjpTcGVjLT5wYXRoKCkgXSApOworICAgIG15IEBmb3VuZDsKKworICAgIG15IEBleHRzID0gKCAiIiApOworICAgIGlmICggJF5PIGVxICJNU1dpbjMyIiBhbmQgJG9wdHN7IC1leGVjIH0gKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJEVOVnsgUEFUSEVYVCB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAZXh0cywgc3BsaXQoICI7IiwgJEVOVnsgUEFUSEVYVCB9ICkgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICMgSWYgUEFUSEVYVCBkb2VzIG5vdCBleGlzdCwgdXNlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICBwdXNoKCBAZXh0cywgcXd7IC5DT00gLkVYRSAuQkFUIC5DTUQgfSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgbG9vcDoKKyAgICBmb3JlYWNoIG15ICRkaXIgKCBAJGRpcnMgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGV4dCAoIEBleHRzICkgeworICAgICAgICAgICAgbXkgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCAkZGlyLCAkZmlsZSAuICRleHQgKTsKKyAgICAgICAgICAgIGlmICggLWUgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgIyBFeGVjdXRhYmxlIGJpdCBpcyBub3QgcmVsaWFibGUgb24gQ3lnd2luLCBkbyBub3QgY2hlY2sgaXQuCisgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1leGVjIH0gb3IgLXggJHBhdGggb3IgJF5PIGVxICJjeWd3aW4iICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoKCBAZm91bmQsICRwYXRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYWxsIH0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IGxvb3A7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkZXh0CisgICAgfTsgIyBmb3JlYWNoICRkaXIKKworICAgIGlmICggbm90IEBmb3VuZCApIHsKKyAgICAgICAgIyBUQkQ6IFdlIG5lZWQgdG8gaW50cm9kdWNlIGFuIG9wdGlvbiBmb3IgY29uZGl0aW9uYWwgZW5hYmxpbmcgdGhpcyBlcnJvci4KKyAgICAgICAgIyBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGZpbmQgXCIkZmlsZVwiIGV4ZWN1dGFibGUgZmlsZSBpbiBQQVRILiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAZm91bmQgPiAxICkgeworICAgICAgICAjIFRCRDogSXNzdWUgYSB3YXJuaW5nPworICAgIH07ICMgaWYKKworICAgIGlmICggJG9wdHN7IC1hbGwgfSApIHsKKyAgICAgICAgcmV0dXJuIEBmb3VuZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJGZvdW5kWyAwIF07CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB3aGljaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxhYnNfcGF0aCggJHBhdGgsICRiYXNlICk+CisKK1JldHVybiBhYnNvbHV0ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4KKworTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGJ5IEM8RmlsZTo6U3BlYy0+cmVsMmFicygpPi4gQzxhYnNfcGF0aCgpPiBhZGRpdGlvbmFsbHkgY29sbGFwc2VzCitDPGRpcjEvLi4vZGlyMj4gdG8gQzxkaXIyPi4KKworSXQgaXMgbm90IHNvIG5haXZlIGFuZCBtYWRlIGludGVudGlvbmFsbHkuIEZvciBleGFtcGxlIG9uIExpbnV4KiBPUyBpbiBCYXNoIGlmIEY8bGluay8+IGlzIGEgc3ltYm9saWMKK2xpbmsgdG8gZGlyZWN0b3J5IEY8c29tZV9kaXIvPgorCisgICAgJCBjZCBsaW5rCisgICAgJCBjZCAuLgorCiticmluZ3MgeW91IGJhY2sgdG8gRjxsaW5rLz4ncyBwYXJlbnQsIG5vdCB0byBwYXJlbnQgb2YgRjxzb21lX2Rpci8+LAorCis9Y3V0CisKK3N1YiBhYnNfcGF0aCgkOyQpIHsKKworICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoICRwYXRoLCAoIGRlZmluZWQoICRiYXNlICkgPyAkYmFzZSA6ICRFTlZ7IFBXRCB9ICkgKTsKKyAgICBteSAoICR2b2wsICRkaXIsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgd2hpbGUgKCAkZGlyID1+IHN7Lyg/IVwuXC4pW14vXSovXC5cLig/Oi98XHopfXsvfSApIHsKKyAgICB9OyAjIHdoaWxlCisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoIEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIsICRmaWxlICkgKTsKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGFic19wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHJlbF9wYXRoKCAkcGF0aCwgJGJhc2UgKT4KKworUmV0dXJuIHJlbGF0aXZlIHBhdGggZm9yIGFuIGFyZ3VtZW50LgorCis9Y3V0CisKK3N1YiByZWxfcGF0aCgkOyQpIHsKKworICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmFiczJyZWwoIGFic19wYXRoKCAkcGF0aCApLCAkYmFzZSApOworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgcmVsX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8cmVhbF9wYXRoKCAkZGlyICk+CisKK1JldHVybiByZWFsIGFic29sdXRlIHBhdGggZm9yIGFuIGFyZ3VtZW50LiBJbiB0aGUgcmVzdWx0IGFsbCByZWxhdGl2ZSBjb21wb25lbnRzIChGPC4+IGFuZCBGPC4uPikKK2FuZCBVPHN5bWJvbGljIGxpbmtzIGFyZSByZXNvbHZlZD4uCisKK0luIG1vc3QgY2FzZXMgaXQgaXMgbm90IHdoYXQgeW91IHdhbnQuIENvbnNpZGVyIHVzaW5nIEM8YWJzX3BhdGg+IGZpcnN0LgorCitDPGFic19wYXRoPiBmdW5jdGlvbiBmcm9tIEI8Q3dkPiBtb2R1bGUgd29ya3Mgd2l0aCBkaXJlY3RvcmllcyBvbmx5LiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggZmlsZXMKK2FzIHdlbGwuIEJ1dCwgaWYgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmssIGZ1bmN0aW9uIGRvZXMgbm90IHJlc29sdmUgaXQgKHlldCkuCisKK1RoZSBmdW5jdGlvbiB1c2VzIEM8cnVudGltZV9lcnJvcj4gdG8gcmFpc2UgYW4gZXJyb3IgaWYgc29tZXRoaW5nIHdyb25nLgorCis9Y3V0CisKK3N1YiByZWFsX3BhdGgoJCkgeworCisgICAgbXkgJG9yaWdfcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICRyZWFsX3BhdGg7CisgICAgbXkgJG1lc3NhZ2UgPSAiIjsKKyAgICBpZiAoIG5vdCAtZSAkb3JpZ19wYXRoICkgeworICAgICAgICAkbWVzc2FnZSA9ICJcIiRvcmlnX3BhdGhcIiBkb2VzIG5vdCBleGlzdHMiOworICAgIH0gZWxzZSB7CisgICAgICAgICMgQ3dkOjphYnNfcGF0aCBkb2VzIG5vdCB3b3JrIHdpdGggZmlsZXMsIHNvIGluIHRoaXMgY2FzZSB3ZSBzaG91bGQgaGFuZGxlIGZpbGUgc2VwYXJhdGVseS4KKyAgICAgICAgbXkgJGZpbGU7CisgICAgICAgIGlmICggbm90IC1kICRvcmlnX3BhdGggKSB7CisgICAgICAgICAgICAoIG15ICR2b2wsIG15ICRkaXIsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoIEZpbGU6OlNwZWMtPnJlbDJhYnMoICRvcmlnX3BhdGggKSApOworICAgICAgICAgICAgJG9yaWdfcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCAkU0lHeyBfX1dBUk5fXyB9ID0gc3ViIHsgJG1lc3NhZ2UgPSAkX1sgMCBdOyB9OworICAgICAgICAgICAgJHJlYWxfcGF0aCA9IEN3ZDo6YWJzX3BhdGgoICRvcmlnX3BhdGggKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkZmlsZSApICkgeworICAgICAgICAgICAgJHJlYWxfcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRyZWFsX3BhdGgsICRmaWxlICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJHJlYWxfcGF0aCApIG9yICRtZXNzYWdlIG5lICIiICkgeworICAgICAgICAkbWVzc2FnZSA9fiBzL15zdGF0XCguKlwpOiAoLiopXHMrYXQgLio/IGxpbmUgXGQrXHMqXHovJDEvOworICAgICAgICBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGZpbmQgcmVhbCBwYXRoIGZvciBcIiRvcmlnX3BhdGhcIiIgLiAoICRtZXNzYWdlIG5lICIiID8gIjogJG1lc3NhZ2UiIDogIiIgKSApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHJlYWxfcGF0aDsKKworfTsgIyBzdWIgcmVhbF9wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPG1ha2VfZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitNYWtlIGEgZGlyZWN0b3J5LgorCitUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgZGlyZWN0b3J5LiBJZiBuZWNlc3NhcnksIG1vcmUgdGhhbiBvbmUgbGV2ZWwgY2FuIGJlIGNyZWF0ZWQuCitJZiBkaXJlY3RvcnkgZXhpc3RzLCB3YXJuaW5nIGlzc3VlcyAodGhlIHNjcmlwdCBiZWhhdmlvciBkZXBlbmRzIG9uIHZhbHVlIG9mCitDPC13YXJuaW5nX2xldmVsPiBvcHRpb24pLiBJZiBkaXJlY3RvcnkgY3JlYXRpb24gZmFpbHMgb3IgQzwkZGlyPiBleGlzdHMgYnV0IGl0IGlzIG5vdCBhCitkaXJlY3RvcnksIGVycm9yIGlzc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW1vZGU+CisKK1RoZSBudW1lcmljIG1vZGUgZm9yIG5ldyBkaXJlY3RvcmllcywgMDc1MCAocnd4ci14LS0tKSBieSBkZWZhdWx0LgorCis9YmFjaworCis9Y3V0CisKK3N1YiBtYWtlX2RpcigkQCkgeworCisgICAgbXkgJGRpciAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBwYXJlbnRzID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIsIGRlZmF1bHQgPT4gMSAgICB9LAorICAgICAgICAgICAgICAgIG1vZGUgICAgPT4geyB0eXBlID0+ICJzY2FsYXIiLCAgZGVmYXVsdCA9PiAwNzc3IH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRkaXJcIiI7CisKKyAgICBpZiAoIC1lICRkaXIgKSB7CisgICAgICAgIGlmICggLWQgJGRpciApIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBpdCBleGlzdHMsIGJ1dCBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgZXZhbCB7CisgICAgICAgICAgICBGaWxlOjpQYXRoOjpta3BhdGgoICRkaXIsIDAsICRvcHRzeyBtb2RlIH0gKTsKKyAgICAgICAgfTsgIyBldmFsCisgICAgICAgIGlmICggJEAgKSB7CisgICAgICAgICAgICAkQCA9fiBze1xzK2F0ICg/OlthLXpBLVowLTkgL18uXSovKT90b29sc1wucG0gbGluZSBcZCtccyp9e307CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJEAiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgLWQgJGRpciApIHsgIyBKdXN0IGluIGNhc2UsIGNoZWNrIGl0IG9uZSBtb3JlIHRpbWUuLi4KKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworfTsgIyBzdWIgbWFrZV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y29weV9kaXIoICRzcmNfZGlyLCAkZHN0X2RpciwgQG9wdGlvbnMgKT4KKworQ29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCisKK1RoaXMgZnVuY3Rpb24gY29waWVzIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorSWYgc291cmNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBvciBub3QgYSBkaXJlY3RvcnksIGVycm9yIGlzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGNvcHlfZGlyKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBkaXJlY3RvcnkgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZCAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9kaXIoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAiY3AiLCAiLVIiLCAkc3JjLCAkZHN0IF0gKTsKKworfTsgIyBzdWIgY29weV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8bW92ZV9kaXIoICRzcmNfZGlyLCAkZHN0X2RpciwgQG9wdGlvbnMgKT4KKworTW92ZSBkaXJlY3RvcnkuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBtb3ZlX2RpcigkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZGlyZWN0b3J5IFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWQgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZGlyKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgIm12IiwgJHNyYywgJGRzdCBdICk7CisKK307ICMgc3ViIG1vdmVfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNsZWFuX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworQ2xlYW4gYSBkaXJlY3Rvcnk6IGRlbGV0ZSBhbGwgdGhlIGVudHJpZXMgKHJlY3Vyc2l2ZWx5KSwgYnV0IGxlYXZlIHRoZSBkaXJlY3RvcnkuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LWZvcmNlPiA9PiBib29sCisKK0lmIGEgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSwgdHJ5IHRvIGNoYW5nZSBwZXJtaXNzaW9ucyBmaXJzdCwgdGhlbiBjbGVhbiBpdC4KKworPWl0ZW0gQzwtc2tpcD4gPT4gcmVnZXhwCisKK1JlZ2V4cC4gSWYgYSBkaXJlY3RvcnkgZW50cnkgbWFjaGVkIHRoZSByZWdleHAsIGl0IGlzIHNraXBwZWQsIG5vdCBkZWxldGVkLiAoQXMgYSBzdWJzZXF1ZW5jZSwKK2EgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2tpcHBlZCBlbnRyaWVzIGlzIG5vdCBkZWxldGVkLikKKworPWJhY2sKKworPWN1dAorCitzdWIgX2NsZWFuX2RpcigkKTsKKworc3ViIF9jbGVhbl9kaXIoJCkgeworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIG15ICggJGRpciApID0gQF87CisgICAgbXkgJHNraXAgICAgPSAkX2NsZWFuX2Rpcl9vcHRzeyBza2lwIH07ICAgICMgUmVnZXhwLgorICAgIG15ICRza2lwcGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBza2lwcGVkIGZpbGVzLgorICAgIG15ICRwcmVmaXggID0gIkNsZWFuaW5nIGAkZGlyJyBmYWlsZWQ6IjsKKyAgICBteSBAc3RhdCAgICA9IHN0YXQoICRkaXIgKTsKKyAgICBteSAkbW9kZSAgICA9ICRzdGF0WyAyIF07CisgICAgaWYgKCBub3QgQHN0YXQgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3Qgc3RhdCBgJGRpcic6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCBfICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiSXQgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLXcgXyApIHsgICAgICAgICMgRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4KKyAgICAgICAgaWYgKCBub3QgLW8gXyBvciBub3QgJF9jbGVhbl9kaXJfb3B0c3sgZm9yY2UgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIERpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUgYnV0IG1pbmUuIFRyeSB0byBjaGFuZ2UgcGVybWlzc2lvbnMuCisgICAgICAgIGNobW9kKCAkbW9kZSB8IFNfSVdVU1IsICRkaXIgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBtYWtlIGRpcmVjdG9yeSB3cml0YWJsZTogJCEiICk7CisgICAgfTsgIyBpZgorICAgIG15ICRoYW5kbGUgICA9IElPOjpEaXItPm5ldyggJGRpciApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgcmVhZCBkaXJlY3Rvcnk6ICQhIiApOworICAgIG15IEBlbnRyaWVzICA9IEZpbGU6OlNwZWMtPm5vX3Vwd2FyZHMoICRoYW5kbGUtPnJlYWQoKSApOworICAgICRoYW5kbGUtPmNsb3NlKCkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCByZWFkIGRpcmVjdG9yeTogJCEiICk7CisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBAZW50cmllcyApIHsKKyAgICAgICAgbXkgJHBhdGggPSBjYXRfZmlsZSggJGRpciwgJGVudHJ5ICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJHNraXAgKSBhbmQgJGVudHJ5ID1+ICRza2lwICkgeworICAgICAgICAgICAgKysgJHNraXBwZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIC1sICRwYXRoICkgeworICAgICAgICAgICAgICAgIHVubGluayggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IGRlbGV0ZSBzeW1saW5rIGAkcGF0aCc6ICQhIiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0KCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3Qgc3RhdCBgJHBhdGgnOiAkISAiICk7CisgICAgICAgICAgICAgICAgaWYgKCAtZiBfICkgeworICAgICAgICAgICAgICAgICAgICBkZWxfZmlsZSggJHBhdGggKTsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggLWQgXyApIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJHJjID0gX2NsZWFuX2RpciggJHBhdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkcmMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtZGlyKCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgZGVsZXRlIGRpcmVjdG9yeSBgJHBhdGgnOiAkISIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICAkc2tpcHBlZCArPSAkcmM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgImAkcGF0aCcgaXMgbmVpdGhlciBhIGZpbGUgbm9yIGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKyAgICByZXR1cm4gJHNraXBwZWQ7Cit9OyAjIHN1YiBfY2xlYW5fZGlyCisKKworc3ViIGNsZWFuX2RpcigkQCkgeworICAgIG15ICRkaXIgID0gc2hpZnQoIEBfICk7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbG9jYWwgJV9jbGVhbl9kaXJfb3B0cyA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIHNraXAgID0+IHsgdHlwZSA9PiAicmVnZXhwcmVmIiB9LAorICAgICAgICAgICAgICAgIGZvcmNlID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICBteSAkc2tpcHBlZCA9IF9jbGVhbl9kaXIoICRkaXIgKTsKKyAgICByZXR1cm4gJHNraXBwZWQ7Cit9OyAjIHN1YiBjbGVhbl9kaXIKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxkZWxfZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitEZWxldGUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCisKK1RoaXMgZnVuY3Rpb24gZGVsZXRlcyBhIGRpcmVjdG9yeS4gSWYgZGlyZWN0b3J5IGNhbiBub3QgYmUgZGVsZXRlZCBvciBpdCBpcyBub3QgYSBkaXJlY3RvcnksIGVycm9yCittZXNzYWdlIGlzc3VlcyAoYW5kIHNjcmlwdCBleGlzdHMpLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9YmFjaworCis9Y3V0CisKK3N1YiBkZWxfZGlyKCRAKSB7CisKKyAgICBteSAkZGlyICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJEZWxldGluZyBkaXJlY3RvcnkgXCIkZGlyXCIgZmFpbGVkIjsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBsb2NhbCAlX2NsZWFuX2Rpcl9vcHRzID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgZm9yY2UgPT4geyB0eXBlID0+ICJib29sZWFuIiB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgIGlmICggbm90IC1lICRkaXIgKSB7CisgICAgICAgICMgTm90aGluZyB0byBkby4KKyAgICAgICAgcmV0dXJuOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkZGlyICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogaXQgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgX2NsZWFuX2RpciggJGRpciApOworICAgIHJtZGlyKCAkZGlyICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXguIiApOworCit9OyAjIHN1YiBkZWxfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNoYW5nZV9kaXIoICRkaXIgKT4KKworQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitJZiBhbnkgZXJyb3Igb2NjdXJyZWQsIGVycm9yIGlzc3VlcyBhbmQgc2NyaXB0IGV4aXRzLgorCis9Y3V0CisKK3N1YiBjaGFuZ2VfZGlyKCQpIHsKKworICAgIG15ICRkaXIgPSBzaGlmdCggQF8gKTsKKworICAgIEN3ZDo6Y2hkaXIoICRkaXIgKQorICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGNoZGlyIHRvIFwiJGRpclwiOiAkISIgKTsKKworfTsgIyBzdWIgY2hhbmdlX2RpcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNvcHlfZmlsZSggJHNyY19maWxlLCAkZHN0X2ZpbGUsIEBvcHRpb25zICk+CisKK0NvcHkgZmlsZS4KKworVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBmaWxlLiBJZiBzb3VyY2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZSwgZXJyb3IgaXNzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBmaWxlLCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGNvcHlfZmlsZSgkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZmlsZSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZiAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZiAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9maWxlKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBGaWxlOjpDb3B5Ojpjb3B5KCAkc3JjLCAkZHN0ICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICQhIiApOworICAgICMgT24gV2luZG93cyogT1MgRmlsZTo6Q29weSBwcmVzZXJ2ZXMgZmlsZSBhdHRyaWJ1dGVzLCBidXQgb24gTGludXgqIE9TIGl0IGRvZXNuJ3QuCisgICAgIyBTbyB3ZSBzaG91bGQgZG8gaXQgbWFudWFsbHkuLi4KKyAgICBpZiAoICReTyA9fiBtL15saW51eFx6LyApIHsKKyAgICAgICAgbXkgJG1vZGUgPSAoIHN0YXQoICRzcmMgKSApWyAyIF0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBjYW5ub3QgZ2V0IHN0YXR1cyBpbmZvIGZvciBzb3VyY2UgZmlsZS4iICk7CisgICAgICAgIGNobW9kKCAkbW9kZSwgJGRzdCApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogY2Fubm90IGNoYW5nZSBtb2RlIG9mIGRlc3RpbmF0aW9uIGZpbGUuIiApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgY29weV9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgbW92ZV9maWxlKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgbW92ZSBmaWxlIFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtb3ZlcndyaXRlICkgXSApOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWYgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGZpbGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWYgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBGaWxlOjpDb3B5Ojptb3ZlKCAkc3JjLCAkZHN0ICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICQhIiApOworCit9OyAjIHN1YiBtb3ZlX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBkZWxfZmlsZSgkKSB7CisgICAgbXkgJGZpbGVzID0gc2hpZnQoIEBfICk7CisgICAgaWYgKCByZWYoICRmaWxlcyApIGVxICIiICkgeworICAgICAgICAkZmlsZXMgPSBbICRmaWxlcyBdOworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRmaWxlICggQCRmaWxlcyApIHsKKyAgICAgICAgZGVidWcoICJEZWxldGluZyBmaWxlIGAkZmlsZScuLi4iICk7CisgICAgICAgIG15ICRyYyA9IHVubGluayggJGZpbGUgKTsKKyAgICAgICAgaWYgKCAkcmMgPT0gMCAmJiAkISAhPSBFTk9FTlQgKSB7CisgICAgICAgICAgICAjIFJlcG9ybiBhbiBlcnJvciwgYnV0IGlnbm9yZSBFTk9FTlQsIGJlY2F1c2UgdGhlIGdvYWwgaXMgYWNoaWV2ZWQuCisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRGVsZXRpbmcgZmlsZSBgJGZpbGUnIGZhaWxlZDogJCEiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGZpbGUKK307ICMgc3ViIGRlbF9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9YmFjaworCis9Y3V0CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBGaWxlIEkvTyBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRmlsZSBJL08gc3Vicm91dGluZXMuCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyByZWFkX2ZpbGUKKworQjxTeW5vcHNpczo+CisKKyAgICByZWFkX2ZpbGUoICRmaWxlLCBAb3B0aW9ucyApCisKK0I8RGVzY3JpcHRpb246PgorCitSZWFkIGZpbGUgYW5kIHJldHVybiBpdHMgY29udGVudC4gSW4gc2NhbGFyIGNvbnRleHQgZnVuY3Rpb24gcmV0dXJucyBhIHNjYWxhciwgaW4gbGlzdCBjb250ZXh0CitmdW5jdGlvbiByZXR1cm5zIGxpc3Qgb2YgbGluZXMuCisKK05vdGU6IElmIHRoZSBsYXN0IG9mIGZpbGUgZG9lcyBub3QgdGVybWluYXRlIHdpdGggbmV3bGluZSwgZnVuY3Rpb24gd2lsbCBhcHBlbmQgaXQuCisKK0I8QXJndW1lbnRzOj4KKworPW92ZXIKKworPWl0ZW0gQjwkZmlsZT4KKworQSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHJlYWQgZnJvbS4KKworPWJhY2sKKworQjxPcHRpb25zOj4KKworPW92ZXIKKworPWl0ZW0gQjwtYmluYXJ5PgorCitJZiB0cnVlLCBmaWxlIHRyZWF0cyBhcyBhIGJpbmFyeSBmaWxlOiBubyBuZXdsaW5lIGNvbnZlcnNpb24sIG5vIHRydW5jYXRpbmcgdHJhaWxpbmcgc3BhY2UsIG5vCituZXdsaW5lIHJlbW92aW5nIHBlcmZvcm1lZC4gRW50aXJlIGZpbGUgcmV0dXJuZWQgYXMgYSBzY2FsYXIuCisKKz1pdGVtIEI8LWJ1bGs+CisKK1RoaXMgb3B0aW9uIGlzIGFsbG93ZWQgb25seSBpbiBiaW5hcnkgbW9kZS4gT3B0aW9uJ3MgdmFsdWUgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyLgorSWYgb3B0aW9uIHByZXNlbnQsIGZpbGUgY29udGVudCBwbGFjZWQgdG8gcG9pbnRlZSBzY2FsYXIgYW5kIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSAoMSkuCisKKz1pdGVtIEI8LWNob21wPgorCitJZiB0cnVlLCBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSBmaWxlIGNvbnRlbnQuIEJ5IGRlZmF1bHQgbmV3bGluZSBjaGFyYWN0ZXJzIHJlbWFpbi4KK1RoaXMgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIGluIGJpbmFyeSBtb2RlLgorCis9aXRlbSBCPC1rZWVwX3RyYWlsaW5nX3NwYWNlPgorCitJZiB0cnVlLCB0cmFpbmxpbmcgc3BhY2UgcmVtYWluIGF0IHRoZSBlbmRzIG9mIGxpbmVzLiBCeSBkZWZhdWx0IGFsbCB0cmFpbGluZyBzcGFjZXMgYXJlIHJlbW92ZWQuCitUaGlzIG9wdGlvbiBpcyBub3QgYXBwbGljYWJsZSBpbiBiaW5hcnkgbW9kZS4KKworPWJhY2sKKworQjxFeGFtcGxlczo+CisKK1JldHVybiBmaWxlIGFzIHNpbmdsZSBsaW5lLCByZW1vdmUgdHJhaWxpbmcgc3BhY2VzLgorCisgICAgbXkgJGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIgKTsKKworUmV0dXJuIGZpbGUgYXMgbGlzdCBvZiBsaW5lcyB3aXRoIHJlbW92ZWQgdHJhaWxpbmcgc3BhY2UgYW5kCituZXdsaW5lIGNoYXJhY3RlcnMuCisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiwgLWNob21wID0+IDEgKTsKKworUmVhZCBhIGJpbmFyeSBmaWxlOgorCisgICAgbXkgJGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIsIC1iaW5hcnkgPT4gMSApOworCitSZWFkIGEgYmlnIGJpbmFyeSBmaWxlOgorCisgICAgbXkgJGJ1bGs7CisgICAgcmVhZF9maWxlKCAiYmlnX2JpbmFyeV9maWxlIiwgLWJpbmFyeSA9PiAxLCAtYnVsayA9PiBcJGJ1bGsgKTsKKworUmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0OgorCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoIFwqU1RESU4gKTsKKworPWN1dAorCitzdWIgcmVhZF9maWxlKCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byByZWFkIGZyb20uCisgICAgbXkgJW9wdHMgPSBAXzsgICAgICAgICAgICMgT3B0aW9ucy4KKworICAgIG15ICRuYW1lOworICAgIG15ICRoYW5kbGU7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgJGVycm9yID0gXCZydW50aW1lX2Vycm9yOworCisgICAgbXkgQGJpbm9wdHMgPSBxdyggLWJpbmFyeSAtZXJyb3IgLWJ1bGsgKTsgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9ucyBhdmFpbGFibGUgaW4gYmluYXJ5IG1vZGUuCisgICAgbXkgQHR4dG9wdHMgPSBxdyggLWJpbmFyeSAtZXJyb3IgLWtlZXBfdHJhaWxpbmdfc3BhY2UgLWNob21wIC1sYXllciApOyAjIE9wdGlvbnMgYXZhaWxhYmxlIGluIHRleHQgKG5vbi1iaW5hcnkpIG1vZGUuCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQGJpbm9wdHMsIEB0eHRvcHRzIF0gKTsKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEBiaW5vcHRzIF0sICJ0aGVzZSBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggLWJpbmFyeSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAdHh0b3B0cyBdLCAidGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IC1iaW5hcnkiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGV4aXN0cyggJG9wdHN7IC1lcnJvciB9ICkgKSB7CisgICAgICAgICRvcHRzeyAtZXJyb3IgfSA9ICJlcnJvciI7CisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1lcnJvciB9IGVxICJ3YXJuaW5nIiApIHsKKyAgICAgICAgJGVycm9yID0gXCZ3YXJuaW5nOworICAgIH0gZWxzaWYoICRvcHRzeyAtZXJyb3IgfSBlcSAiaWdub3JlIiApIHsKKyAgICAgICAgJGVycm9yID0gc3ViIHt9OworICAgIH0gZWxzaWYgKCByZWYoICRvcHRzeyAtZXJyb3IgfSApIGVxICJBUlJBWSIgKSB7CisgICAgICAgICRlcnJvciA9IHN1YiB7IHB1c2goIEB7ICRvcHRzeyAtZXJyb3IgfSB9LCAkX1sgMCBdICk7IH07CisgICAgfTsgIyBpZgorCisgICAgaWYgKCAoIHJlZiggJGZpbGUgKSBlcSAiR0xPQiIgKSBvciBVTklWRVJTQUw6OmlzYSggJGZpbGUsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgJGhhbmRsZSA9ICRmaWxlOworICAgIH0gZWxzZSB7CisgICAgICAgICRuYW1lID0gJGZpbGU7CisgICAgICAgIGlmICggZ2V0X2V4dCggJGZpbGUgKSBlcSAiLmd6IiBhbmQgbm90ICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgICAgICAkaGFuZGxlID0gSU86OlpsaWItPm5ldyggJG5hbWUsICJyYiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkbmFtZSwgInIiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGhhbmRsZSApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciBpbnB1dDogJCEiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBkZWZpbmVkKCAkaGFuZGxlICkgKSB7CisgICAgICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgICAgIGJpbm1vZGUoICRoYW5kbGUgKTsKKyAgICAgICAgICAgIGxvY2FsICQvID0gdW5kZWY7ICAgIyBTZXQgaW5wdXQgcmVjb3JkIHNlcGFyYXRvciB0byB1bmRlZiB0byByZWFkIGVudGlyZSBmaWxlIGFzIG9uZSBsaW5lLgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICAgICAgJHsgJG9wdHN7IC1idWxrIH0gfSA9ICRoYW5kbGUtPmdldGxpbmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGJ1bGtbIDAgXSA9ICRoYW5kbGUtPmdldGxpbmUoKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9wdHN7IC1sYXllciB9ICkgKSB7CisgICAgICAgICAgICAgICAgYmlubW9kZSggJGhhbmRsZSwgJG9wdHN7IC1sYXllciB9ICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBAYnVsayA9ICRoYW5kbGUtPmdldGxpbmVzKCk7CisgICAgICAgICAgICAjIFNwZWNpYWwgdHJpY2sgZm9yIFVURi04IGZpbGVzOiBEZWxldGUgQk9NLCBpZiBhbnkuCisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcHRzeyAtbGF5ZXIgfSApIGFuZCAkb3B0c3sgLWxheWVyIH0gZXEgIjp1dGY4IiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnN0ciggJGJ1bGtbIDAgXSwgMCwgMSApIGVxICJceHtGRUZGfSIgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGJ1bGtbIDAgXSwgMCwgMSApID0gIiI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgICAgIG9yICRlcnJvci0+KCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIGNsb3NlZCBhZnRlciBpbnB1dDogJCEiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9IGFuZCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICAkeyAkb3B0c3sgLWJ1bGsgfSB9ID0gIiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICRidWxrWyAwIF07CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICggQGJ1bGsgPiAwICkgYW5kICggc3Vic3RyKCAkYnVsa1sgLTEgXSwgLTEsIDEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAkYnVsa1sgLTEgXSAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90ICRvcHRzeyAta2VlcF90cmFpbGluZ19zcGFjZSB9ICkgeworICAgICAgICAgICAgbWFwKCAkXyA9fiBzL1xzK1xuXHovXG4vLCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG9wdHN7IC1jaG9tcCB9ICkgeworICAgICAgICAgICAgY2hvbXAoIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCB3YW50YXJyYXkoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBAYnVsazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBqb2luKCAiIiwgQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworfTsgIyBzdWIgcmVhZF9maWxlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgd3JpdGVfZmlsZQorCitCPFN5bm9wc2lzOj4KKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCAkYnVsaywgQG9wdGlvbnMgKQorCitCPERlc2NyaXB0aW9uOj4KKworV3JpdGUgZmlsZS4KKworQjxBcmd1bWVudHM6PgorCis9b3ZlcgorCis9aXRlbSBCPCRmaWxlPgorCitUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byB3cml0dGUgdG8uCisKKz1pdGVtIEI8JGJ1bGs+CisKK0J1bGsgdG8gd3JpdGUgdG8gYSBmaWxlLiBDYW4gYmUgYSBzY2FsYXIsIG9yIGEgcmVmZXJlbmNlIHRvIHNjYWxhciBvciBhbiBhcnJheS4KKworPWJhY2sKKworQjxPcHRpb25zOj4KKworPW92ZXIKKworPWl0ZW0gQjwtYmFja3VwPgorCitJZiB0cnVlLCBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiBmaWxlIG92ZXJ3cml0dGVuLiBCYWNrdXAgY29weSBpcyBwbGFjZWQgaW50byB0aGUgc2FtZSBkaXJlY3RvcnkuCitUaGUgbmFtZSBvZiBiYWNrdXAgY29weSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiBmaWxlIHdpdGggYH4nIGFwcGVuZGVkLiBCeSBkZWZhdWx0IGJhY2t1cCBjb3B5CitpcyBub3QgY3JlYXRlZC4KKworPWl0ZW0gQjwtYXBwZW5kPgorCitJZiB0cnVlLCB0aGUgdGV4dCB3aWxsIGJlIGFkZGVkIHRvIGV4aXN0aW5nIGZpbGUuCisKKz1iYWNrCisKK0I8RXhhbXBsZXM6PgorCisgICAgd3JpdGVfZmlsZSggIm1lc3NhZ2UudHh0IiwgXCRidWxrICk7CisgICAgICAgICMgV3JpdGUgZmlsZSwgdGFrZSBjb250ZW50IGZyb20gYSBzY2FsYXIuCisKKyAgICB3cml0ZV9maWxlKCAibWVzc2FnZS50eHQiLCBcQGJ1bGssIC1iYWNrdXAgPT4gMSApOworICAgICAgICAjIFdyaXRlIGZpbGUsIHRha2UgY29udGVudCBmcm9tIGFuIGFycmF5LCBjcmVhdGUgYSBiYWNrdXAgY29weS4KKworPWN1dAorCitzdWIgd3JpdGVfZmlsZSgkJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7ICAjIFRoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHdyaXRlIHRvLgorICAgIG15ICRidWxrID0gc2hpZnQoIEBfICk7ICAjIFRoZSB0ZXh0IHRvIHdyaXRlLiBDYW4gYmUgcmVmZXJlbmNlIHRvIGFycmF5IG9yIHNjYWxhci4KKyAgICBteSAlb3B0cyA9IEBfOyAgICAgICAgICAgIyBPcHRpb25zLgorCisgICAgbXkgJG5hbWU7CisgICAgbXkgJGhhbmRsZTsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtYXBwZW5kIC1iYWNrdXAgLWJpbmFyeSAtbGF5ZXIgKSBdICk7CisKKyAgICBteSAkbW9kZSA9ICRvcHRzeyAtYXBwZW5kIH0gPyAiYSI6ICJ3IjsKKyAgICBpZiAoICggcmVmKCAkZmlsZSApIGVxICJHTE9CIiApIG9yIFVOSVZFUlNBTDo6aXNhKCAkZmlsZSwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICRuYW1lID0gInVua25vd24iOworICAgICAgICAkaGFuZGxlID0gJGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSAkZmlsZTsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJhY2t1cCB9IGFuZCAoIC1mICRuYW1lICkgKSB7CisgICAgICAgICAgICBjb3B5X2ZpbGUoICRuYW1lLCAkbmFtZSAuICJ+IiwgLW92ZXJ3cml0ZSA9PiAxICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGhhbmRsZSA9IElPOjpGaWxlLT5uZXcoICRuYW1lLCAkbW9kZSApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3Igb3V0cHV0OiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBiaW5tb2RlKCAkaGFuZGxlICk7CisgICAgfSBlbHNpZiAoICRvcHRzeyAtbGF5ZXIgfSApIHsKKyAgICAgICAgYmlubW9kZSggJGhhbmRsZSwgJG9wdHN7IC1sYXllciB9ICk7CisgICAgfTsgIyBpZgorICAgIGlmICggcmVmKCAkYnVsayApIGVxICIiICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICRidWxrICkgKSB7CisgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJGJ1bGsgKTsKKyAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkYnVsaywgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCByZWYoICRidWxrICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJCRidWxrICkgKSB7CisgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJCRidWxrICk7CisgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJCRidWxrLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoIHJlZiggJGJ1bGsgKSBlcSAiQVJSQVkiICkgeworICAgICAgICBmb3JlYWNoIG15ICRsaW5lICggQCRidWxrICkgeworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkbGluZSApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkbGluZSApOworICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkbGluZSwgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICB9IGVsc2UgeworICAgICAgICBDYXJwOjpjcm9hayggIndyaXRlX2ZpbGU6IFwkYnVsayBtdXN0IGJlIGEgc2NhbGFyIG9yIHJlZmVyZW5jZSB0byAoc2NhbGFyIG9yIGFycmF5KSIgKTsKKyAgICB9OyAjIGlmCisgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIGNsb3NlZCBhZnRlciBvdXRwdXQ6ICQhIiApOworCit9OyAjIHN1YiB3cml0ZV9maWxlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBFeGVjdXRpb24gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEV4ZWN1dGlvbiBzdWJyb3V0aW5lcy4KKworPW92ZXIKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIF9wcmUgeworCisgICAgbXkgJGFyZyA9IHNoaWZ0KCBAXyApOworCisgICAgIyBJZiByZWRpcmVjdGlvbiBpcyBub3QgcmVxdWlyZWQsIGV4aXQuCisgICAgaWYgKCBub3QgZXhpc3RzKCAkYXJnLT57IHJlZGlyIH0gKSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgIyBpZgorCisgICAgIyBJbnB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRtb2RlICAgPSAkYXJnLT57IG1vZGUgICB9OyAjIE1vZGUsICI8IiAoaW5wdXQgKSBvciAiPiIgKG91dHB1dCkuCisgICAgbXkgJGhhbmRsZSA9ICRhcmctPnsgaGFuZGxlIH07ICMgSGFuZGxlIHRvIG1hbmlwdWxhdGUuCisgICAgbXkgJHJlZGlyICA9ICRhcmctPnsgcmVkaXIgIH07ICMgRGF0YSwgYSBmaWxlIG5hbWUgaWYgYSBzY2FsYXIsIG9yIGZpbGUgY29udGVudHMsIGlmIGEgcmVmZXJlbmNlLgorCisgICAgIyBPdXRwdXQgcGFyYW1ldGVycy4KKyAgICBteSAkc2F2ZV9oYW5kbGU7CisgICAgbXkgJHRlbXBfaGFuZGxlOworICAgIG15ICR0ZW1wX25hbWU7CisKKyAgICAjIFNhdmUgb3JpZ2luYWwgaGFuZGxlIChieSBkdXBpbmcgaXQpLgorICAgICRzYXZlX2hhbmRsZSA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisgICAgJGhhbmRsZS0+Zmx1c2goKTsKKyAgICBvcGVuKCAkc2F2ZV9oYW5kbGUsICRtb2RlIC4gIiYiIC4gJGhhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBQcmVwYXJlIGEgZmlsZSB0byBJTy4KKyAgICBpZiAoIFVOSVZFUlNBTDo6aXNhKCAkcmVkaXIsICJJTzo6SGFuZGxlIiApIG9yICggcmVmKCAkcmVkaXIgKSBlcSAiR0xPQiIgKSApIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiBJTzo6SGFuZGxlIGNsYXNzIChvciBpdHMgZGVjZWRhbnQpLgorICAgICAgICAkdGVtcF9oYW5kbGUgPSAkcmVkaXI7CisgICAgfSBlbHNpZiAoIHJlZiggJHJlZGlyICkgKSB7CisgICAgICAgICMgJHJlZGlyIGlzIGEgcmVmZXJlbmNlIHRvIGNvbnRlbnQgdG8gYmUgcmVhZC93cml0dGVuLgorICAgICAgICAjIFByZXBhcmUgdGVtcCBmaWxlLgorICAgICAgICAoICR0ZW1wX2hhbmRsZSwgJHRlbXBfbmFtZSApID0KKyAgICAgICAgICAgIEZpbGU6OlRlbXA6OnRlbXBmaWxlKAorICAgICAgICAgICAgICAgICIkdG9vbC5YWFhYWFhYWCIsCisgICAgICAgICAgICAgICAgRElSICAgID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLAorICAgICAgICAgICAgICAgIFNVRkZJWCA9PiAiLnRtcCIsCisgICAgICAgICAgICAgICAgVU5MSU5LID0+IDEKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICR0ZW1wX2hhbmRsZSApICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBjcmVhdGUgdGVtcCBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRtb2RlIGVxICI8IiApIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSBmaWxlIHRvIGJlIHJlYWQgYnkgY2hpbGQsIHByZXBhcmUgZmlsZSBjb250ZW50IHRvIGJlIHJlYWQuCisgICAgICAgICAgICAkdGVtcF9oYW5kbGUtPnByaW50KCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiID8gJHsgJHJlZGlyIH0gOiBAeyAkcmVkaXIgfSApOworICAgICAgICAgICAgJHRlbXBfaGFuZGxlLT5mbHVzaCgpOworICAgICAgICAgICAgc2VlayggJHRlbXBfaGFuZGxlLCAwLCAwICk7CisgICAgICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWxseSwgSSBjb3VsZCBub3QgdXNlIE9PIGludGVyZmFjZSB0byBzZWVrLgorICAgICAgICAgICAgICAgICMgQWN0aXZlUGVybCA1LjYuMSBjb21wbGFpbnMgb24gYm90aCBmb3JtczoKKyAgICAgICAgICAgICAgICAjICAgICR0ZW1wX2hhbmRsZS0+c2VlayggMCApOyAgICAjIEFzIGRlY2xhcmVkIGluIElPOjpTZWVrYWJsZS4KKyAgICAgICAgICAgICAgICAjICAgICR0ZW1wX2hhbmRsZS0+c2V0cG9zKCAwICk7ICAjIEFzIGRlc2NyaWJlZCBpbiBkb2N1bWVudGF0aW9uLgorICAgICAgICB9IGVsc2lmICggJG1vZGUgZXEgIj4iICkgeworICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUgZm9yIG91dHB1dC4gQ2xlYXIgb3V0cHV0IHZhcmlhYmxlLgorICAgICAgICAgICAgaWYgKCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiICkgeworICAgICAgICAgICAgICAgICR7ICRyZWRpciB9ID0gIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEB7ICRyZWRpciB9ID0gKCk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICAjICRyZWRpciBpcyBhIG5hbWUgb2YgZmlsZSB0byBiZSByZWFkL3dyaXR0ZW4uCisgICAgICAgICMgSnVzdCBvcGVuIGZpbGUuCisgICAgICAgIGlmICggZGVmaW5lZCggJHJlZGlyICkgKSB7CisgICAgICAgICAgICAkdGVtcF9uYW1lID0gJHJlZGlyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRlbXBfbmFtZSA9IEZpbGU6OlNwZWMtPmRldm51bGwoKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkdGVtcF9oYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkdGVtcF9uYW1lLCAkbW9kZSApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiZmlsZSBcIiR0ZW1wX25hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciAiIC4gKCAkbW9kZSBlcSAiPCIgPyAiaW5wdXQiIDogIm91dHB1dCIgKSAuICI6ICQhIiApOworICAgIH07ICMgaWYKKworICAgICMgUmVkaXJlY3QgaGFuZGxlIHRvIHRlbXAgZmlsZS4KKyAgICBvcGVuKCAkaGFuZGxlLCAkbW9kZSAuICImIiAuICR0ZW1wX2hhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBTYXZlIG91dHB1dCBwYXJhbWV0ZXJzLgorICAgICRhcmctPnsgc2F2ZV9oYW5kbGUgfSA9ICRzYXZlX2hhbmRsZTsKKyAgICAkYXJnLT57IHRlbXBfaGFuZGxlIH0gPSAkdGVtcF9oYW5kbGU7CisgICAgJGFyZy0+eyB0ZW1wX25hbWUgICB9ID0gJHRlbXBfbmFtZTsKKworfTsgIyBzdWIgX3ByZQorCisKK3N1YiBfcG9zdCB7CisKKyAgICBteSAkYXJnID0gc2hpZnQoIEBfICk7CisKKyAgICAjIElucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJG1vZGUgICA9ICRhcmctPnsgbW9kZSAgIH07ICMgTW9kZSwgIjwiIG9yICI+Ii4KKyAgICBteSAkaGFuZGxlID0gJGFyZy0+eyBoYW5kbGUgfTsgIyBIYW5kbGUgdG8gc2F2ZSBhbmQgc2V0LgorICAgIG15ICRyZWRpciAgPSAkYXJnLT57IHJlZGlyICB9OyAjIERhdGEsIGEgZmlsZSBuYW1lIGlmIGEgc2NhbGFyLCBvciBmaWxlIGNvbnRlbnRzLCBpZiBhIHJlZmVyZW5jZS4KKworICAgICMgUGFyYW1ldGVycyBzYXZlZCBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgICBteSAkc2F2ZV9oYW5kbGUgPSAkYXJnLT57IHNhdmVfaGFuZGxlIH07CisgICAgbXkgJHRlbXBfaGFuZGxlID0gJGFyZy0+eyB0ZW1wX2hhbmRsZSB9OworICAgIG15ICR0ZW1wX25hbWUgICA9ICRhcmctPnsgdGVtcF9uYW1lICAgfTsKKworICAgICMgSWYgbm8gaGFuZGxlIHdhcyBzYXZlZCwgZXhpdC4KKyAgICBpZiAoIG5vdCAkc2F2ZV9oYW5kbGUgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07ICMgaWYKKworICAgICMgQ2xvc2UgaGFuZGxlLgorICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgZGllKCAiJCEiICk7CisKKyAgICAjIFJlYWQgdGhlIGNvbnRlbnQgb2YgdGVtcCBmaWxlLCBpZiBuZWNlc3NhcnksIGFuZCBjbG9zZSB0ZW1wIGZpbGUuCisgICAgaWYgKCAoICRtb2RlIG5lICI8IiApIGFuZCByZWYoICRyZWRpciApICkgeworICAgICAgICAkdGVtcF9oYW5kbGUtPmZsdXNoKCk7CisgICAgICAgIHNlZWsoICR0ZW1wX2hhbmRsZSwgMCwgMCApOworICAgICAgICBpZiAoICReTyA9fiBtL01TV2luLyApIHsKKyAgICAgICAgICAgIGJpbm1vZGUoICR0ZW1wX2hhbmRsZSwgIjpjcmxmIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgICAgICR7ICRyZWRpciB9IC49IGpvaW4oICIiLCAkdGVtcF9oYW5kbGUtPmdldGxpbmVzKCkgKTsKKyAgICAgICAgfSBlbHNpZiAoIHJlZiggJHJlZGlyICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgICAgIHB1c2goIEB7ICRyZWRpciB9LCAkdGVtcF9oYW5kbGUtPmdldGxpbmVzKCkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBVTklWRVJTQUw6OmlzYSggJHJlZGlyLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJHRlbXBfaGFuZGxlLT5jbG9zZSgpCisgICAgICAgICAgICBvciBkaWUoICIkISIgKTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFJlc3RvcmUgaGFuZGxlIHRvIG9yaWdpbmFsIHZhbHVlLgorICAgICRzYXZlX2hhbmRsZS0+Zmx1c2goKTsKKyAgICBvcGVuKCAkaGFuZGxlLCAkbW9kZSAuICImIiAuICRzYXZlX2hhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBDbG9zZSBzYXZlIGhhbmRsZS4KKyAgICAkc2F2ZV9oYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgZGllKCAiJCEiICk7CisKKyAgICAjIERlbGV0ZSBwYXJhbWV0ZXJzIHNhdmVkIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIGRlbGV0ZSggJGFyZy0+eyBzYXZlX2hhbmRsZSB9ICk7CisgICAgZGVsZXRlKCAkYXJnLT57IHRlbXBfaGFuZGxlIH0gKTsKKyAgICBkZWxldGUoICRhcmctPnsgdGVtcF9uYW1lICAgfSApOworCit9OyAjIHN1YiBfcG9zdAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxleGVjdXRlKCBbIEBjb21tYW5kIF0sIEBvcHRpb25zICk+CisKK0V4ZWN1dGUgc3BlY2lmaWVkIHByb2dyYW0gb3Igc2hlbGwgY29tbWFuZC4KKworUHJvZ3JhbSBpcyBzcGVjaWZpZWQgYnkgcmVmZXJlbmNlIHRvIGFuIGFycmF5LCB0aGF0IGFycmF5IGlzIHBhc3NlZCB0byBDPHN5c3RlbSgpPiBmdW5jdGlvbiB3aGljaAorZXhlY3V0ZXMgdGhlIGNvbW1hbmQuIFNlZSBMPHBlcmxmdW5jPiBmb3IgZGV0YWlscyBob3cgQzxzeXN0ZW0oKT4gaW50ZXJwcmV0cyB2YXJpb3VzIGZvcm1zIG9mCitDPEBjb21tYW5kPi4KKworQnkgZGVmYXVsdCwgaW4gY2FzZSBvZiBhbnkgZXJyb3IgZXJyb3IgbWVzc2FnZSBpcyBpc3N1ZWQgYW5kIHNjcmlwdCB0ZXJtaW5hdGVkIChieSBydW50aW1lX2Vycm9yKCkpLgorRnVuY3Rpb24gcmV0dXJucyBhbiBleGl0IGNvZGUgb2YgcHJvZ3JhbS4KKworQWx0ZXJuYXRpdmVseSwgaGUgZnVuY3Rpb24gbWF5IHJldHVybiBleGl0IHN0YXR1cyBvZiB0aGUgcHJvZ3JhbSAoc2VlIEM8LWlnbm9yZV9zdGF0dXM+KSBvciBzaWduYWwKKyhzZWUgQzwtaWdub3JlX3NpZ25hbD4pIHNvIGNhbGxlciBtYXkgYW5hbHl6ZSBpdCBhbmQgY29udGludWUgZXhlY3V0aW9uLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1zdGRpbj4KKworUmVkaXJlY3Qgc3RkaW4gb2YgcHJvZ3JhbS4gVGhlIHZhbHVlIG9mIG9wdGlvbiBjYW4gYmU6CisKKz1vdmVyCisKKz1pdGVtIEM8dW5kZWY+CisKK1N0ZGluIG9mIGNoaWxkIGlzIGF0dGFjaGVkIHRvIG51bGwgZGV2aWNlLgorCis9aXRlbSBhIHN0cmluZworCitTdGRpbiBvZiBjaGlsZCBpcyBhdHRhY2hlZCB0byBhIGZpbGUgd2l0aCBuYW1lIHNwZWNpZmllZCBieSBvcHRpb24uCisKKz1pdGVtIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyCisKK0EgZGVyZWZlcmVuY2VkIHNjYWxhciBpcyB3cml0dGVuIHRvIGEgdGVtcCBmaWxlLCBhbmQgY2hpbGQncyBzdGRpbiBpcyBhdHRhY2hlZCB0byB0aGF0IGZpbGUuCisKKz1pdGVtIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5CisKK0EgZGVyZWZlcmVuY2VkIGFycmF5IGlzIHdyaXR0ZW4gdG8gYSB0ZW1wIGZpbGUsIGFuZCBjaGlsZCdzIHN0ZGluIGlzIGF0dGFjaGVkIHRvIHRoYXQgZmlsZS4KKworPWJhY2sKKworPWl0ZW0gQzwtc3Rkb3V0PgorCitSZWRpcmVjdCBzdGRvdXQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIEM8LXN0ZGluPiBvcHRpb24uIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMKK3JlZmVyZW5jZSBzcGVjaWZpZXMgYSB2YXJpYWJsZSByZWNlaXZpbmcgcHJvZ3JhbSdzIG91dHB1dC4KKworPWl0ZW0gQzwtc3RkZXJyPgorCitJdCBzaW1pbGFyIHRvIEM8LXN0ZG91dD4sIGJ1dCByZWRpcmVjdHMgc3RkZXJyLiBUaGVyZSBpcyBvbmx5IG9uZSBhZGRpdGlvbmFsIHZhbHVlOgorCis9b3ZlcgorCis9aXRlbSBhbiBlbXB0eSBzdHJpbmcKKworbWVhbnMgdGhhdCBzdGRlcnIgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHNhbWUgcGxhY2Ugd2hlcmUgc3Rkb3V0IGlzIHJlZGlyZWN0ZWQgdG8uCisKKz1iYWNrCisKKz1pdGVtIEM8LWFwcGVuZD4KKworUmVkaXJlY3RlZCBzdHJlYW0gd2lsbCBub3Qgb3ZlcndyaXRlIHByZXZpb3VzIGNvbnRlbnQgb2YgZmlsZSAob3IgdmFyaWFibGUpLgorTm90ZSwgdGhhdCBvcHRpb24gYWZmZWN0cyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyLgorCis9aXRlbSBDPC1pZ25vcmVfc3RhdHVzPgorCitCeSBkZWZhdWx0LCBzdWJyb3V0aW5lIHJhaXNlcyBhbiBlcnJvciBhbmQgZXhpdHMgdGhlIHNjcmlwdCBpZiBwcm9ncmFtIHJldHVybnMgbm9uLWV4aXQgc3RhdHVzLiBJZgordGhpcyBvcHRpb25zIGlzIHRydWUsIG5vIGVycm9yIGlzIHJhaXNlZC4gSW5zdGVhZCwgc3RhdHVzIGlzIHJldHVybmVkIGFzIGZ1bmN0aW9uIHJlc3VsdCAoYW5kICRAIGlzCitzZXQgdG8gZXJyb3IgbWVzc2FnZSkuCisKKz1pdGVtIEM8LWlnbm9yZV9zaWduYWw+CisKK0J5IGRlZmF1bHQsIHN1YnJvdXRpbmUgcmFpc2VzIGFuIGVycm9yIGFuZCBleGl0cyB0aGUgc2NyaXB0IGlmIHByb2dyYW0gZGllIHdpdGggc2lnbmFsLiBJZgordGhpcyBvcHRpb25zIGlzIHRydWUsIG5vIGVycm9yIGlzIHJhaXNlZCBpbiBzdWNoIGEgY2FzZS4gSW5zdGVhZCwgc2lnbmFsIG51bWJlciBpcyByZXR1cm5lZCAoYXMKK25lZ2F0aXZlIHZhbHVlKSwgZXJyb3IgbWVzc2FnZSBpcyBwbGFjZWQgdG8gQzwkQD4gdmFyaWFibGUuCisKK0lmIGNvbW1hbmQgaXMgbm90IGV2ZW4gc3RhcnRlZCwgLTI1NiBpcyByZXR1cm5lZC4KKworPWJhY2sKKworRXhhbXBsZXM6CisKKyAgICBleGVjdXRlKCBbICJjbWQuZXhlIiwgIi9jIiwgImRpciIgXSApOworICAgICAgICAjIEV4ZWN1dGUgTlQgc2hlbGwgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucywgbm8gcmVkaXJlY3Rpb25zIGFyZQorICAgICAgICAjIG1hZGUuCisKKyAgICBteSAkb3V0cHV0OworICAgIGV4ZWN1dGUoIFsgImN2cyIsICItbiIsICItcSIsICJ1cGRhdGUiLCAiLiIgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCApOworICAgICAgICAjIEV4ZWN1dGUgImN2cyAtbiAtcSB1cGRhdGUgLiIgY29tbWFuZCwgb3V0cHV0IGlzIHNhdmVkCisgICAgICAgICMgaW4gJG91dHB1dCB2YXJpYWJsZS4KKworICAgIG15IEBvdXRwdXQ7CisgICAgZXhlY3V0ZSggWyBxdyggY3ZzIC1uIC1xIHVwZGF0ZSAuICkgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAjIEV4ZWN1dGUgc3BlY2lmaWVkIGNvbW1hbmQsICBvdXRwdXQgaXMgc2F2ZWQgaW4gQG91dHB1dAorICAgICAgICAjIHZhcmlhYmxlLCBzdGRlcnIgc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gbnVsbCBkZXZpY2UKKyAgICAgICAgIyAoL2Rldi9udWxsIGluIExpbnV4KiBPUyBhbiBudWwgaW4gV2luZG93cyogT1MpLgorCis9Y3V0CisKK3N1YiBleGVjdXRlKCRAKSB7CisKKyAgICAjICEhISBBZGQgc29tZXRoaW5nIHRvIGNvbXBsYWluIG9uIHVua25vd24gb3B0aW9ucy4uLgorCisgICAgbXkgJGNvbW1hbmQgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgICA9IEBfOworICAgIG15ICRwcmVmaXggID0gIkNvdWxkIG5vdCBleGVjdXRlICRjb21tYW5kLT5bIDAgXSI7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLXN0ZGluIC1zdGRvdXQgLXN0ZGVyciAtYXBwZW5kIC1pZ25vcmVfc3RhdHVzIC1pZ25vcmVfc2lnbmFsICkgXSApOworCisgICAgaWYgKCByZWYoICRjb21tYW5kICkgbmUgIkFSUkFZIiApIHsKKyAgICAgICAgQ2FycDo6Y3JvYWsoICJleGVjdXRlOiAkY29tbWFuZCBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIGFycmF5IiApOworICAgIH07ICMgaWYKKworICAgIG15ICRzdGRpbiAgPSB7IGhhbmRsZSA9PiBcKlNURElOLCAgbW9kZSA9PiAiPCIgfTsKKyAgICBteSAkc3Rkb3V0ID0geyBoYW5kbGUgPT4gXCpTVERPVVQsIG1vZGUgPT4gIj4iIH07CisgICAgbXkgJHN0ZGVyciA9IHsgaGFuZGxlID0+IFwqU1RERVJSLCBtb2RlID0+ICI+IiB9OworICAgIG15ICRzdHJlYW1zID0geworICAgICAgICBzdGRpbiAgPT4gJHN0ZGluLAorICAgICAgICBzdGRvdXQgPT4gJHN0ZG91dCwKKyAgICAgICAgc3RkZXJyID0+ICRzdGRlcnIKKyAgICB9OyAjICRzdHJlYW1zCisKKyAgICBmb3IgbXkgJHN0cmVhbSAoIHF3KCBzdGRpbiBzdGRvdXQgc3RkZXJyICkgKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgIi0kc3RyZWFtIiB9ICkgKSB7CisgICAgICAgICAgICBpZiAoIHJlZiggJG9wdHN7ICItJHN0cmVhbSIgfSApICF+IG0vXEEofFNDQUxBUnxBUlJBWSlcei8gKSB7CisgICAgICAgICAgICAgICAgQ2FycDo6Y3JvYWsoICJleGVjdXRlOiAtJHN0cmVhbSBvcHRpb246IG11c3QgaGF2ZSB2YWx1ZSBvZiBzY2FsYXIsIG9yIHJlZmVyZW5jZSB0byAoc2NhbGFyIG9yIGFycmF5KS4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgcmVkaXIgfSA9ICRvcHRzeyAiLSRzdHJlYW0iIH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0c3sgLWFwcGVuZCB9IGFuZCAoICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyBtb2RlIH0gKSBlcSAiPiIgKSB7CisgICAgICAgICAgICAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgbW9kZSB9ID0gIj4+IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc3RyZWFtCisKKyAgICBfcHJlKCAkc3RkaW4gICk7CisgICAgX3ByZSggJHN0ZG91dCApOworICAgIGlmICggZGVmaW5lZCggJHN0ZGVyci0+eyByZWRpciB9ICkgYW5kIG5vdCByZWYoICRzdGRlcnItPnsgcmVkaXIgfSApIGFuZCAoICRzdGRlcnItPnsgcmVkaXIgfSBlcSAiIiApICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJHN0ZG91dC0+eyByZWRpciB9ICkgKSB7CisgICAgICAgICAgICAkc3RkZXJyLT57IHJlZGlyIH0gPSAkc3Rkb3V0LT57IHRlbXBfaGFuZGxlIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc3RkZXJyLT57IHJlZGlyIH0gPSAkeyAkc3Rkb3V0LT57IGhhbmRsZSB9IH07CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgX3ByZSggJHN0ZGVyciApOworICAgIG15ICRyYyA9IHN5c3RlbSggQCRjb21tYW5kICk7CisgICAgbXkgJGVycm5vID0gJCE7CisgICAgbXkgJGNoaWxkID0gJD87CisgICAgX3Bvc3QoICRzdGRlcnIgKTsKKyAgICBfcG9zdCggJHN0ZG91dCApOworICAgIF9wb3N0KCAkc3RkaW4gICk7CisKKyAgICBteSAkZXhpdCA9IDA7CisgICAgbXkgJHNpZ25hbF9udW0gID0gJGNoaWxkICYgMTI3OworICAgIG15ICRleGl0X3N0YXR1cyA9ICRjaGlsZCA+PiA4OworICAgICRAID0gIiI7CisKKyAgICBpZiAoICRyYyA9PSAtMSApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiBmYWlsZWQ6ICRlcnJubyI7CisgICAgICAgICRleGl0ID0gLTI1NjsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc2lnbmFsIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoICRzaWduYWxfbnVtICE9IDAgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgZmFpbGVkIGR1ZSB0byBzaWduYWwgJHNpZ25hbF9udW0uIjsKKyAgICAgICAgJGV4aXQgPSAtICRzaWduYWxfbnVtOworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zaWduYWwgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggJGV4aXRfc3RhdHVzICE9IDAgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgcmV0dXJuZWQgbm9uLXplcm8gc3RhdHVzICRleGl0X3N0YXR1cy4iOworICAgICAgICAkZXhpdCA9ICRleGl0X3N0YXR1czsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc3RhdHVzIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICRleGl0OworCit9OyAjIHN1YiBleGVjdXRlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGJhY2t0aWNrcyggWyBAY29tbWFuZCBdLCBAb3B0aW9ucyApPgorCitSdW4gc3BlY2lmaWVkIHByb2dyYW0gb3Igc2hlbGwgY29tbWFuZCBhbmQgcmV0dXJuIG91dHB1dC4KKworSW4gc2NhbGFyIGNvbnRleHQgZW50aXJlIG91dHB1dCBpcyByZXR1cm5lZCBpbiBhIHNpbmdsZSBzdHJpbmcuIEluIGxpc3QgY29udGV4dCBsaXN0IG9mIHN0cmluZ3MKK2lzIHJldHVybmVkLiBGdW5jdGlvbiBpc3N1ZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHNjcmlwdCBpZiBhbnkgZXJyb3Igb2NjdXJzLgorCis9Y3V0CisKKworc3ViIGJhY2t0aWNrcygkQCkgeworCisgICAgbXkgJGNvbW1hbmQgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgICA9IEBfOworICAgIG15IEBvdXRwdXQ7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWNob21wICkgXSApOworCisgICAgZXhlY3V0ZSggJGNvbW1hbmQsIC1zdGRvdXQgPT4gXEBvdXRwdXQgKTsKKworICAgIGlmICggJG9wdHN7IC1jaG9tcCB9ICkgeworICAgICAgICBjaG9tcCggQG91dHB1dCApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAoIHdhbnRhcnJheSgpID8gQG91dHB1dCA6IGpvaW4oICIiLCBAb3V0cHV0ICkgKTsKKworfTsgIyBzdWIgYmFja3RpY2tzCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgcGFkKCQkJCkgeworICAgIG15ICggJHN0ciwgJGxlbmd0aCwgJHBhZCApID0gQF87CisgICAgbXkgJGxzdHIgPSBsZW5ndGgoICRzdHIgKTsgICAgIyBMZW5ndGggb2Ygc291cmNlIHN0cmluZy4KKyAgICBpZiAoICRsc3RyIDwgJGxlbmd0aCApIHsKKyAgICAgICAgbXkgJGxwYWQgID0gbGVuZ3RoKCAkcGFkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHBhZC4KKyAgICAgICAgbXkgJGNvdW50ID0gaW50KCAoICRsZW5ndGggLSAkbHN0ciApIC8gJGxwYWQgKTsgICAgICMgTnVtYmVyIG9mIHBhZCByZXBldGl0aW9ucy4KKyAgICAgICAgbXkgJHRhaWwgID0gJGxlbmd0aCAtICggJGxzdHIgKyAkbHBhZCAqICRjb3VudCApOworICAgICAgICAkc3RyID0gJHN0ciAuICggJHBhZCB4ICRjb3VudCApIC4gc3Vic3RyKCAkcGFkLCAwLCAkdGFpbCApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHN0cjsKK307ICMgc3ViIHBhZAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1iYWNrCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JldHVybiAxOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWN1dAorCisjIEVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvbGludXguaW5jIGIvcmMxL3J1bnRpbWUvdG9vbHMvbGludXguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9saW51eC5pbmMKQEAgLTAsMCArMSwzNSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIyMjIyMjIERldGVjdGlvbnMgYW5kIENvbW1hbmRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmbmRlZiBhcmNoCisgICAgICAgIHVuYW1lX206PSQoc2hlbGwgdW5hbWUgLW0pCisgICAgICAgIGlmZXEgKCQodW5hbWVfbSksaTY4NikKKyAgICAgICAgICAgICAgICBleHBvcnQgYXJjaDo9MzIKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAoJCh1bmFtZV9tKSx4ODZfNjQpCisgICAgICAgICAgICAgICAgZXhwb3J0IGFyY2g6PTMyZQorICAgICAgICBlbmRpZgorICAgICAgICBpZm5kZWYgYXJjaAorICAgICAgICAgICAgICAgIGV4cG9ydCBhcmNoOj0kKHVuYW1lX20pCisgICAgICAgIGVuZGlmCitlbmRpZgorCitDTUQ9c2ggLWMKK0NXRD0kKHNoZWxsIHB3ZCkKK0NQPWNwCitSTT89cm0gLWYKK1JNUj89cm0gLXJmCitSRD89cm1kaXIKK01EPz1ta2RpciAtcAorTlVMPSAvZGV2L251bGwKK1NMQVNIPS8KZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL21hY29zLmluYyBiL3JjMS9ydW50aW1lL3Rvb2xzL21hY29zLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4NmIxCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvbWFjb3MuaW5jCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyMjIyMjIyBEZXRlY3Rpb25zIGFuZCBDb21tYW5kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5kZWYgYXJjaAorIGlmZXEgKCQoc2hlbGwgL3Vzci9zYmluL3N5c2N0bCAtbiBody5tYWNoaW5lKSxQb3dlciBNYWNpbnRvc2gpCisgICBpZmVxICgkKHNoZWxsIC91c3Ivc2Jpbi9zeXNjdGwgLW4gaHcub3B0aW9uYWwuNjRiaXRvcHMpLDEpCisgICAgIGV4cG9ydCBhcmNoOj1wcGM2NAorICAgZWxzZQorICAgICBleHBvcnQgYXJjaDo9cHBjMzIKKyAgIGVuZGlmCisgZWxzZQorICAgaWZlcSAoJChzaGVsbCAvdXNyL3NiaW4vc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLng4Nl82NCAyPi9kZXYvbnVsbCksMSkKKyAgICAgZXhwb3J0IGFyY2g6PWludGVsNjQKKyAgIGVsc2UKKyAgICAgZXhwb3J0IGFyY2g6PWlhMzIKKyAgIGVuZGlmCisgZW5kaWYKK2VuZGlmCisKK0NNRD0kKFNIRUxMKSAtYworQ1dEPSQoc2hlbGwgcHdkKQorUk0/PXJtIC1mCitSTVI/PXJtIC1yZgorUkQ/PXJtZGlyCitNRD89bWtkaXIgLXAKK05VTD0gL2Rldi9udWxsCitTTEFTSD0vCmRpZmYgLS1naXQgYS9yYzEvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4MmY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApAQCAtMCwwICsxLDc3NSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBFbmNvZGUgcXd7IGVuY29kZSB9OworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjA0IjsKK215ICRlc2NhcGUgICAgICA9IHFyeyV9OworbXkgJHBsYWNlaG9sZGVyID0gcXJ7KFxkKVwkKHN8bD9bZHVdKX07CisKK215ICRzZWN0aW9ucyA9CisgICAgeworICAgICAgICBtZXRhICAgICA9PiB7IHNob3J0ID0+ICJwcnAiIH0sICMgInBycCIgc3RhbmRzIGZvciAicHJvcGVydHkiLgorICAgICAgICBzdHJpbmdzICA9PiB7IHNob3J0ID0+ICJzdHIiIH0sCisgICAgICAgIGZvcm1hdHMgID0+IHsgc2hvcnQgPT4gImZtdCIgfSwKKyAgICAgICAgbWVzc2FnZXMgPT4geyBzaG9ydCA9PiAibXNnIiB9LAorICAgICAgICBoaW50cyAgICA9PiB7IHNob3J0ID0+ICJobnQiIH0sCisgICAgfTsKK215IEBzZWN0aW9ucyA9IHF3eyBtZXRhIHN0cmluZ3MgZm9ybWF0cyBtZXNzYWdlcyBoaW50cyB9OworIyBBc3NpZ24gc2VjdGlvbiBwcm9wZXJ0aWVzOiBsb25nIG5hbWUsIHNldCBudW1iZXIsIGJhc2UgbnVtYmVyLgorbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgbG9uZyB9ID0gJHNlY3Rpb25zWyAkXyBdLCAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IHNldCAgfSA9ICggJF8gKyAxICksICAgICAgICAgICAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBiYXNlIH0gPSAoICggJF8gKyAxICkgPDwgMTYgKSwgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworCisjIFByb3BlcnRpZXMgb2YgTWV0YSBzZWN0aW9uLgorbXkgQHByb3BlcnRpZXMgPSBxd3sgTGFuZ3VhZ2UgQ291bnRyeSBMYW5nSWQgVmVyc2lvbiBSZXZpc2lvbiB9OworCisKK3N1YiBfZ2VuZXJhdGVfY29tbWVudCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRvcGVuLCAkY2xvc2UgKSA9IEBfOworICAgIG15ICRidWxrID0KKyAgICAgICAgJG9wZW4gLiAiIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgIiAuICRjbG9zZSAuICJcbiIgLgorICAgICAgICAkb3BlbiAuICIgVGhlIGZpbGUgd2FzIGdlbmVyYXRlZCBmcm9tICIgLiBnZXRfZmlsZSggJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ICkgLgorICAgICAgICAgICAgIiBieSAiIC4gJHRvb2wgLiAiIG9uICIgLiBsb2NhbHRpbWUoKSAuICIuICIgLiAkY2xvc2UgLiAiXG4iOworICAgIHJldHVybiAkYnVsazsKKworfTsgIyBzdWIgX2dlbmVyYXRlX2NvbW1lbnQKKworCitzdWIgbXNnMnNnbigkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gc2lnbmF0dXJlLiBTaWduYXR1cmUgaXMgYSBsaXN0IG9mIHBsYWNlaG9sZGVycyBpbiBzb3J0ZWQgb3JkZXIuCisgICAgIyBGb3IgZXhhbXBsZSwgc2lnbmF0dXJlIG9mICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIiBpcyAiJTEkcyAlMiRzIi4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgbXkgQHBsYWNlaG9sZGVyczsKKyAgICBwb3MoICRtc2cgKSA9IDA7CisgICAgd2hpbGUgKCAkbXNnID1+IG17XEcuKj8kZXNjYXBlJHBsYWNlaG9sZGVyfWcgKSB7CisgICAgICAgICRwbGFjZWhvbGRlcnNbICQxIC0gMSBdID0gIiUkMVwkJDIiOworICAgIH07ICMgd2hpbGUKKyAgICBmb3IgKCBteSAkaSA9IDE7ICRpIDw9IEBwbGFjZWhvbGRlcnM7ICsrICRpICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSApICkgeworICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1sgJGkgLSAxIF0gPSAiJSRpXCQtIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yICRpCisgICAgcmV0dXJuIGpvaW4oICIgIiwgQHBsYWNlaG9sZGVycyApOworCit9OyAjIHN1YiBtc2cyc2duCisKKworc3ViIG1zZzJzcmMoJCkgeworCisgICAgIyBDb252ZXJ0IG1lc3NhZ2Ugc3RyaW5nIHRvIGEgQyBzdHJpbmcgY29uc3RhbnQuCisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJG1zZyA9fiBzeyRlc2NhcGUkcGxhY2Vob2xkZXJ9e1wlJDEhJDIhfWc7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbXNnOworCit9OyAjIHN1YiBtc2cyc3JjCisKKworbXkgJHNwZWNpYWwgPQorICAgIHsKKyAgICAgICAgIm4iID0+ICJcbiIsCisgICAgICAgICJ0IiA9PiAiXHQiLAorICAgIH07CisKK3N1YiBtc2cybWMoJCkgeworICAgIG15ICggJG1zZyApID0gQF87CisgICAgJG1zZyA9IG1zZzJzcmMoICRtc2cgKTsgIyBHZXQgd2luZG93cyBzdHlsZSBwbGFjZWhvbGRlcnMuCisgICAgJG1zZyA9fiBze1xcKC4pfXsgZXhpc3RzKCAkc3BlY2lhbC0+eyAkMSB9ICkgPyAkc3BlY2lhbC0+eyAkMSB9IDogJDEgfWdlOworICAgIHJldHVybiAkbXNnOworfTsgIyBzdWIgbXNnMm1jCisKKworCitzdWIgcGFyc2VfbWVzc2FnZSgkKSB7CisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGlmICggJG1zZyAhfiBte1xHLio/JGVzY2FwZX1nYyApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEckcGxhY2Vob2xkZXJ9Z2MgKSB7CisgICAgICAgICAgICByZXR1cm4gIkJhZCAlLXNlcXVlbmNlIG5lYXIgXCIlIiAuIHN1YnN0ciggJG1zZywgcG9zKCAkbXNnICksIDcgKSAuICJcIiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICByZXR1cm4gdW5kZWY7CisKK307ICMgc3ViIHBhcnNlX21lc3NhZ2UKKworCitzdWIgcGFyc2Vfc291cmNlKCQpIHsKKworICAgIG15ICggJG5hbWUgKSA9IEBfOworCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICRuYW1lLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworICAgIG15ICRkYXRhID0ge307CisKKyAgICBteSAkbGluZTsKKyAgICBteSAkbiA9IDA7ICAgICAgICAgIyBMaW5lIG51bWJlci4KKyAgICBteSAkb2Jzb2xldGUgPSAwOyAgIyBDb3VudGVyIG9mIG9ic29sZXRlIGVudHJpZXMuCisgICAgbXkgJGxhc3RfaWR4OworICAgIG15ICVpZGVudHM7CisgICAgbXkgJHNlY3Rpb247CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbiwgJGxpbmUsICRtc2cgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgJG5hbWUgbGluZSAkbjogIiAuICIkbXNnOlxuIiAuICIgICAgJGxpbmUiICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBmb3JlYWNoICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyooXG58Iyl9ICkgeworICAgICAgICAgICAgJGxhc3RfaWR4ID0gdW5kZWY7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgUGFyc2Ugc2VjdGlvbiBoZWFkZXIuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQS1cKi1ccyooW0EtWl9dKilccyotXCotXHMqXG5cen1pICkgeworICAgICAgICAgICAgJHNlY3Rpb24gPSAoIGxjKCAkMSApICk7CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkc2VjdGlvbiBlcSAkXywgQHNlY3Rpb25zICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gc2VjdGlvbiBcIiRzZWN0aW9uXCIgc3BlY2lmaWVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiTXVsdGlwbGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAlaWRlbnRzID0gKCk7ICAgICAjIENsZWFuIGxpc3Qgb2Yga25vd24gbWVzc2FnZSBpZGVudGlmaWVycy4KKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHNlY3Rpb24gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJTZWN0aW9uIGhlYWRpbmcgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGJvZHkuCisgICAgICAgIGlmICggJHNlY3Rpb24gZXEgIm1ldGEiICkgeworICAgICAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBKFtBLVpfXVtBLVpfMC05XSopXHMrIiguKikiXHMqP1xuP1x6fWkgKSB7CisgICAgICAgICAgICAgICAgIyBQYXJzZSBtZXRhIHByb3BlcnRpZXMgKHN1Y2ggYXMgTGFuZ3VhZ2UsIENvdW50cnksIGFuZCBMYW5nSWQpLgorICAgICAgICAgICAgICAgIG15ICggJHByb3BlcnR5LCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZ3JlcCggJF8gZXEgJHByb3BlcnR5ICwgQHByb3BlcnRpZXMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gcHJvcGVydHkgXCIkcHJvcGVydHlcIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IFwiJHByb3BlcnR5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IGxpbmUgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBtZXNzYWdlLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbWVzc2FnZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIGlmICggJGlkZW50IGVxICJPQlNPTEVURSIgKSB7CisgICAgICAgICAgICAgICAgIyBJZiBpZCBpcyAiT0JTT0xFVEUiLCBhZGQgYSB1bmlxdWUgc3VmZml4LiBJdCBwcm92aWRlcyBjb252ZW5pZW50IHdheSB0byBtYXJrCisgICAgICAgICAgICAgICAgIyBvYnNvbGV0ZSBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICArKyAkb2Jzb2xldGU7CisgICAgICAgICAgICAgICAgJGlkZW50IC49ICRvYnNvbGV0ZTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkaWRlbnRzeyAkaWRlbnQgfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJJZGVudGlmaWVyIFwiJGlkZW50XCIgaXMgcmVkZWZpbmVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBtZXNzYWdlLgorICAgICAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9LCBbICRpZGVudCwgJG1lc3NhZ2UgXSApOworICAgICAgICAgICAgJGlkZW50c3sgJGlkZW50IH0gPSAxOworICAgICAgICAgICAgJGxhc3RfaWR4ID0gQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9IC0gMTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBXHMqIiguKikiXHMqXHp9ICkgeworICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkMTsKKyAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRsYXN0X2lkeCApICApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5leHBlY3RlZCBjb250aW51YXRpb24gbGluZSIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgQ2hlY2sgJS1zZXF1ZW5jZXMuCisgICAgICAgICAgICBteSAkZXJyID0gcGFyc2VfbWVzc2FnZSggJG1lc3NhZ2UgKTsKKyAgICAgICAgICAgIGlmICggJGVyciApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAkZXJyICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIFNhdmUgY29udGludWF0aW9uLgorICAgICAgICAgICAgJGRhdGEtPnsgJHNlY3Rpb24gfS0+WyAkbGFzdF9pZHggXS0+WyAxIF0gLj0gJG1lc3NhZ2U7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNZXNzYWdlIGRlZmluaXRpb24gZXhwZWN0ZWQiICk7CisgICAgfTsgIyBmb3JlYWNoCisgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ID0gJG5hbWU7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkZGF0YS0+eyAkc2VjdGlvbiB9ICkgKSB7CisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9ID0gW107CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgIGZvcmVhY2ggbXkgJHByb3BlcnR5ICggQHByb3BlcnRpZXMgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyAkbmFtZTogIiAuCisgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBcIiRwcm9wZXJ0eVwiIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQiCisgICAgICAgICAgICApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHB1c2goIEB7ICRkYXRhLT57IG1ldGEgfSB9LCBbICRwcm9wZXJ0eSwgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9IF0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiAkZGF0YTsKKworfTsgIyBzdWIgcGFyc2Vfc291cmNlCisKKworc3ViIGdlbmVyYXRlX2VudW0oJCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSwgJHByZWZpeCApID0gQF87CisgICAgbXkgJGJ1bGsgPSAiIjsKKworICAgICRidWxrID0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgImVudW0gJHtwcmVmaXh9X2lkIHtcblxuIiAuCisgICAgICAgICIgICAgLy8gQSBzcGVjaWFsIGlkIGZvciBhYnNlbmNlIG9mIG1lc3NhZ2UuXG4iIC4KKyAgICAgICAgIiAgICAke3ByZWZpeH1fbnVsbCA9IDAsXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAvLyBTZXQgIyRwcm9wcy0+eyBzZXQgfSwgJHByb3BzLT57IGxvbmcgfS5cbiIgLgorICAgICAgICAgICAgIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fZmlyc3QgPSAkcHJvcHMtPnsgYmFzZSB9LFxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCB1bmRlZiApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fJHtpZGVudH0sXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fbGFzdCxcblxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV94eHhfbGFzdGVzdFxuXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIn07IC8vIGVudW0gJHtwcmVmaXh9X2lkXG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJ0eXBlZGVmIGVudW0gJHtwcmVmaXh9X2lkICAke3ByZWZpeH1faWRfdDtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZW51bQorCisKK3N1YiBnZW5lcmF0ZV9zaWduYXR1cmUoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0gIi8vIG1lc3NhZ2UgY2F0YWxvZyBzaWduYXR1cmUgZmlsZSAvL1xuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHByb3BzID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH07ICAgICMgU2VjdGlvbiBwcm9wZXJ0aWVzLgorICAgICAgICBteSAkc2hvcnQgPSAkcHJvcHMtPnsgc2hvcnQgfTsgICAgICAgICAgIyBTaG9ydCBzZWN0aW9uIG5hbWUsIGZyZXF1ZW50bHkgdXNlZC4KKyAgICAgICAgJGJ1bGsgLj0gIi0qLSAiIC4gdWMoICRwcm9wcy0+eyBsb25nIH0gKSAuICItKi1cblxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSBzcHJpbnRmKCAiJS00MHMgJXNcbiIsICRpZGVudCwgbXNnMnNnbiggJG1zZyApICk7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorCisgICAgJGJ1bGsgLj0gIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9zaWduYXR1cmUKKworCitzdWIgZ2VuZXJhdGVfZGVmYXVsdCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJzdGF0aWMgY2hhciBjb25zdCAqXG4iIC4KKyAgICAgICAgICAgICJfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0iIC4gIltdID1cbiIgLgorICAgICAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgICAgICIgICAgICAgIE5VTEwsXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAgICAgXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiLFxuIjsKKyAgICAgICAgfTsgIyB3aGlsZQorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAgICAgTlVMTFxuIiAuCisgICAgICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAic3RydWN0IGttcF9pMThuX3NlY3Rpb24ge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICBzaXplO1xuIiAuCisgICAgICAgICIgICAgY2hhciBjb25zdCAqKiBzdHI7XG4iIC4KKyAgICAgICAgIn07IC8vIHN0cnVjdCBrbXBfaTE4bl9zZWN0aW9uXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3NlY3Rpb24gIGttcF9pMThuX3NlY3Rpb25fdDtcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInN0YXRpYyBrbXBfaTE4bl9zZWN0aW9uX3RcbiIgLgorICAgICAgICAiX18ke3ByZWZpeH1fc2VjdGlvbnNbXSA9XG4iIC4KKyAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH0sXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICB7ICIgLiBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLiAiLCBfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0gfSxcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH1cbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIjsKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fdGFibGUge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBrbXBfaTE4bl9zZWN0aW9uX3QgKiAgc2VjdDtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3RhYmxlXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3RhYmxlICBrbXBfaTE4bl90YWJsZV90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3RhYmxlX3QgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICAiIC4gQHNlY3Rpb25zIC4gIixcbiIgLgorICAgICAgICAiICAgICAgICBfX2ttcF9pMThuX3NlY3Rpb25zXG4iIC4KKyAgICAgICAgIiAgICB9O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX2RlZmF1bHQKKworCitzdWIgZ2VuZXJhdGVfbWVzc2FnZV91bml4KCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSApID0gQF87CisgICAgbXkgJGJ1bGsgICAgID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICJcJCIsICJcJCIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiXCRxdW90ZSBcIlxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJcJCAiIC4gKCAiLSIgeCA3OCApIC4gIlxuXCQgJHNlY3Rpb25cblwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cbiIgLgorICAgICAgICAgICAgIlwkc2V0ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNldCB9XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0gIiRuIFwiIiAuIG1zZzJzcmMoICRtc2cgKSAuICJcIlxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIlwkIGVuZCBvZiBmaWxlIFwkXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWxheWVyID0+ICI6dXRmOCIgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfbWVzc2FnZV9saW51eAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworICAgIG15ICRsYW5ndWFnZSA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5ndWFnZSB9OworICAgIG15ICRsYW5naWQgICA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfTsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIjsiLCAiOyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiTGFuZ3VhZ2VOYW1lcyA9ICgkbGFuZ3VhZ2U9JGxhbmdpZDptc2dfJGxhbmdpZClcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIkZhY2lsaXR5TmFtZXM9KFxuIjsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICRwcm9wcy0+eyBzaG9ydCB9PSIgLiAkcHJvcHMtPnsgc2V0IH0gLiJcbiI7CisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIilcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRzaG9ydCA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNob3J0IH07CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICAgICAiTWVzc2FnZUlkPSRuXG4iIC4KKyAgICAgICAgICAgICAgICAiRmFjaWxpdHk9JHNob3J0XG4iIC4KKyAgICAgICAgICAgICAgICAiTGFuZ3VhZ2U9JGxhbmd1YWdlXG4iIC4KKyAgICAgICAgICAgICAgICBtc2cybWMoICRtc2cgKSAuICJcbi5cblxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRpdGVtCisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIjsgZW5kIG9mIGZpbGUgO1xuIjsKKworICAgICRidWxrID0gZW5jb2RlKCAiVVRGLTE2TEUiLCAkYnVsayApOyAjIENvbnZlcnQgdGV4dCB0byBVVEYtMTZMRSB1c2VkIGluIFdpbmRvd3MqIE9TLgorICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGssIC1iaW5hcnkgPT4gMSApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MKKworCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0X2ZpbGU7CitteSAkZW51bV9maWxlOworbXkgJHNpZ25hdHVyZV9maWxlOworbXkgJGRlZmF1bHRfZmlsZTsKK215ICRtZXNzYWdlX2ZpbGU7CitteSAkaWQ7CitteSAkcHJlZml4ID0gIiI7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiZW51bS1maWxlPXMiICAgICAgPT4gXCRlbnVtX2ZpbGUsCisgICAgInNpZ25hdHVyZS1maWxlPXMiID0+IFwkc2lnbmF0dXJlX2ZpbGUsCisgICAgImRlZmF1bHQtZmlsZT1zIiAgID0+IFwkZGVmYXVsdF9maWxlLAorICAgICJtZXNzYWdlLWZpbGU9cyIgICA9PiBcJG1lc3NhZ2VfZmlsZSwKKyAgICAiaWR8bGFuZy1pZCIgICAgICAgPT4gXCRpZCwKKyAgICAicHJlZml4PXMiCSAgICAgICA9PiBcJHByZWZpeCwKKyk7CitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IHNvdXJjZSBmaWxlcyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCiskaW5wdXRfZmlsZSA9ICRBUkdWWyAwIF07CisKKworbXkgJGdlbmVyYXRlX21lc3NhZ2U7CitpZiAoICR0YXJnZXRfb3MgPX4gbXtcQSg/OmxpbnxscmJ8bWFjKVx6fSApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV91bml4OworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UgPSBcJmdlbmVyYXRlX21lc3NhZ2Vfd2luZG93czsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9TIFwiJHRhcmdldF9vc1wiIGlzIG5vdCBzdXBwb3J0ZWQiICk7Cit9OyAjIGlmCisKKworIworIyBEbyB0aGUgd29yay4KKyMKKworbXkgJGRhdGEgPSBwYXJzZV9zb3VyY2UoICRpbnB1dF9maWxlICk7CitpZiAoIGRlZmluZWQoICRpZCApICkgeworICAgIHByaW50KCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgTGFuZ0lkIH0sICJcbiIgKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJGVudW1fZmlsZSApICkgeworICAgIGdlbmVyYXRlX2VudW0oICRkYXRhLCAkZW51bV9maWxlLCAkcHJlZml4ICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRzaWduYXR1cmVfZmlsZSApICkgeworICAgIGdlbmVyYXRlX3NpZ25hdHVyZSggJGRhdGEsICRzaWduYXR1cmVfZmlsZSApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZGVmYXVsdF9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZGVmYXVsdCggJGRhdGEsICRkZWZhdWx0X2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJG1lc3NhZ2VfZmlsZSApICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlLT4oICRkYXRhLCAkbWVzc2FnZV9maWxlICk7Cit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IC0tIENvbnZlcnQgbWVzc2FnZSBjYXRhbG9nIHNvdXJjZSBmaWxlIGludG8gYW5vdGhlciB0ZXh0IGZvcm1zLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gSTxvcHRpb24+Li4uIDxmaWxlPgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tZW51bS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIGVudW0gZmlsZSBuYW1lZCBJPGZpbGU+LgorCis9aXRlbSBCPC0tZGVmYXVsdC1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIGRlZmF1bHQgbWVzc2FnZXMgZmlsZSBuYW1lZCBJPGZpbGU+LgorCis9aXRlbSBCPC0tbGFuZy1pZD4KKworUHJpbnQgbGFuZ3VhZ2UgaWRlbnRpZmllciBvZiB0aGUgbWVzc2FnZSBjYXRhbG9nIHNvdXJjZSBmaWxlLgorCis9aXRlbSBCPC0tbWVzc2FnZS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIG1lc3NhZ2UgZmlsZS4KKworPWl0ZW0gQjwtLXNpZ25hdHVyZS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIHNpZ25hdHVyZSBmaWxlLgorCitTaWduYXR1cmVzIGFyZSB1c2VkIGZvciBjaGVja2luZyBjb21wYXRpYmlsaXR5LiBGb3IgZXhhbXBsZSwgdG8gY2hlY2sgYSBwcmltYXJ5CitjYXRhbG9nIGFuZCBpdHMgdHJhbnNsYXRpb24gdG8gYW5vdGhlciBsYW5ndWFnZSwgc2lnbmF0dXJlcyBvZiBib3RoIGNhdGFsb2dzIHNob3VsZCBiZSBnZW5lcmF0ZWQKK2FuZCBjb21wYXJlZC4gSWYgc2lnbmF0dXJlcyBhcmUgaWRlbnRpY2FsLCBjYXRhbG9ncyBhcmUgY29tcGF0aWJsZS4KKworPWl0ZW0gQjwtLXByZWZpeD0+STxwcmVmaXg+CisKK1ByZWZpeCB0byBiZSB1c2VkIGZvciBhbGwgQyBpZGVudGlmaWVycyAodHlwZSBhbmQgdmFyaWFibGUgbmFtZXMpIGluIGVudW0gYW5kIGRlZmF1bHQgbWVzc2FnZXMKK2ZpbGVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IE9TIG5hbWUgdGhlIG1lc3NhZ2UgZm9ybWF0cyB0byBiZSBjb252ZXJ0ZWQgZm9yLiBJZiBub3Qgc3BlY2lmaWVkIGV4cG9saWNpdGx5LCB2YWx1ZSBvZgorTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuIElmIExJQk9NUF9PUyBpcyBub3QgZGVmaW5lZCwgaG9zdCBPUyBpcyBkZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBjb252ZXJ0cyBtZXNzYWdlIGZvcm1hdHMgdG8gR05VIHN0eWxlIG9yIE1TIHN0eWxlLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gc3RyaW5nIGFuZCBleGl0LgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGlucHV0IGZpbGUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCis9aGVhZDIgTWVzc2FnZSBDYXRhbG9nIEZpbGUgRm9ybWF0CisKK0l0IGlzIHBsYWluIHRleHQgZmlsZSBpbiBVVEYtOCBlbmNvZGluZy4gRW1wdHkgbGluZXMgYW5kIGxpbmVzIGJlZ2lubmluZyB3aXRoIHNoYXJwIHNpZ24gKEM8Iz4pIGFyZQoraWdub3JlZC4gRUJORiBzeW50YXggb2YgY29udGVudDoKKworICAgIGNhdGFsb2cgICAgPSB7IHNlY3Rpb24gfTsKKyAgICBzZWN0aW9uICAgID0gaGVhZGVyIGJvZHk7CisgICAgaGVhZGVyICAgICA9ICItKi0gIiBzZWN0aW9uLWlkICIgLSotIiAiXG4iOworICAgIGJvZHkgICAgICAgPSB7IG1lc3NhZ2UgfTsKKyAgICBtZXNzYWdlICAgID0gbWVzc2FnZS1pZCBzdHJpbmcgIlxuIiB7IHN0cmluZyAiXG4iIH07CisgICAgc2VjdGlvbi1pZCA9IGlkZW50aWZpZXI7CisgICAgbWVzc2FnZS1pZCA9ICJPQlNPTEVURSIgfCBpZGVudGlmaWVyOworICAgIGlkZW50aWZpZXIgPSBsZXR0ZXIgeyBsZXR0ZXIgfCBkaWdpdCB8ICJfIiB9OworICAgIHN0cmluZyAgICAgPSAiIiIgeyBjaGFyYWN0ZXIgfSAiIiI7CisKK0lkZW50aWZpZXIgc3RhcnRzIHdpdGggbGV0dGVyLCB3aXRoIGZvbGxvd2luZyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3Jlcy4gSWRlbnRpZmllcnMgYXJlCitjYXNlLXNlbnNpdGl2ZS4gU2V0aW9uIGlkZW50aWZpZXJzIGFyZSBmaXhlZDogQzxNRVRBPiwgQzxTVFJJTkdTPiwgQzxGT1JNQVRTPiwgQzxNRVNTQUdFUz4gYW5kCitDPEhJTlRTPi4gTWVzc2FnZSBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gc2VjdGlvbi4gU3BlY2lhbCBDPE9CU09MRVRFPiBwc2V1ZG8taWRlbnRpZmllcgorbWF5IGJlIHVzZWQgbWFueSB0aW1lcy4KKworU3RyaW5nIGlzIGEgQyBzdHJpbmcgbGl0ZXJhbCB3aGljaCBtdXN0IG5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuCitMb25nIG1lc3NhZ2VzIG1heSBvY2N1cHkgbXVsdGlwbGUgbGluZXMsIGEgc3RyaW5nIHBlciBsaW5lLgorCitNZXNzYWdlIG1heSBpbmNsdWRlIHByaW50Zi1saWtlIEdOVS1zdHlsZSBwbGFjZWhvbGRlcnMgZm9yIGFyZ3VtZW50czogQzwlSTxuPiRJPHQ+PiwKK3doZXJlIEk8bj4gaXMgYXJndW1lbnQgbnVtYmVyIChDPDE+LCBDPDI+LCAuLi4pLAorSTx0PiAtLSBhcmd1bWVudCB0eXBlLCBDPHM+IChzdHJpbmcpIG9yIEM8ZD4gKDMyLWJpdCBpbnRlZ2VyKS4KKworU2VlIGFsc28gY29tbWVudHMgaW4gRjxpMThuL2VuX1VTLnR4dD4uCisKKz1oZWFkMiBPdXRwdXQgRmlsZXMKKworVGhpcyBzY3JpcHQgY2FuIGdlbmVyYXRlIDMgZGlmZmVyZW50IHRleHQgZmlsZXMgZnJvbSBzaW5nbGUgc291cmNlOgorCis9b3ZlcgorCis9aXRlbSBFbnVtIGZpbGUuCisKK0VudW0gZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGRlZmluaXRpb25zIG9mIG1lc3NhZ2UgaWRlbnRpZmllcnMsIGUuIGcuOgorCisgICAgZW51bSBrbXBfaTE4bl9pZCB7CisKKyAgICAgICAgLy8gU2V0ICMxLCBtZXRhLgorICAgICAgICBrbXBfaTE4bl9wcnBfZmlyc3QgPSA2NTUzNiwKKyAgICAgICAga21wX2kxOG5fcHJwX0xhbmd1YWdlLAorICAgICAgICBrbXBfaTE4bl9wcnBfQ291bnRyeSwKKyAgICAgICAga21wX2kxOG5fcHJwX0xhbmdJZCwKKyAgICAgICAga21wX2kxOG5fcHJwX1ZlcnNpb24sCisgICAgICAgIGttcF9pMThuX3BycF9SZXZpc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX2xhc3QsCisKKyAgICAgICAgLy8gU2V0ICMyLCBzdHJpbmdzLgorICAgICAgICBrbXBfaTE4bl9zdHJfZmlyc3QgPSAxMzEwNzIsCisgICAgICAgIGttcF9pMThuX3N0cl9FcnJvciwKKyAgICAgICAga21wX2kxOG5fc3RyX1Vua25vd25GaWxlLAorICAgICAgICBrbXBfaTE4bl9zdHJfTm90QU51bWJlciwKKyAgICAgICAgLi4uCisKKyAgICAgICAgLy8gU2V0ICMzLCBmb3RybWF0cy4KKyAgICAgICAgLi4uCisKKyAgICAgICAga21wX2kxOG5feHh4X2xhc3Rlc3QKKworICAgIH07IC8vIGVudW0ga21wX2kxOG5faWQKKworICAgIHR5cGVkZWYgZW51bSBrbXBfaTE4bl9pZCAga21wX2kxOG5faWRfdDsKKworPWl0ZW0gRGVmYXVsdCBtZXNzYWdlcyBmaWxlLgorCitEZWZhdWx0IG1lc3NhZ2VzIGZpbGUgaXMgYSBDIGluY2x1ZGUgZmlsZSBjb250YWluaW5nIGRlZmF1bHQgbWVzc2FnZXMgdG8gYmUgZW1iZWRkZWQgaW50bworYXBwbGljYXRpb24gKGFuZCB1c2VkIGlmIGV4dGVybmFsIG1lc3NhZ2UgY2F0YWxvZyBkb2VzIG5vdCBleGlzdCBvciBjb3VsZCBub3QgYmUgb3Blbik6CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqCisgICAgX19rbXBfaTE4bl9kZWZhdWx0X21ldGFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAiRW5nbGlzaCIsCisgICAgICAgICAgICAiVVNBIiwKKyAgICAgICAgICAgICIxMDMzIiwKKyAgICAgICAgICAgICIyIiwKKyAgICAgICAgICAgICIyMDA5MDgwNiIsCisgICAgICAgICAgICBOVUxMCisgICAgICAgIH07CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqCisgICAgX19rbXBfaTE4bl9kZWZhdWx0X3N0cmluZ3NbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgICJFcnJvciIsCisgICAgICAgICAgICAiKHVua25vd24gZmlsZSkiLAorICAgICAgICAgICAgIm5vdCBhIG51bWJlciIsCisgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIC4uLgorCis9aXRlbSBNZXNzYWdlIGZpbGUuCisKK01lc3NhZ2UgZmlsZSBpcyBhbiBpbnB1dCBmb3IgbWVzc2FnZSBjb21waWxlciwgRjxnZW5jYXQ+IG9uIExpbnV4KiBPUyBhbmQgT1MgWCosIG9yIEY8bWMuZXhlPiBvbgorV2luZG93cyogT1MuCisKK0hlcmUgaXMgdGhlIGV4YW1wbGUgb2YgTGludXgqIE9TIG1lc3NhZ2UgZmlsZToKKworICAgICRxdW90ZSAiCisgICAgMSAiSmFwYW5lc2UiCisgICAgMiAiSmFwYW4iCisgICAgMyAiMTA0MSIKKyAgICA0ICIyIgorICAgIDUgIkJhc2VkIG9uIEVubGlzaCBtZXNzYWdlIGNhdGFsb2cgcmV2aXNpb24gMjAwOTA4MDYiCisgICAgLi4uCisKK0V4YW1wbGUgb2YgV2luZG93cyogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgTGFuZ3VhZ2VOYW1lcyA9IChKYXBhbmVzZT0xMDA0MTptc2dfMTA0MSkKKworICAgIEZhY2lsaXR5TmFtZXMgPSAoCisgICAgIHBycD0xCisgICAgIHN0cj0yCisgICAgIGZtdD0zCisgICAgIC4uLgorICAgICkKKworICAgIE1lc3NhZ2VJZD0xCisgICAgRmFjaWxpdHk9cHJwCisgICAgTGFuZ3VhZ2U9SmFwYW5lc2UKKyAgICBKYXBhbmVzZQorICAgIC4KKworICAgIC4uLgorCis9aXRlbSBTaWduYXR1cmUuCisKK1NpZ25hdHVyZSBpcyBhIHByb2Nlc3NlZCBzb3VyY2UgZmlsZTogY29tbWVudHMgc3RyaXBwZWQsIHN0cmluZ3MgZGVsZXRlZCwgYnV0IHBsYWNlaG9sZGVycyBrZXB0IGFuZAorc29ydGVkLgorCisgICAgLSotIEZPUk1BVFMtKi0KKworICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgV2FybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBGYXRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIFN5c0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgSGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSQtICUyJHMKKyAgICBQcmFnbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJHMgJTIkcyAlMyRzICU0JHMKKworVGhlIHB1cnBvc2Ugb2Ygc2lnbmF0dXJlcyAtLSBjb21wYXJlIHR3byBtZXNzYWdlIHNvdXJjZSBmaWxlcyBmb3IgY29tcGF0aWJpbGl0eS4gSWYgc2lnbmF0dXJlcyBvZgordHdvIG1lc3NhZ2Ugc291cmNlcyBhcmUgdGhlIHNhbWUsIGJpbmFyeSBtZXNzYWdlIGNhdGFsb2dzIHdpbGwgYmUgY29tcGF0aWJsZS4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0dlbmVyYXRlIGluY2x1ZGUgZmlsZSBjb250YWluaW5nIG1lc3NhZ2UgaWRlbnRpZmllcnM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZW51bS1maWxlPWttcF9pMThuX2lkLmluYyBlbl9VUy50eHQKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhdGluZyBkZWZhdWx0IG1lc3NhZ2VzOgorCisgICAgJCBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLWRlZmF1bHQtZmlsZT1rbXBfaTE4bl9kZWZhdWx0LmluYyBlbl9VUy50eHQKKworR2VuZXJhdGUgaW5wdXQgZmlsZSBmb3IgbWVzc2FnZSBjb21waWxlciwgTGludXgqIE9TIGV4YW1wbGU6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tbWVzc2FnZS1maWxlPXJ1X1JVLlVURi04Lm1zZyBydV9SVS50eHQKKworR2VuZXJhdGUgaW5wdXQgZmlsZSBmb3IgbWVzc2FnZSBjb21waWxlciwgV2luZG93cyogT1MgZXhhbXBsZToKKworICAgID4gbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubWMgcnVfUlUudHh0CisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL29iamNvcHkuY3BwIGIvcmMxL3J1bnRpbWUvdG9vbHMvb2JqY29weS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkMThiMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL29iamNvcHkuY3BwCkBAIC0wLDAgKzEsNTIyIEBACisvKgorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3R5cGVkZWYgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPCBzdHJpbmdfdCA+ICAgICAgICAgIHN0cmluZ3NfdDsKK3R5cGVkZWYgc3RkOjptYXA8IHN0cmluZ190LCBzdHJpbmdfdCA+ICAgc3RyX2hhc2hfdDsKK3R5cGVkZWYgc3RkOjpwYWlyPCBzdHJpbmdfdCwgc3RyaW5nX3QgPiAgc3RyX3BhaXJfdDsKKyNpZmRlZiBfV0lOMzIKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyAgaW50NjRfdDsKKyNlbmRpZgorCitzdHJpbmdfdAorc2hpZnQoIHN0cmluZ3NfdCAmIHN0cnMgKSB7CisgICAgc3RyaW5nX3QgZmlyc3QgPSBzdHJzLmZyb250KCk7CisgICAgc3Rycy5lcmFzZSggc3Rycy5iZWdpbigpICk7CisgICAgcmV0dXJuIGZpcnN0OworfSAvLyBzaGlmdAorCitzdHJpbmdfdAorZmluZCgKKyAgICBzdHJfaGFzaF90IGNvbnN0ICYgaGFzaCwKKyAgICBzdHJpbmdfdCBjb25zdCAmICAga2V5CispIHsKKyAgICBzdHJpbmdfdCB2YWx1ZTsKKyAgICBzdHJfaGFzaF90Ojpjb25zdF9pdGVyYXRvciBpdCA9IGhhc2guZmluZCgga2V5ICk7CisgICAgaWYgKCBpdCAhPSBoYXNoLmVuZCgpICkgeworICAgICAgICB2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gdmFsdWU7Cit9IC8vIGZpbmQKKwordm9pZCBkaWUoIHN0cmluZ190IGNvbnN0ICYgbWVzc2FnZSApIHsKKyAgICBzdGQ6OmNlcnIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisgICAgZXhpdCggMSApOworfSAvLyBkaWUKKwordm9pZCBzdG9wKCBzdHJpbmdfdCBjb25zdCAmIG1lc3NhZ2UgKSB7CisgICAgcHJpbnRmKCAiJXNcbiIsIG1lc3NhZ2UuY19zdHIoKSApOworICAgIGV4aXQoIDEgKTsKK30KKworLy8gQW4gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiBhIC5vYmogZmlsZS4KK3N0cnVjdCBzeW1ib2xfdCB7CisgICAgbG9uZyBsb25nICAgICAgICBuYW1lOworICAgIHVuc2lnbmVkICAgICAgICAgdmFsdWU7CisgICAgdW5zaWduZWQgIHNob3J0ICBzZWN0aW9uX251bTsKKyAgICB1bnNpZ25lZCAgc2hvcnQgIHR5cGU7CisgICAgY2hhciAgICAgICAgICAgICBzdG9yYWdlX2NsYXNzOworICAgIGNoYXIgICAgICAgICAgICAgbkF1eDsKK307IC8vIHN0cnVjdCBzeW1ib2xfdAorCisKK2NsYXNzIF9yc3RyZWFtX3QgOiBwdWJsaWMgc3RkOjppc3Ryc3RyZWFtIHsKKworICAgIHByaXZhdGU6CisKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZjsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgICBfcnN0cmVhbV90KCBwYWlyPCBjb25zdCBjaGFyICosIHN0cmVhbXNpemUgPiBwICkKKyAgICAgICAgICAgIDogaXN0cnN0cmVhbSggcC5maXJzdCwgcC5zZWNvbmQgKSwgYnVmKCBwLmZpcnN0ICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgfl9yc3RyZWFtX3QoKSB7CisgICAgICAgICAgICBkZWxldGUgW10gYnVmOworICAgICAgICB9CisKK307IC8vIGNsYXNzIF9yc3RyZWFtX3QKKworLyogQSBzdHJlYW0gZW5jYXB1c2xhdGluZyB0aGUgY29udGVudCBvZiBhIGZpbGUgb3IgdGhlIGNvbnRlbnQgb2YgYSBzdHJpbmcsIG92ZXJyaWRpbmcgdGhlCisgICA+PiBvcGVyYXRvciB0byByZWFkIHZhcmlvdXMgaW50ZWdlciB0eXBlcyBpbiBiaW5hcnkgZm9ybSwgYXMgd2VsbCBhcyBhIHN5bWJvbCB0YWJsZQorICAgZW50cnkuCisqLworY2xhc3MgcnN0cmVhbV90IDogcHVibGljIF9yc3RyZWFtX3QgeworcHJpdmF0ZToKKworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSB0eXBlX3QgPgorICAgIGlubGluZSByc3RyZWFtX3QgJiBkb19yZWFkKCB0eXBlX3QgJiB4ICkgeworCXJlYWQoIChjaGFyKikgJiB4LCBzaXplb2YoIHR5cGVfdCApICk7CisJcmV0dXJuICogdGhpczsKKyAgICB9CisKKyAgICBzdGF0aWMgcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gZ2V0QnVmKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisJaWZzdHJlYW0gcmF3KGZpbGVOYW1lLGlvczo6YmluYXJ5IHwgaW9zOjppbik7CisJaWYoIXJhdy5pc19vcGVuKCkpCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciBvcGVuaW5nIGZpbGUiKTsKKwlyYXcuc2Vla2coMCxpb3M6OmVuZCk7CisJc3RyZWFtcG9zIGZpbGVTaXplID0gcmF3LnRlbGxnKCk7CisJaWYoZmlsZVNpemUgPCAwKQorCSAgICBzdG9wKCJyc3RyZWFtLmdldEJ1ZjogRXJyb3IgcmVhZGluZyBmaWxlIik7CisJY2hhciAqYnVmID0gbmV3IGNoYXJbZmlsZVNpemVdOworCXJhdy5zZWVrZygwLGlvczo6YmVnKTsKKwlyYXcucmVhZChidWYsIGZpbGVTaXplKTsKKwlyZXR1cm4gcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4oYnVmLGZpbGVTaXplKTsKKyAgICB9CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0IGZyb20gYSBzdHJpbmcKKyAgICByc3RyZWFtX3QoIGNvbnN0IGNoYXIgKiBidWYsIHN0cmVhbXNpemUgc2l6ZSApIDoKKyAgICAgICAgX3JzdHJlYW1fdCggcGFpcjwgY29uc3QgY2hhciAqLCBzdHJlYW1zaXplID4oIGJ1Ziwgc2l6ZSApICkKKyAgICB7fQorICAgIC8qIGNvbnN0cnVjdCBmcm9tIGEgZmlsZSB3aG9sZSBjb250ZW50IGlzIGZ1bGx5IHJlYWQgb25jZSB0byBpbml0aWFsaXplIHRoZSBjb250ZW50IG9mCisgICAgICAgdGhpcyBzdHJlYW0KKyAgICAqLworICAgIHJzdHJlYW1fdCggc3RyaW5nX3QgY29uc3QgJiBmaWxlTmFtZSApCisgICAgICAgIDogX3JzdHJlYW1fdCggZ2V0QnVmKCBmaWxlTmFtZS5jX3N0cigpICkgKQorICAgIHsKKyAgICB9CisKKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvciA+PiggaW50ICYgeCApIHsKKwlyZXR1cm4gZG9fcmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbV90ICYgb3BlcmF0b3IgPj4odW5zaWduZWQgJngpIHsKKwlyZXR1cm4gZG9fcmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbV90ICYgb3BlcmF0b3I+PihzaG9ydCAmeCkgeworCXJldHVybiBkb19yZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvX3JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW1fdCAmIG9wZXJhdG9yPj4oIHN5bWJvbF90ICYgZSApIHsKKwlyZWFkKChjaGFyKikmZSwgMTgpOworCXJldHVybiAqdGhpczsKKyAgICB9Cit9OyAvLyBjbGFzcyByc3RyZWFtX3QKKworLy8gc3RyaW5nIHRhYmxlIGluIGEgLk9CSiBmaWxlCitjbGFzcyBTdHJpbmdUYWJsZSB7Citwcml2YXRlOgorICAgIG1hcDxzdHJpbmcsIHVuc2lnbmVkPiBkaXJlY3Rvcnk7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBjaGFyICpkYXRhOworCisgICAgLy8gbWFrZSA8ZGlyZWN0b3J5PiBmcm9tIDxsZW5ndGg+IGJ5dGVzIGluIDxkYXRhPgorICAgIHZvaWQgbWFrZURpcmVjdG9yeSh2b2lkKSB7CisJdW5zaWduZWQgaSA9IDQ7CisJd2hpbGUoaSA8IGxlbmd0aCkgeworCSAgICBzdHJpbmcgcyA9IHN0cmluZyhkYXRhICsgaSk7CisJICAgIGRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHMsIGkpKTsKKwkgICAgaSArPSBzLnNpemUoKSArIDE7CisJfQorICAgIH0KKyAgICAvLyBpbml0aWFsaXplIDxsZW5ndGg+IGFuZCA8ZGF0YT4gd2l0aCBjb250ZW50cyBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50cworICAgIHZvaWQgaW5pdChjb25zdCBjaGFyICpfZGF0YSkgeworCXVuc2lnbmVkIF9sZW5ndGggPSAqKHVuc2lnbmVkKilfZGF0YTsKKworCWlmKF9sZW5ndGggPCBzaXplb2YodW5zaWduZWQpIHx8IF9sZW5ndGggIT0gKih1bnNpZ25lZCopX2RhdGEpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlLmluaXQ6IEludmFsaWQgc3ltYm9sIHRhYmxlIik7CisJaWYoX2RhdGFbX2xlbmd0aCAtIDFdKSB7CisJICAgIC8vIHRvIHByZXZlbnQgcnVuYXdheSBzdHJpbmdzLCBtYWtlIHN1cmUgdGhlIGRhdGEgZW5kcyB3aXRoIGEgemVybworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aCArIDFdOworCSAgICBkYXRhW19sZW5ndGhdID0gMDsKKwl9IGVsc2UgeworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aF07CisJfQorCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJbWVtY3B5KCBkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgX2RhdGEgKyBzaXplb2YodW5zaWduZWQpLCBsZW5ndGggLSBzaXplb2YodW5zaWduZWQpICk7CisJbWFrZURpcmVjdG9yeSgpOworICAgIH0KK3B1YmxpYzoKKyAgICBTdHJpbmdUYWJsZSggcnN0cmVhbV90ICYgZiApIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGJ5IHJlYWRpbmcgZnJvbSBmLgorCSAqLworCXN0cmVhbXBvcyBzOworCXVuc2lnbmVkIHN0clNpemU7CisJY2hhciAqc3RyRGF0YTsKKworCXMgPSBmLnRlbGxnKCk7CisJZj4+c3RyU2l6ZTsKKwlpZihzdHJTaXplIDwgc2l6ZW9mKHVuc2lnbmVkKSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIik7CisJc3RyRGF0YSA9IG5ldyBjaGFyW3N0clNpemVdOworCSoodW5zaWduZWQqKXN0ckRhdGEgPSBzdHJTaXplOworCS8vIHJlYWQgdGhlIHJhdyBkYXRhIGludG8gPHN0ckRhdGE+CisJZi5yZWFkKHN0ckRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBzdHJTaXplIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJcyA9IGYudGVsbGcoKSAtIHM7CisJaWYocyA8IHN0clNpemUpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBVbmV4cGVjdGVkIEVPRiIpOworCWluaXQoc3RyRGF0YSk7CisJZGVsZXRlW11zdHJEYXRhOworICAgIH0KKyAgICBTdHJpbmdUYWJsZShjb25zdCBzZXQ8c3RyaW5nPiAmc3RyaW5ncykgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgZnJvbSBnaXZlbiBzdHJpbmdzLgorCSAqLworCWNoYXIgKnA7CisJc2V0PHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworCXNpemVfdCBzOworCisJLy8gY291bnQgcmVxdWlyZWQgc2l6ZSBmb3IgZGF0YQorCWZvcihsZW5ndGggPSBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBzaXplX3QgbCA9ICgqaXQpLnNpemUoKTsKKworCSAgICBpZihsID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQlzdG9wKCJTdHJpbmdUYWJsZTogU3RyaW5nIHRvbyBsb25nIik7CisJICAgIGlmKGwgPiA4KSB7CisJCWxlbmd0aCArPSBsICsgMTsKKwkJaWYobGVuZ3RoID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFN5bWJvbCB0YWJsZSB0b28gbG9uZyIpOworCSAgICB9CisJfQorCWRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJLy8gcG9wdWxhdGUgZGF0YSBhbmQgZGlyZWN0b3J5CisJZm9yKHAgPSBkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgY29uc3Qgc3RyaW5nICZzdHIgPSAqaXQ7CisJICAgIHNpemVfdCBsID0gc3RyLnNpemUoKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIoc3RyLCBwIC0gZGF0YSkpOworCQltZW1jcHkocCwgc3RyLmNfc3RyKCksIGwpOworCQlwW2xdID0gMDsKKwkJcCArPSBsICsgMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgflN0cmluZ1RhYmxlKCkgeworCWRlbGV0ZVtdIGRhdGE7CisgICAgfQorICAgIC8qIFJldHVybnMgZW5jb2RpbmcgZm9yIGdpdmVuIHN0cmluZyBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiBzdHJpbmcgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA4IGJ1dCBzdHJpbmcgaXMgbm90IGluCisgICAgICAgdGhlIHN0cmluZyB0YWJsZS0tcmV0dXJucyAwLgorICAgICovCisgICAgaW50NjRfdCBlbmNvZGUoY29uc3Qgc3RyaW5nICZzdHIpIHsKKwlpbnQ2NF90IHI7CisKKwlpZihzdHIuc2l6ZSgpIDw9IDgpIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICAoKGNoYXIqKSZyKVs3XSA9IDA7CisJICAgIHN0cm5jcHkoKGNoYXIqKSZyLCBzdHIuY19zdHIoKSwgOCk7CisJICAgIHJldHVybiByOworCX0gZWxzZSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgbWFwPHN0cmluZyx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGlyZWN0b3J5LmZpbmQoc3RyKTsKKwkgICAgaWYoaXQgPT0gZGlyZWN0b3J5LmVuZCgpKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZW5jb2RlOiBTdHJpbmcgbm93IGZvdW5kIGluIHN0cmluZyB0YWJsZSIpOworCSAgICAoKHVuc2lnbmVkKikmcilbMF0gPSAwOworCSAgICAoKHVuc2lnbmVkKikmcilbMV0gPSAoKml0KS5zZWNvbmQ7CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgLyogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgeCBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiB4IHJlZmVyZW5jZXMgYW4gaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgdGFibGUtLXJldHVybnMKKyAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgorICAgICovCisgICAgc3RyaW5nIGRlY29kZShpbnQ2NF90IHgpIGNvbnN0IHsKKwlpZigqKHVuc2lnbmVkKikmeCA9PSAwKSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgdW5zaWduZWQgJnAgPSAoKHVuc2lnbmVkKikmeClbMV07CisJICAgIGlmKHAgPj0gbGVuZ3RoKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZGVjb2RlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSBsb29rdXAiKTsKKwkgICAgcmV0dXJuIHN0cmluZyhkYXRhICsgcCk7CisJfSBlbHNlIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICBjaGFyICpwID0gKGNoYXIqKSZ4OworCSAgICBpbnQgaTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCA4ICYmIHBbaV07ICsraSk7CisJICAgIHJldHVybiBzdHJpbmcocCwgaSk7CisJfQorICAgIH0KKyAgICB2b2lkIHdyaXRlKG9zdHJlYW0gJm9zKSB7CisJb3Mud3JpdGUoZGF0YSwgbGVuZ3RoKTsKKyAgICB9Cit9OworCisKK3ZvaWQKK29ial9jb3B5KAorICAgIHN0cmluZ190IGNvbnN0ICYgICAgc3JjLCAgICAvLyBOYW1lIG9mIHNvdXJjZSBmaWxlLgorICAgIHN0cmluZ190IGNvbnN0ICYgICAgZHN0LCAgICAvLyBOYW1lIG9mIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgc3RyX2hhc2hfdCBjb25zdCAmICByZWRlZnMgIC8vIExpc3Qgb2YgcmVkZWZpbml0aXRpb25zLgorKSB7CisKKyAgICBzZXQ8IHN0cmluZyA+IHN0cmluZ3M7IC8vIHNldCBvZiBhbGwgb2NjdXJyaW5nIHN5bWJvbHMsIGFwcHJvcHJpYXRlbHkgcHJlZml4ZWQKKyAgICBzdHJlYW1wb3MgZmlsZVNpemU7CisgICAgc2l6ZV90IHN0clRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bU5FbnRyaWVzOworICAgIGludCBpOworCisKKyAgICBzdHJpbmcgY29uc3QgZXJyb3JfcmVhZGluZyA9ICJFcnJvciByZWFkaW5nIFwiIiArIHNyYyArICJcIiBmaWxlOiAiOworCisgICAgcnN0cmVhbV90IGluKCBzcmMgKTsKKworICAgIGluLnNlZWtnKCAwLCBpb3M6OmVuZCApOworICAgIGZpbGVTaXplID0gaW4udGVsbGcoKTsKKworICAgIGluLnNlZWtnKCA4ICk7CisgICAgaW4gPj4gc3ltVGFiU3RhcnQgPj4gc3ltTkVudHJpZXM7CisgICAgc3RyVGFiU3RhcnQgPSBzeW1UYWJTdGFydCArIDE4ICogc2l6ZV90KCBzeW1ORW50cmllcyApOworICAgIGluLnNlZWtnKCBzdHJUYWJTdGFydCApOworICAgIGlmICggaW4uZW9mKCkgKSB7CisgICAgICAgIHN0b3AoIGVycm9yX3JlYWRpbmcgKyAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIgKTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVPbGQoIGluICk7IC8vIFJlYWQgb3JpZ2luYWwgc3RyaW5nIHRhYmxlLgorCisgICAgaWYgKCBpbi50ZWxsZygpICE9IGZpbGVTaXplICkgeworICAgICAgICBzdG9wKCBlcnJvcl9yZWFkaW5nICsgIlVuZXhwZWN0ZWQgZGF0YSBhZnRlciBzdHJpbmcgdGFibGUiICk7CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBzZXQgb2Ygb2NjdXJyaW5nIHN0cmluZ3Mgd2l0aCBwcmVmaXggYWRkZWQKKyAgICBmb3IgKCBpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArKyBpICkgeworCisJc3ltYm9sX3QgZTsKKworCWluLnNlZWtnKCBzeW1UYWJTdGFydCArIGkgKiAxOCApOworCWlmICggaW4uZW9mKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICAgICAgfQorCWluID4+IGU7CisJaWYgKCBpbi5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisgICAgICAgIH0KKwlpZiAoIGUubkF1eCApIHsKKyAgICAgICAgICAgIGkgKz0gZS5uQXV4OworICAgICAgICB9CisJY29uc3Qgc3RyaW5nICYgcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZSggZS5uYW1lICk7CisJLy8gaWYgc3ltYm9sIGlzIGV4dGVybiBhbmQgZm91bmQgaW4gPGhpZGU+LCBwcmVmaXggYW5kIGluc2VydCBpbnRvIHN0cmluZ3MsCisJLy8gb3RoZXJ3aXNlLCBqdXN0IGluc2VydCBpbnRvIHN0cmluZ3Mgd2l0aG91dCBwcmVmaXgKKyAgICAgICAgc3RyaW5nX3QgbmFtZSA9IGZpbmQoIHJlZGVmcywgcyApOworCXN0cmluZ3MuaW5zZXJ0KCBuYW1lICE9ICIiICYmIGUuc3RvcmFnZV9jbGFzcyA9PSAyID8gbmFtZSA6IHMgKTsKKyAgICB9CisKKyAgICBvZnN0cmVhbSBvdXQoIGRzdC5jX3N0cigpLCBpb3M6OnRydW5jIHwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSApOworICAgIGlmICggISBvdXQuaXNfb3BlbigpICkgeworICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSIpOworICAgIH0KKworICAgIC8vIG1ha2UgbmV3IHN0cmluZyB0YWJsZSBmcm9tIHN0cmluZyBzZXQKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU5ldyA9IFN0cmluZ1RhYmxlKCBzdHJpbmdzICk7CisKKyAgICAvLyBjb3B5IGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUgdXAgdG8ganVzdCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZQorICAgIGluLnNlZWtnKCAwICk7CisgICAgY2hhciAqIGJ1ZiA9IG5ldyBjaGFyWyBzeW1UYWJTdGFydCBdOworICAgIGluLnJlYWQoIGJ1Ziwgc3ltVGFiU3RhcnQgKTsKKyAgICBvdXQud3JpdGUoIGJ1Ziwgc3ltVGFiU3RhcnQgKTsKKyAgICBkZWxldGUgW10gYnVmOworCisgICAgLy8gY29weSBpbnB1dCBzeW1ib2wgdGFibGUgdG8gb3V0cHV0IHN5bWJvbCB0YWJsZSB3aXRoIG5hbWUgdHJhbnNsYXRpb24KKyAgICBmb3IgKCBpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArKyBpICkgeworCXN5bWJvbF90IGU7CisKKwlpbi5zZWVrZyggc3ltVGFiU3RhcnQgKyBpICogMTggKTsKKwlpZiAoIGluLmVvZigpICkgeworICAgICAgICAgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisgICAgICAgIH0KKwlpbiA+PiBlOworCWlmICggaW4uZmFpbCgpICkgeworICAgICAgICAgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworICAgICAgICB9CisJY29uc3Qgc3RyaW5nICYgcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZSggZS5uYW1lICk7CisJb3V0LnNlZWtwKCBzeW1UYWJTdGFydCArIGkgKiAxOCApOworICAgICAgICBzdHJpbmdfdCBuYW1lID0gZmluZCggcmVkZWZzLCBzICk7CisJZS5uYW1lID0gc3RyaW5nVGFibGVOZXcuZW5jb2RlKCAoIGUuc3RvcmFnZV9jbGFzcyA9PSAyICYmIG5hbWUgIT0gIiIgKSA/IG5hbWUgOiBzICk7CisJb3V0LndyaXRlKCAoY2hhciopICYgZSwgMTggKTsKKwlpZiAoIG91dC5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdG9wKCAiaGlkZVN5bWJvbHM6IEZpbGUgd3JpdGUgZXJyb3IiICk7CisgICAgICAgIH0KKwlpZiAoIGUubkF1eCApIHsKKwkgICAgLy8gY29weSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJpZXMKKwkgICAgaW50IG5BdXggPSBlLm5BdXg7CisJICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG5BdXg7ICsraiApIHsKKwkJaW4gPj4gZTsKKwkJb3V0LnNlZWtwKCBzeW1UYWJTdGFydCArICggaSArIGogKSAqIDE4ICk7CisJCW91dC53cml0ZSggKGNoYXIqKSAmIGUsIDE4ICk7CisJICAgIH0KKwkgICAgaSArPSBuQXV4OworCX0KKyAgICB9CisgICAgLy8gb3V0cHV0IHN0cmluZyB0YWJsZQorICAgIHN0cmluZ1RhYmxlTmV3LndyaXRlKCBvdXQgKTsKK30KKworCit2b2lkCitzcGxpdCggc3RyaW5nX3QgY29uc3QgJiBzdHIsIGNoYXIgY2gsIHN0cmluZ190ICYgaGVhZCwgc3RyaW5nX3QgJiB0YWlsICkgeworICAgIHN0cmluZ190OjpzaXplX3R5cGUgcG9zID0gc3RyLmZpbmQoIGNoICk7CisgICAgaWYgKCBwb3MgPT0gc3RyaW5nX3Q6Om5wb3MgKSB7CisgICAgICAgIGhlYWQgPSBzdHI7CisgICAgICAgIHRhaWwgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgICBoZWFkID0gc3RyLnN1YnN0ciggMCwgcG9zICk7CisgICAgICAgIHRhaWwgPSBzdHIuc3Vic3RyKCBwb3MgKyAxICk7CisgICAgfTsgLy8gaWYKK30gLy8gc3BsaXQKKworCit2b2lkIGhlbHAoKSB7CisgICAgc3RkOjpjb3V0CisgICAgICAgIDw8ICJOQU1FXG4iCisgICAgICAgIDw8ICIgICAgb2JqY29weSAtLSBjb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzXG4iCisgICAgICAgIDw8ICJcbiIKKyAgICAgICAgPDwgIlNZTk9QU0lTXG4iCisgICAgICAgIDw8ICIgICAgb2JqY29weSBvcHRpb25zLi4uIHNvdXJjZSBkZXN0aW5hdGlvblxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJPUFRJT05TXG4iCisgICAgICAgIDw8ICIgICAgLS1oZWxwICBQcmludCB0aGlzIGhlbHAgYW5kIGV4aXQuXG4iCisgICAgICAgIDw8ICIgICAgLS1yZWRlZmluZS1zeW0gb2xkPW5ld1xuIgorICAgICAgICA8PCAiICAgICAgICAgICAgUmVuYW1lIFwib2xkXCIgc3ltYm9sIGluIHNvdXJjZSBvYmplY3QgZmlsZSB0byBcIm5ld1wiIHN5bWJvbCBpblxuIgorICAgICAgICA8PCAiICAgICAgICAgICAgZGVzdGluYXRpb24gb2JqZWN0IGZpbGUuXG4iCisgICAgICAgIDw8ICIgICAgLS1yZWRlZmluZS1zeW1zIHN5bV9maWxlXG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICBGb3IgZWFjaCBwYWlyIFwib2xkIG5ld1wiIGluIHN5bV9maWxlIHJlbmFtZSBcIm9sZFwiIHN5bWJvbCBpbiBcbiIKKyAgICAgICAgPDwgIiAgICAgICAgICAgIHNvdXJjZSBvYmplY3QgZmlsZSB0byBcIm5ld1wiIHN5bWJvbCBpbiBkZXN0aW5hdGlvbiBvYmplY3QgZmlsZS5cbiIKKyAgICAgICAgPDwgIlxuIgorICAgICAgICA8PCAiQVJHVU1FTlRTXG4iCisgICAgICAgIDw8ICIgICAgc291cmNlICBUaGUgbmFtZSBvZiBzb3VyY2Ugb2JqZWN0IGZpbGUuXG4iCisgICAgICAgIDw8ICIgICAgZGVzdGluYXRpb25cbiIKKyAgICAgICAgPDwgIiAgICAgICAgICAgIFRoZSBuYW1lIG9mIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlLlxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJERVNDUklQVElPTlxuIgorICAgICAgICA8PCAiICAgIFRoaXMgcHJvZ3JhbSBpbXBsZW1lbnRzIGEgbWlub3IgYml0IG9mIExpbnV4KiBPUydzIG9iamNvcHkgdXRpbGl0eSBvbiBXaW5kb3dzKiBPUy5cbiIKKyAgICAgICAgPDwgIiAgICBJdCBjYW4gY29weSBvYmplY3QgZmlsZXMgYW5kIGVkaXQgaXRzIHN5bWJvbCB0YWJsZS5cbiIKKyAgICAgICAgPDwgIlxuIgorICAgICAgICA8PCAiRVhBTVBMRVNcbiIKKyAgICAgICAgPDwgIiAgICBcbiIKKyAgICAgICAgPDwgIiAgICAgICAgPiBvYmpjb3B5IC0tcmVkZWZpbmUtc3ltIGZhc3RjcHk9X194eHhfZmFzdGNweSBhLm9iaiBiLm9ialxuIgorICAgICAgICA8PCAiXG4iOworfSAvLyBoZWxwCisKKworaW50CittYWluKCBpbnQgYXJnYywgY2hhciBjb25zdCAqIGFyZ3ZbXSApIHsKKworICAgIHN0cmluZ3NfdCAgIGFyZ3MoIGFyZ2MgLSAxICk7CisgICAgc3RyX2hhc2hfdCAgcmVkZWZzOworICAgIHN0cmluZ3NfdCAgIGZpbGVzOworCisgICAgc3RkOjpjb3B5KCBhcmd2ICsgMSwgYXJndiArIGFyZ2MsIGFyZ3MuYmVnaW4oKSApOworCisgICAgd2hpbGUgKCBhcmdzLnNpemUoKSA+IDAgKSB7CisgICAgICAgIHN0cmluZ190IGFyZyA9IHNoaWZ0KCBhcmdzICk7CisgICAgICAgIGlmICggYXJnLnN1YnN0ciggMCwgMiApID09ICItLSIgKSB7CisgICAgICAgICAgICAvLyBBbiBvcHRpb24uCisgICAgICAgICAgICBpZiAoIDAgICkgeworICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICItLWhlbHAiICkgeworICAgICAgICAgICAgICAgIGhlbHAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAiLS1yZWRlZmluZS1zeW0iICkgeworICAgICAgICAgICAgICAgIGlmICggYXJncy5zaXplKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGllKCAiXCIiICsgYXJnICsgIlwiIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIC8vIHJlYWQgbGlzdCBvZiBzeW1ib2wgcGFpcnMgIm9sZCBuZXciIGZyb20gY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgICAgIHN0cmluZ190IHJlZGVmID0gc2hpZnQoIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdCBvbGRfc3ltOworICAgICAgICAgICAgICAgIHN0cmluZ190IG5ld19zeW07CisgICAgICAgICAgICAgICAgc3BsaXQoIHJlZGVmLCAnPScsIG9sZF9zeW0sIG5ld19zeW0gKTsKKyAgICAgICAgICAgICAgICBpZiAoIG9sZF9zeW0ubGVuZ3RoKCkgPT0gMCB8fCBuZXdfc3ltLmxlbmd0aCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGRpZSggIklsbGVnYWwgcmVkZWZpbml0aW9uOiBcIiIgKyByZWRlZiArICJcIjsgbmVpdGhlciBvbGQgc3ltYm9sIG5vciBuZXcgc3ltYm9sIG1heSBiZSBlbXB0eSIgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIHJlZGVmcy5pbnNlcnQoIHN0cl9wYWlyX3QoIG9sZF9zeW0sIG5ld19zeW0gKSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICItLXJlZGVmaW5lLXN5bXMiICkgeworICAgICAgICAgICAgICAgIGlmICggYXJncy5zaXplKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGllKCAiXCIiICsgYXJnICsgIlwiIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIC8vIHJlYWQgbGlzdCBvZiBzeW1ib2wgcGFpcnMgIm9sZCBuZXciIGZyb20gZmlsZS4KKyAgICAgICAgICAgICAgICBzdHJpbmdfdCBmbmFtZSA9IHNoaWZ0KCBhcmdzICk7CisgICAgICAgICAgICAgICAgc3RyaW5nX3QgcmVkZWY7CisJCWlmc3RyZWFtIGlmcyggZm5hbWUuY19zdHIoKSApOworCQl3aGlsZSAoIGlmcy5nb29kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGdldGxpbmUoIGlmcywgcmVkZWYgKTsvLyBnZXQgcGFpciBvZiBvbGQvbmV3IHN5bWJvbHMgc2VwYXJhdGVkIGJ5IHNwYWNlCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190IG9sZF9zeW07CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190IG5ld19zeW07CisgICAgICAgICAgICAgICAgICAgIC8vIEFDOiBnY291bnQoKSBkb2VzIG5vdCB3b3JrIGhlcmUgKGFsd2F5cyByZXR1cm4gMCksIHNvIGNvbW1lbnQgaXQKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAoIGlmcy5nY291bnQoKSApIHsgLy8gc2tpcCBlbXB0eSBsaW5lcworICAgICAgICAgICAgICAgICAgICBzcGxpdCggcmVkZWYsICcgJywgb2xkX3N5bSwgbmV3X3N5bSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIG9sZF9zeW0ubGVuZ3RoKCkgPT0gMCB8fCBuZXdfc3ltLmxlbmd0aCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGVuZCBvZiBmaWxlIHJlYWNoZWQgKGxhc3QgZW1wdHkgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZGllKCAiSWxsZWdhbCByZWRlZmluaXRpb246IFwiIiArIHJlZGVmICsgIlwiOyBuZWl0aGVyIG9sZCBzeW1ib2wgbm9yIG5ldyBzeW1ib2wgbWF5IGJlIGVtcHR5IiApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICByZWRlZnMuaW5zZXJ0KCBzdHJfcGFpcl90KCBvbGRfc3ltLCBuZXdfc3ltICkgKTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisJCX0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGllKCAiSWxsZWdhbCBvcHRpb246IFwiIiArIGFyZyArICJcIiIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3QgYW4gb3B0aW9uLCBhIGZpbGUgbmFtZS4KKyAgICAgICAgICAgIGlmICggZmlsZXMuc2l6ZSgpID49IDIgKSB7CisgICAgICAgICAgICAgICAgZGllKCAiVG9vIG1hbnkgZmlsZXMgc3BlY2lmaWVkOyB0d28gZmlsZXMgcmVxdWlyZWQgKHVzZSAtLWhlbHAgb3B0aW9uIGZvciBoZWxwKSIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBmaWxlcy5wdXNoX2JhY2soIGFyZyApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIHdoaWxlCisgICAgaWYgKCBmaWxlcy5zaXplKCkgPCAyICkgeworICAgICAgICBkaWUoICJOb3QgZW5vdWdoIGZpbGVzIHNwZWNpZmllZDsgdHdvIGZpbGVzIHJlcXVpcmVkICh1c2UgLS1oZWxwIG9wdGlvbiBmb3IgaGVscCkiICk7CisgICAgfTsgLy8gaWYKKworICAgIG9ial9jb3B5KCBmaWxlc1sgMCBdLCBmaWxlc1sgMSBdLCByZWRlZnMgKTsKKworICAgIHJldHVybiAwOworCit9IC8vIG1haW4KKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvcmVxdWlyZWQtb2JqZWN0cy5wbCBiL3JjMS9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjM3OGIwOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwKQEAgLTAsMCArMSw2MjkgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaWxlOjpHbG9iICI6Z2xvYiI7Cit1c2UgRGF0YTo6RHVtcGVyOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNCI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9mIG9iamVjdHM6ICAgICAgICMgUmVmIHRvIGhhc2gsIGtleXMgYXJlIG5hbWVzIG9mIG9iamVjdHMuCisjICAgICBvYmplY3QwOiAgICAgICAgICAjIFJlZiB0byBoYXNoIG9mIHR3byBlbGVtZW50cyB3aXRoIGtleXMgImRlZmluZWQiIGFuZCAidW5kZWZpbmVkIi4KKyMgICAgICAgICBkZWZpbmVkOiAgICAgICMgUmVmIHRvIGFycmF5IG9mIHN5bWJvbHMgZGVmaW5lZCBpbiBvYmplY3QwLgorIyAgICAgICAgICAgICAtIHN5bWJvbDAgIyBTeW1ib2wgbmFtZS4KKyMgICAgICAgICAgICAgLSAuLi4KKyMgICAgICAgICB1bmRlZmluZWQ6ICAgICMgUmVmIHRvIGFycmF5IG9mIHN5bWJvbHMgcmVmZXJlbmNlZCBpbiBvYmplY3QwLgorIyAgICAgICAgICAgICAtIHN5bWJvbDAKKyMgICAgICAgICAgICAgLSAuLi4KKyMgICAgIG9iamVjdDE6CisjICAgICAgICAgLi4uCisjICAgICAuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb2Ygc3ltYm9sczogICAgICAgIyBSZWYgdG8gaGFzaCwga2V5cyBhcmUgbmFtZXMgb2Ygc3ltYm9scy4KKyMgICAgc3ltYm9sMDogICAgICAgICAgICMgUmVmIHRvIGFycmF5IG9mIG9iamVjdCBuYW1lcyB3aGVyZSB0aGUgc3ltYm9sMCBpcyBkZWZpbmVkLgorIyAgICAgICAgLSBvYmplY3QwICAgICAgIyBPYmplY3QgZmlsZSBuYW1lLgorIyAgICAgICAgLSAuLi4KKyMgICAgc3ltYm9sMToKKyMgICAgICAgIC4uLgorIyAgICAuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGR1bXBfb2JqZWN0cygkJCQpIHsKKworICAgIG15ICggJHRpdGxlLCAkb2JqZWN0cywgJGR1bXAgKSA9IEBfOworCisgICAgaWYgKCAkZHVtcCA+IDAgKSB7CisgICAgICAgIFNUREVSUi0+cHJpbnQoICR0aXRsZSwgIlxuIiApOworICAgICAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBzb3J0KCBrZXlzKCAlJG9iamVjdHMgKSApICkgeworICAgICAgICAgICAgU1RERVJSLT5wcmludCggIiAgICAkb2JqZWN0XG4iICk7CisgICAgICAgICAgICBpZiAoICRkdW1wID4gMSApIHsKKyAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICBEZWZpbmVkIHN5bWJvbHM6XG4iICk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkc3ltYm9sICggc29ydCggQHsgJG9iamVjdHMtPnsgJG9iamVjdCB9LT57IGRlZmluZWQgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgICAgICAkc3ltYm9sXG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICBVbmRlZmluZWQgc3ltYm9sczpcbiIgKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBzb3J0KCBAeyAkb2JqZWN0cy0+eyAkb2JqZWN0IH0tPnsgdW5kZWZpbmVkIH0gfSApICkgeworICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICAgICAgJHN5bWJvbFxuIiApOworICAgICAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkc3ltYm9sCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkb2JqZWN0CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBkdW1wX29iamVjdHMKKworc3ViIGR1bXBfc3ltYm9scygkJCQpIHsKKworICAgIG15ICggJHRpdGxlLCAkc3ltYm9scywgJGR1bXAgKSA9IEBfOworCisgICAgaWYgKCAkZHVtcCA+IDAgKSB7CisgICAgICAgIFNUREVSUi0+cHJpbnQoICR0aXRsZSwgIlxuIiApOworICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBzb3J0KCBrZXlzKCAlJHN5bWJvbHMgKSApICkgeworICAgICAgICAgICAgU1RERVJSLT5wcmludCggIiAgICAkc3ltYm9sXG4iICk7CisgICAgICAgICAgICBpZiAoICRkdW1wID4gMSApIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBzb3J0KCBAeyAkc3ltYm9scy0+eyAkc3ltYm9sIH0gfSApICkgeworICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICAkb2JqZWN0XG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkb2JqZWN0CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBkdW1wX3N5bWJvbHMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBOYW1lOgorIyAgICAgbG9hZF9zeW1ib2xzIC0tIEZ1bGZpbGwgb2JqZWN0cyBkYXRhIHN0cnVjdHVyZSB3aXRoIHN5bWJvbCBuYW1lcy4KKyMgU3lub3BzaXM6CisjICAgICBsb2FkX3N5bWJvbHMoICRvYmplY3RzICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRvYmplY3RzIChpbi9vdXQpIC0tIFNldCBvZiBvYmplY3RzLiBPbiBlbnRlciwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0b3AtbGV2ZWwgaGFzaCBoYXMgZmlsbGVkCisjICAgICAgICAgd2l0aCBvYmplY3QgbmFtZXMgb25seS4gT24gZXhpdCwgaXQgaXMgY29tcGxldGVseSBmdWxmaWxsZWQgd2l0aCBsaXN0cyBvZiBzeW1ib2xzCisjICAgICAgICAgZGVmaW5lZCBvciByZWZlcmVuY2VkIGluIGVhY2ggb2JqZWN0IGZpbGUuCisjIFJldHVybnM6CisjICAgICBOb3RoaW5nLgorIyBFeGFtcGxlOgorIyAgICAgbXkgJG9iamVjdHMgPSB7IGZvby5vID0+IHt9IH07CisjICAgICBsb2FkX3N5bWJvbHMoICRvYmplY3RzICk7CisjICAgICAjIE5vdyAkb2JqZWN0cyBpcyB7IGdvby5vID0+IHsgZGVmaW5lZCA9PiBbIC4uLiBdLCB1bmRlZmluZWQgPT4gWyAuLi4gXSB9IH0uCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgdmVyc2lvbiBvZiBsb2FkX3N5bWJvbHMgcGFyc2VzIG91dHB1dCBvZiBubSBjb21tYW5kIGFuZCB3b3JrcyBvbiBMaW51eCogT1MgYW5kIE9TIFgqLgorIworc3ViIF9sb2FkX3N5bWJvbHNfbm0oJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgIyBJdCBpcyBhIHJlZiB0byBoYXNoLiBLZXlzIGFyZSBvYmplY3QgbmFtZXMsIHZhbHVlcyBhcmUgZW1wdHkgaGFzaGVzIChmb3Igbm93KS4KKyAgICBteSBAYnVsazsKKworICAgIGlmICggJSRvYmplY3RzICkgeworICAgICAgICAjIERvIG5vdCBydW4gbm0gaWYgYSBzZXQgb2Ygb2JqZWN0cyBpcyBlbXB0eSAtLSBubSB3aWxsIHRyeSB0byBvcGVuIGEub3V0IGluIHRoaXMgY2FzZS4KKyAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAibm0iLAorICAgICAgICAgICAgICAgICItZyIsICAgICMgRGlzcGxheSBvbmx5IGV4dGVybmFsIChnbG9iYWwpIHN5bWJvbHMuCisgICAgICAgICAgICAgICAgIi1vIiwgICAgIyBQcmVjZWRlIGVhY2ggc3ltYm9sIGJ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgorICAgICAgICAgICAgICAgIGtleXMoICUkb2JqZWN0cyApCisgICAgICAgICAgICAgICAgICAgICMgUnVubmluZyBubSBvbmNlIChyYXRoZXIgdGhhbiBvbmNlIHBlciBvYmplY3QpIGltcHJvdmVzIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgICAgICMgZHJhc3RpY2FsbHkuCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgLXN0ZG91dCA9PiBcQGJ1bGsKKyAgICAgICAgKTsKKyAgICB9OyAjIGlmCisKKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteKC4qKTooPzogP1swLTlhLWZdKnwgKikgKFtBLVphLXpdKSAoLiopJH0gKSB7CisgICAgICAgICAgICBkaWUgIkNhbm5vdCBwYXJzZSBubSBvdXRwdXQsIGxpbmU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkZmlsZSwgJHRhZywgJHN5bWJvbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgIGlmICggbm90IGV4aXN0cyggJG9iamVjdHMtPnsgJGZpbGUgfSApICkgeworICAgICAgICAgICAgZGllICJubSByZXBvcnRlZCB1bmtub3duIG9iamVjdCBmaWxlOlxuICAgICRsaW5lXG4iOworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgQUM6IGV4Y2x1ZGUgc29tZSBsaWJjIHN5bWJvbHMgZnJvbSByZW5hbWluZywgb3RoZXJ3aXNlIHdlIGhhdmUgcHJvYmxlbXMKKyAgICAgICAgIyAgICAgaW4gdGVzdHMgZm9yIGdmb3J0cmFuICsgc3RhdGljIGxpYmlvbXAgb24gTGluXzMyLgorICAgICAgICAjICAgICBUaGVzZSBzeW1ib2xzIGNhbWUgZnJvbSBsaWJ0YmJtYWxsb2MuYQorICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgKSB7CisgICAgICAgICAgICBpZiAoICRzeW1ib2wgPX4gbXtfX2k2ODZ9ICkgeworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIyBBQzogYWRkZWQgInciIHRvIHRhZ3Mgb2YgdW5kZWZpbmVkIHN5bWJvbHMsIGUuZy4gbWFsbG9jIGlzIHdlYWsgaW4gbGliaXJjIHYxMi4xLgorICAgICAgICBpZiAoICR0YWcgZXEgIlUiIG9yICR0YWcgZXEgInciICkgeyAjIFN5bWJvbCBub3QgZGVmaW5lZC4KKyAgICAgICAgICAgIHB1c2goIEB7ICRvYmplY3RzLT57ICRmaWxlIH0tPnsgdW5kZWZpbmVkIH0gfSwgJHN5bWJvbCApOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAjIFN5bWJvbCBkZWZpbmVkLgorICAgICAgICAgICAgcHVzaCggQHsgJG9iamVjdHMtPnsgJGZpbGUgfS0+eyBkZWZpbmVkIH0gfSwgJHN5bWJvbCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICByZXR1cm4gdW5kZWY7CisKK307ICMgc3ViIF9sb2FkX3N5bWJvbHNfbm0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHZlcnNpb24gb2YgbG9hZF9zeW1ib2xzIHBhcnNlcyBvdXRwdXQgb2YgbGluayBjb21tYW5kIGFuZCB3b3JrcyBvbiBXaW5kb3dzKiBPUy4KKyMKK3N1YiBfbG9hZF9zeW1ib2xzX2xpbmsoJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgIyBJdCBpcyBhIHJlZiB0byBoYXNoLiBLZXlzIGFyZSBvYmplY3QgbmFtZXMsIHZhbHVlcyBhcmUgZW1wdHkgaGFzaGVzIChmb3Igbm93KS4KKyAgICBteSBAYnVsazsKKworICAgIGlmICggJSRvYmplY3RzICkgeworICAgICAgICAjIERvIG5vdCBydW4gbm0gaWYgYSBzZXQgb2Ygb2JqZWN0cyBpcyBlbXB0eSAtLSBubSB3aWxsIHRyeSB0byBvcGVuIGEub3V0IGluIHRoaXMgY2FzZS4KKyAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAibGluayIsCisgICAgICAgICAgICAgICAgIi9kdW1wIiwKKyAgICAgICAgICAgICAgICAiL3N5bWJvbHMiLAorICAgICAgICAgICAgICAgIGtleXMoICUkb2JqZWN0cyApCisgICAgICAgICAgICAgICAgICAgICMgUnVubmluZyBubSBvbmNlIChyYXRoZXIgdGhhbiBvbmNlIHBlciBvYmplY3QpIGltcHJvdmVzIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgICAgICMgZHJhc3RpY2FsbHkuCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgLXN0ZG91dCA9PiBcQGJ1bGsKKyAgICAgICAgKTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkbnVtX3JlICAgPSBxcntbMC05QS1GXXszLDR9fTsKKyAgICBteSAkYWRkcl9yZSAgPSBxcntbMC05QS1GXXs4fX07CisgICAgbXkgJHRhZ19yZSAgID0gcXJ7REVCVUd8QUJTfFVOREVGfFNFQ1RbMC05QS1GXSt9OworICAgIG15ICRjbGFzc19yZSA9IHFye1N0YXRpY3xFeHRlcm5hbHxGaWxlbmFtZXxMYWJlbHxCZWdpbkZ1bmN0aW9ufEVuZEZ1bmN0aW9ufFdlYWtFeHRlcm5hbHxcLmJmIG9yXC5lZn07CisKKyAgICBteSAkZmlsZTsKKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQUR1bXAgb2YgZmlsZSAoLio/KVxuXHp9ICkgeworICAgICAgICAgICAgJGZpbGUgPSAkMTsKKyAgICAgICAgICAgIGlmICggbm90IGV4aXN0cyggJG9iamVjdHMtPnsgJGZpbGUgfSApICkgeworICAgICAgICAgICAgICAgIGRpZSAibGluayByZXBvcnRlZCB1bmtub3duIG9iamVjdCBmaWxlOlxuICAgICRsaW5lXG4iOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXtcQSRudW1fcmUgfSApIHsKKyAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRmaWxlICkgKSB7CisgICAgICAgICAgICAgICAgZGllICJsaW5rIHJlcG9ydGVkIHN5bWJvbCBvZiB1bmtub3duIG9iamVjdCBmaWxlOlxuICAgICRsaW5lXG4iOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCAkbGluZSAhfiBte1xBJG51bV9yZSAkYWRkcl9yZSAoJHRhZ19yZSlccytub3R5cGUoPzogXChcKSk/XHMrKCRjbGFzc19yZSlccytcfCAoLio/KVxuXHp9ICkgeworICAgICAgICAgICAgICAgIGRpZSAiQ2Fubm90IHBhcnNlIGxpbmsgb3V0cHV0LCBsaW5lOlxuICAgICRsaW5lXG4iOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgKCAkdGFnLCAkY2xhc3MsICRzeW1ib2wgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICAgICAgIyBsaW5rLmV4ZSAvZHVtcCBzb21ldGltZXMgcHJpbnRzIGNvbW1lbnRzIGZvciBzeW1ib2xzLCBlLiBnLjoKKyAgICAgICAgICAgICMgIi4/MF9tZW1jb3B5QSAoW0VudHJ5XSA/MF9tZW1jb3B5QSkiLCBvciAiPz9fQ0BfMDFBQHI/JEFBQCAoYHN0cmluZycpIi4KKyAgICAgICAgICAgICMgU3RyaXAgdGhlc2UgY29tbWVudHMuCisgICAgICAgICAgICAkc3ltYm9sID1+IHN7IFwoLipcKVx6fXt9OworICAgICAgICAgICAgaWYgKCAkY2xhc3MgZXEgIkV4dGVybmFsIiApIHsKKyAgICAgICAgICAgICAgICBpZiAoICR0YWcgZXEgIlVOREVGIiApIHsgIyBTeW1ib2wgbm90IGRlZmluZWQuCisgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRvYmplY3RzLT57ICRmaWxlIH0tPnsgdW5kZWZpbmVkIH0gfSwgJHN5bWJvbCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAjIFN5bWJvbCBkZWZpbmVkLgorICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyAkb2JqZWN0cy0+eyAkZmlsZSB9LT57IGRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBJZ25vcmUgYWxsIG90aGVyIGxpbmVzLgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICByZXR1cm4gdW5kZWY7CisKK307ICMgc3ViIF9sb2FkX3N5bWJvbHNfbGluaworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWU6CisjICAgICBzeW1ib2xzIC0tIENvbnN0cnVjdCBzZXQgb2Ygc3ltYm9scyB3aXRoIHNwZWNpZmllZCB0YWcgaW4gdGhlIHNwZWNpZmllZCBzZXQgb2Ygb2JqZWN0cy4KKyMgU3lub3BzaXM6CisjICAgICBteSAkc3ltYm9scyA9IGRlZmluZWRfc3ltYm9scyggJG9iamVjdHMsICR0YWcgKTsKKyMgQXJndW1lbnRzOgorIyAgICAgJG9iamVjdHMgKGluKSAtLSBTZXQgb2Ygb2JqZWN0cy4KKyMgICAgICR0YWcgKGluKSAtLSBBIHRhZywgImRlZmluZWQiIG9yICJ1bmRlZmluZWQiLgorIyBSZXR1cm5zOgorIyAgICAgU2V0IG9mIHN5bWJvbHMgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZy4KKyMKK3N1YiBzeW1ib2xzKCQkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgIG15ICR0YWcgICAgID0gc2hpZnQoIEBfICk7CisKKyAgICBteSAkc3ltYm9scyA9IHt9OworCisgICAgZm9yZWFjaCBteSAkb2JqZWN0ICgga2V5cyggJSRvYmplY3RzICkgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIEB7ICRvYmplY3RzLT57ICRvYmplY3QgfS0+eyAkdGFnIH0gfSApIHsKKyAgICAgICAgICAgIHB1c2goIEB7ICRzeW1ib2xzLT57ICRzeW1ib2wgfSB9LCAkb2JqZWN0ICk7CisgICAgICAgIH07ICMgZm9yZWFjaCAkc3ltYm9sCisgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKworICAgIHJldHVybiAkc3ltYm9sczsKKworfTsgIyBzdWIgc3ltYm9scworCitzdWIgZGVmaW5lZF9zeW1ib2xzKCQpIHsKKworICAgIG15ICRvYmplY3RzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRlZmluZWQgPSBzeW1ib2xzKCAkb2JqZWN0cywgImRlZmluZWQiICk7CisgICAgcmV0dXJuICRkZWZpbmVkOworCit9OyAjIHN1YiBkZWZpbmVkX3N5bWJvbHMKKworc3ViIHVuZGVmaW5lZF9zeW1ib2xzKCQpIHsKKworICAgIG15ICRvYmplY3RzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRlZmluZWQgPSBzeW1ib2xzKCAkb2JqZWN0cywgImRlZmluZWQiICk7CisgICAgbXkgJHVuZGVmaW5lZCA9IHN5bWJvbHMoICRvYmplY3RzLCAidW5kZWZpbmVkIiApOworICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIGtleXMoICUkZGVmaW5lZCApICkgeworICAgICAgICBkZWxldGUoICR1bmRlZmluZWQtPnsgJHN5bWJvbCB9ICk7CisgICAgfTsgIyBmb3JlYWNoIHN5bWJvbAorICAgIHJldHVybiAkdW5kZWZpbmVkOworCit9OyAjIHN1YiB1bmRlZmluZWRfc3ltYm9scworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWU6CisjICAgICBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyAtLSBTZWxlY3QgYSBzdWJzZXQgb2YgZXh0cmEgb2JqZWN0cyByZXF1aXJlZCB0byByZXNvbHZlIHVuZGVmaW5lZAorIyAgICAgICAgIHN5bWJvbHMgaW4gYSBzZXQgb2Ygb2JqZWN0cy4gSXQgaXMgYSBoZWxwZXIgc3ViIGZvciByZXF1aXJlZF9leHRyYV9vYmplY3RzKCkuCisjIFN5bm9wc2lzOgorIyAgICAgbXkgJHJlcXVpcmVkID0gX3JlcXVpcmVkX2V4dHJhX29iamVjdHMoICRvYmplY3RzLCAkZXh0cmEsICRzeW1ib2xzICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRvYmplY3RzIChpbikgLS0gQSBzZXQgb2Ygb2JqZWN0cyB0byBiZSBzZWFyY2hlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCisjICAgICAkZXh0cmEgKGluKSAtLSBBIHNldCBvZiBleHRyYSBvYmplY3RzIHRvIGJlIHNlYXJjaGVkIGZvciBkZWZpbmVkIHN5bWJvbHMgdG8gcmVzb2x2ZSB1bmRlZmluZWQKKyMgICAgICAgICBzeW1ib2xzIGluIG9iamVjdHMuCisjICAgICAkc3ltYm9scyAoaW4vb3V0KSAtLSBTZXQgb2Ygc3ltYm9scyBkZWZpbmVkIGluIHRoZSBzZXQgb2YgZXh0ZXJuYWwgb2JqZWN0cy4gQXQgdGhlIGZpcnN0IGNhbGwKKyMgICAgICAgICBpdCBzaG91bGQgY29uc2lzdCBvZiBhbGwgdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiBhbGwgdGhlIGV4dHJhIG9iamVjdHMuIFN5bWJvbHMgZGVmaW5lZCBpbgorIyAgICAgICAgIHRoZSBzZWxlY3RlZCBzdWJzZXQgb2YgZXh0cmEgb2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHNldCBvZiBkZWZpbmVkIHN5bWJvbHMsIGJlY2F1c2UKKyMgICAgICAgICB0aGV5IGFyZSBvdXQgb2YgaW50ZXJlc3QgZm9yIHN1YnNlcXVlbnQgY2FsbHMuCisjIFJldHVybnM6CisjICAgICBBIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc2V0IG9mIG9iamVjdHMuCisjCitzdWIgX3JlcXVpcmVkX2V4dHJhX29iamVjdHMoJCQkJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZXh0cmEgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRzeW1ib2xzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGR1bXAgICAgPSBzaGlmdCggQF8gKTsKKworICAgIG15ICRyZXF1aXJlZCA9IHt9OworCisgICAgaWYgKCAkZHVtcCA+IDAgKSB7CisgICAgICAgIFNUREVSUi0+cHJpbnQoICJSZXF1aXJlZCBleHRyYSBvYmplY3RzOlxuIiApOworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBrZXlzKCAlJG9iamVjdHMgKSApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkc3ltYm9sICggQHsgJG9iamVjdHMtPnsgJG9iamVjdCB9LT57IHVuZGVmaW5lZCB9IH0gKSB7CisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJHN5bWJvbHMtPnsgJHN5bWJvbCB9ICkgKSB7CisgICAgICAgICAgICAgICAgIyBBZGQgYWxsIG9iamVjdHMgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIHRvIHRoZSByZXF1aXJlZCBvYmplY3RzLgorICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHJlcV9vYmogKCBAeyAkc3ltYm9scy0+eyAkc3ltYm9sIH0gfSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkZHVtcCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICRyZXFfb2JqXG4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRkdW1wID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICBieSAkb2JqZWN0XG4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RERVJSLT5wcmludCggIiAgICAgICAgICAgIGR1ZSB0byAkc3ltYm9sXG4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJHJlcXVpcmVkLT57ICRyZXFfb2JqIH0gPSAkZXh0cmEtPnsgJHJlcV9vYmogfTsKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2ggJHJlcV9vYmoKKyAgICAgICAgICAgICAgICAjIERlbGV0ZSB0aGUgc3ltYm9sIGZyb20gbGlzdCBvZiBkZWZpbmVkIHN5bWJvbHMuCisgICAgICAgICAgICAgICAgZGVsZXRlKCAkc3ltYm9scy0+eyAkc3ltYm9sIH0gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICB9OyAjIGZvcmVhY2ggJG9iamVjdAorCisgICAgcmV0dXJuICRyZXF1aXJlZDsKKworfTsgIyBzdWIgX3JlcXVpcmVkX2V4dHJhX29iamVjdHMKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWU6CisjICAgICByZXF1aXJlZF9leHRyYV9vYmplY3RzIC0tIFNlbGVjdCBhIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIHJlcXVpcmVkIHRvIHJlc29sdmUgdW5kZWZpbmVkCisjICAgICAgICAgc3ltYm9scyBpbiBhIHNldCBvZiBiYXNlIG9iamVjdHMgYW5kIHNlbGVjdGVkIGV4dHJhIG9iamVjdHMuCisjIFN5bm9wc2lzOgorIyAgICAgbXkgJHJlcXVpcmVkID0gcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGJhc2UsICRleHRyYSApOworIyBBcmd1bWVudHM6CisjICAgICAkYmFzZSAoaW4vb3V0KSAtLSBBIHNldCBvZiBiYXNlIG9iamVjdHMgdG8gYmUgc2VhcmNoZWQgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLiBPbiBlbnRlciwgaXQgaXMKKyMgICAgICAgICBleHBlY3RlZCB0aGF0IHRvcC1sZXZlbCBoYXNoIGhhcyBmaWxsZWQgd2l0aCBvYmplY3QgbmFtZXMgb25seS4gT24gZXhpdCwgaXQgaXMgY29tcGxldGVseQorIyAgICAgICAgIGZ1bGZpbGxlZCB3aXRoIGxpc3RzIG9mIHN5bWJvbHMgZGVmaW5lZCBhbmQvb3IgcmVmZXJlbmNlZCBpbiBlYWNoIG9iamVjdCBmaWxlLgorIyAgICAgJGV4dHJhIChpbi9vdXQpIC0tIEEgc2V0IG9mIGV4dHJhIG9iamVjdHMgdG8gYmUgc2VhcmNoZWQgZm9yIGRlZmluZWQgc3ltYm9scyByZXF1aXJlZCB0bworIyAgICAgICAgIHJlc29sdmUgdW5kZWZpbmVkIHN5bWJvbHMgaW4gYSBzZXQgb2YgYmFzZSBvYmplY3RzLiBVc2FnZSBpcyBzaW1pbGFyIHRvIGJhc2Ugb2JqZWN0cy4KKyMgUmV0dXJuczoKKyMgICAgIEEgc3Vic2V0IG9mIGV4dHJhIG9iamVjdCBmaWxlcy4KKyMKK3N1YiByZXF1aXJlZF9leHRyYV9vYmplY3RzKCQkJCkgeworCisgICAgbXkgJGJhc2UgICAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZXh0cmEgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkdW1wICAgID0gc2hpZnQoIEBfICk7CisKKyAgICAjIExvYWQgc3ltYm9scyBmb3IgZWFjaCBvYmplY3QuCisgICAgbG9hZF9zeW1ib2xzKCAkYmFzZSApOworICAgIGxvYWRfc3ltYm9scyggJGV4dHJhICk7CisgICAgaWYgKCAkZHVtcCApIHsKKyAgICAgICAgZHVtcF9vYmplY3RzKCAiQmFzZSBvYmplY3RzOiIsICRiYXNlLCAkZHVtcCApOworICAgICAgICBkdW1wX29iamVjdHMoICJFeHRyYSBvYmplY3RzOiIsICRleHRyYSwgJGR1bXAgKTsKKyAgICB9OyAjIGlmCisKKyAgICAjIENvbGxlY3Qgc3ltYm9scyBkZWZpbmVkIGluIGV4dHJhIG9iamVjdHMuCisgICAgbXkgJHN5bWJvbHMgPSBkZWZpbmVkX3N5bWJvbHMoICRleHRyYSApOworCisgICAgbXkgJHJlcXVpcmVkID0ge307CisgICAgIyBTZWxlY3QgZXh0cmEgb2JqZWN0cyByZXF1aXJlZCBieSBiYXNlIG9iamVjdHMuCisgICAgbXkgJGRlbHRhID0gX3JlcXVpcmVkX2V4dHJhX29iamVjdHMoICRiYXNlLCAkZXh0cmEsICRzeW1ib2xzLCAkZHVtcCApOworICAgIHdoaWxlICggJSRkZWx0YSApIHsKKyAgICAgICAgJSRyZXF1aXJlZCA9ICggJSRyZXF1aXJlZCwgJSRkZWx0YSApOworICAgICAgICAjIFByb2JhYmx5LCBqdXN0IHNlbGVjdGVkIG9iamVjdHMgcmVxdWlyZSBzb21lIG1vcmUgb2JqZWN0cy4KKyAgICAgICAgJGRlbHRhID0gX3JlcXVpcmVkX2V4dHJhX29iamVjdHMoICRkZWx0YSwgJGV4dHJhLCAkc3ltYm9scywgJGR1bXAgKTsKKyAgICB9OyAjIHdoaWxlCisKKyAgICBpZiAoICRkdW1wICkgeworICAgICAgICBteSAkYmFzZV91bmRlZmluZWQgPSB1bmRlZmluZWRfc3ltYm9scyggJGJhc2UgKTsKKyAgICAgICAgbXkgJHJlcV91bmRlZmluZWQgPSB1bmRlZmluZWRfc3ltYm9scyggJHJlcXVpcmVkICk7CisgICAgICAgIGR1bXBfc3ltYm9scyggIlN5bWJvbHMgdW5kZWZpbmVkIGluIGJhc2Ugb2JqZWN0czoiLCAkYmFzZV91bmRlZmluZWQsICRkdW1wICk7CisgICAgICAgIGR1bXBfc3ltYm9scyggIlN5bWJvbHMgdW5kZWZpbmVkIGluIHJlcXVpcmVkIG9iamVjdHM6IiwgJHJlcV91bmRlZmluZWQsICRkdW1wICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICRyZXF1aXJlZDsKKworfTsgIyBzdWIgcmVxdWlyZWRfZXh0cmFfb2JqZWN0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIGNvcHlfb2JqZWN0cyAtLSBDb3B5IChhbmQgb3B0aW9uYWxseSBlZGl0KSBvYmplY3QgZmlsZXMgdG8gc3BlY2lmaWVkIGRpcmVjdG9yeS4KKyMgU3lub3BzaXM6CisjICAgICBjb3B5X29iamVjdHMoICRvYmplY3RzLCAkdGFyZ2V0LCAkcHJlZml4LCBAc3ltYm9scyApOworIyBBcmd1bWVudHM6CisjICAgICAkb2JqZWN0cyAoaW4pIC0tIEEgc2V0IG9mIG9iamVjdCBmaWxlcy4KKyMgICAgICR0YXJnZXQgKGluKSAtLSBBIG5hbWUgb2YgdGFyZ2V0IGRpcmVjdG9yeS4gRGlyZWN0b3J5IG11c3QgZXhpc3QuCisjICAgICAkcHJlZml4IChpbikgLS0gQSBwcmVmaXggdG8gYWRkIHRvIGFsbCB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gQHN5bWJvbHMuIElmIHByZWZpeCBpcyB1bmRlZmluZWQsCisjICAgICAgICAgb2JqZWN0IGZpbGVzIGFyZSBqdXN0IGNvcGllZC4KKyMgICAgIEBzeW1ib2xzIChpbikgLS0gTGlzdCBvZiBzeW1ib2wgbmFtZXMgdG8gYmUgcmVuYW1lZC4KKyMgUmV0dXJuczoKKyMgICAgIE5vbmUuCisjCitzdWIgY29weV9vYmplY3RzKCQkOyRcQCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkdGFyZ2V0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRwcmVmaXggID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHN5bWJvbHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSBAcmVkZWZpbmU7CisgICAgbXkgQHJlZGVmaW5lXzsKKyAgICBteSAkc3ltc19maWxlID0gIl9fa21wX3N5bV9wYWlycy5sb2ciOworCisgICAgaWYgKCBub3QgLWUgJHRhcmdldCApIHsKKyAgICAgICAgZGllICJcIiR0YXJnZXRcIiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3RcbiI7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICR0YXJnZXQgKSB7CisgICAgICAgIGRpZSAiXCIkdGFyZ2V0XCIgaXMgbm90IGEgZGlyZWN0b3J5XG4iOworICAgIH07ICMgaWYKKworICAgIGlmICggZGVmaW5lZCggJHByZWZpeCApIGFuZCBAJHN5bWJvbHMgKSB7CisgICAgICAgIG15ICVhID0gbWFwICggKCAiJF8gJHByZWZpeCRfIiA9PiAxICksIEAkc3ltYm9scyApOworICAgICAgICBAcmVkZWZpbmVfID0ga2V5cyggJWEgKTsKKyAgICB9OyAjIGlmCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEByZWRlZmluZV8gKSB7CisgICAgICAgICRsaW5lID1+IHN7JHByZWZpeChcVyspfXskMSRwcmVmaXh9OworICAgICAgICBwdXNoKCBAcmVkZWZpbmUsICRsaW5lICk7CisgICAgfQorICAgIHdyaXRlX2ZpbGUoICRzeW1zX2ZpbGUsIFxAcmVkZWZpbmUgKTsKKyAgICBmb3JlYWNoIG15ICRzcmMgKCBzb3J0KCBrZXlzKCAlJG9iamVjdHMgKSApICkgeworICAgICAgICBteSAkZHN0ID0gY2F0X2ZpbGUoICR0YXJnZXQsIGdldF9maWxlKCAkc3JjICkgKTsKKyAgICAgICAgaWYgKCBAcmVkZWZpbmUgKSB7CisgICAgICAgICAgICBleGVjdXRlKCBbICJvYmpjb3B5IiwgIi0tcmVkZWZpbmUtc3ltcyIsICRzeW1zX2ZpbGUsICRzcmMsICRkc3QgXSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29weV9maWxlKCAkc3JjLCAkZHN0LCAtb3ZlcndyaXRlID0+IDEgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb2JqZWN0CisKK307ICMgc3ViIGNvcHlfb2JqZWN0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFpbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJGJhc2UgID0ge307CitteSAkZXh0cmEgPSB7fTsKK215ICRzd2l0Y2hlciA9ICRiYXNlOworbXkgJGR1bXAgPSAwOworbXkgJHByaW50X2Jhc2U7CitteSAkcHJpbnRfZXh0cmE7CitteSAkY29weV9iYXNlOworbXkgJGNvcHlfZXh0cmE7CitteSAkcHJlZml4OworCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKworR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJwZXJtdXRlIiApOworZ2V0X29wdGlvbnMoCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCisgICAgImJhc2UiICAgICAgICAgPT4gc3ViIHsgJHN3aXRjaGVyID0gJGJhc2U7ICB9LAorICAgICJleHRyYSIgICAgICAgID0+IHN1YiB7ICRzd2l0Y2hlciA9ICRleHRyYTsgfSwKKyAgICAicHJpbnQtYmFzZSIgICA9PiBcJHByaW50X2Jhc2UsCisgICAgInByaW50LWV4dHJhIiAgPT4gXCRwcmludF9leHRyYSwKKyAgICAicHJpbnQtYWxsIiAgICA9PiBzdWIgeyAkcHJpbnRfYmFzZSA9IDE7ICRwcmludF9leHRyYSA9IDE7IH0sCisgICAgImNvcHktYmFzZT1zIiAgPT4gXCRjb3B5X2Jhc2UsCisgICAgImNvcHktZXh0cmE9cyIgPT4gXCRjb3B5X2V4dHJhLAorICAgICJjb3B5LWFsbD1zIiAgID0+IHN1YiB7ICRjb3B5X2Jhc2UgPSAkX1sgMSBdOyAkY29weV9leHRyYSA9ICRfWyAxIF07IH0sCisgICAgImR1bXAiICAgICAgICAgPT4gc3ViIHsgKysgJGR1bXA7IH0sCisgICAgInByZWZpeD1zIiAgICAgPT4gXCRwcmVmaXgsCisgICAgIjw+IiAgICA9PgorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJGFyZyA9ICRfWyAwIF07CisgICAgICAgICAgICBteSBAYXJnczsKKyAgICAgICAgICAgIGlmICggJF5PIGVxICJNU1dpbjMyIiApIHsKKyAgICAgICAgICAgICAgICAjIFdpbmRvd3MqIE9TIGRvZXMgbm90IGV4cGFuZCB3aWxkY2FyZHMuIERvIGl0Li4uCisgICAgICAgICAgICAgICAgQGFyZ3MgPSBic2RfZ2xvYiggJGFyZyApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBAYXJncyA9ICggJGFyZyApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgZm9yZWFjaCBteSAkb2JqZWN0ICggQGFyZ3MgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRiYXNlLT57ICRvYmplY3QgfSApIG9yIGV4aXN0cyggJGV4dHJhLT57ICRvYmplY3QgfSApICkgeworICAgICAgICAgICAgICAgICAgICBkaWUgIk9iamVjdCBcIiRvYmplY3RcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC5cbiI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRzd2l0Y2hlci0+eyAkb2JqZWN0IH0gPSB7IGRlZmluZWQgPT4gW10sIHVuZGVmaW5lZCA9PiBbXSB9OworICAgICAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgIH0sCispOworaWYgKCBub3QgJSRiYXNlICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJObyBiYXNlIG9iamVjdHMgc3BlY2lmaWVkIiApOworfTsgIyBpZgorCitpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmxvYWRfc3ltYm9scyA9IFwmX2xvYWRfc3ltYm9sc19saW5rOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibHJiIiApIHsKKyAgICAqbG9hZF9zeW1ib2xzID0gXCZfbG9hZF9zeW1ib2xzX25tOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgKSB7CisgICAgKmxvYWRfc3ltYm9scyA9IFwmX2xvYWRfc3ltYm9sc19ubTsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9TIFwiJHRhcmdldF9vc1wiIG5vdCBzdXBwb3J0ZWQiICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCisKK215ICRyZXF1aXJlZCA9IHJlcXVpcmVkX2V4dHJhX29iamVjdHMoICRiYXNlLCAkZXh0cmEsICRkdW1wICk7CitpZiAoICRwcmludF9iYXNlICkgeworICAgIHByaW50KCBtYXAoICIkX1xuIiwgc29ydCgga2V5cyggJSRiYXNlICkgKSApICk7Cit9OyAjIGlmCitpZiAoICRwcmludF9leHRyYSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIHNvcnQoIGtleXMoICUkcmVxdWlyZWQgKSApICkgKTsKK307ICMgaWYKK215IEBzeW1ib2xzOworaWYgKCBkZWZpbmVkKCAkcHJlZml4ICkgKSB7CisgICAgZm9yZWFjaCBteSAkb2JqZWN0ICggc29ydCgga2V5cyggJSRyZXF1aXJlZCApICkgKSB7CisgICAgICAgIHB1c2goIEBzeW1ib2xzLCBAeyAkcmVxdWlyZWQtPnsgJG9iamVjdCB9LT57IGRlZmluZWQgfSB9ICk7CisgICAgfTsgIyBmb3JlYWNoICRvYmplY3RzCit9OyAjIGlmCitpZiAoICRjb3B5X2Jhc2UgKSB7CisgICAgY29weV9vYmplY3RzKCAkYmFzZSwgJGNvcHlfYmFzZSwgJHByZWZpeCwgQHN5bWJvbHMgKTsKK307ICMgaWYKK2lmICggJGNvcHlfZXh0cmEgKSB7CisgICAgY29weV9vYmplY3RzKCAkcmVxdWlyZWQsICRjb3B5X2V4dHJhLCAkcHJlZml4LCBAc3ltYm9scyApOworfTsgIyBpZgorCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPHJlcXVpcmVkLW9iamVjdHMucGw+IC0tIFNlbGVjdCBhIHJlcXVpcmVkIGV4dHJhIG9iamVjdCBmaWxlcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8cmVxdWlyZWQtb2JqZWN0cy5wbD4gSTxvcHRpb24+Li4uIFstLWJhc2VdIEk8ZmlsZT4uLi4gLS1leHRyYSBJPGZpbGU+Li4uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPHJlcXVpcmVkLW9iamVjdHMucGw+IHdvcmtzIHdpdGggdHdvIHNldHMgb2Ygb2JqZWN0IGZpbGVzIC0tIGEgc2V0IG9mIEk8YmFzZT4gb2JqZWN0cworYW5kIGEgc2V0IG9mIEk8ZXh0cmE+IG9iamVjdHMsIGFuZCBzZWxlY3RzIHRob3NlIGV4dHJhIG9iamVjdHMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciByZXNvbHZpbmcKK3VuZGVmaW5lZCBzeW1ib2xzIGluIGJhc2Ugb2JqZWN0cyBJPGFuZD4gc2VsZWN0ZWQgZXh0cmEgb2JqZWN0cy4KKworU2VsZWN0ZWQgb2JqZWN0IGZpbGVzIG1heSBiZSBjb3BpZWQgdG8gc3BlY2lmaWVkIGxvY2F0aW9uIG9yIHRoZWlyIG5hbWVzIG1heSBiZSBwcmludGVkIHRvIHN0ZG91dCwKK2EgbmFtZSBwZXIgbGluZS4gQWRkaXRpb25hbGx5LCBzeW1ib2xzIGRlZmluZWQgaW4gc2VsZWN0ZWQgZXh0cmEgb2JqZWN0cyBtYXkgYmUgcmVuYW1lZC4KKworRGVwZW5kaW5nIG9uIE9TLCBkaWZmZXJlbnQgZXh0ZXJuYWwgdG9vbHMgbWF5IGJlIHVzZWQuIEZvciBleGFtcGxlLCBCPHJlcXVpcmVkLW9iamVjdHMucGw+IHVzZXMKK0Y8bGluay5leGU+IG9uICJ3aW4iIGFuZCBGPG5tPiBvbiAibGluIiBhbmQgIm1hYyIgT1Nlcy4gTm9ybWFsbHkgT1MgaXMgYXV0b2RldGVjdGVkLCBidXQKK2RldGVjdGlvbiBjYW4gYmUgb3ZlcnJpZGVkIHdpdGggQjwtLW9zPiBvcHRpb24uIEl0IG1heSBiZSBoZWxwZnVsIGluIGNyb3NzLWJ1aWxkIGVudmlyb25tZW50cy4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWJhc2U+CisKK1RoZSBsaXN0IG9mIGJhc2Ugb2JqZWN0cyBmb2xsb3dzIHRoaXMgb3B0aW9uLgorCis9aXRlbSBCPC0tZXh0cmE+CisKK0xpc3Qgb2YgZXh0cmEgb2JqZWN0cyBmb2xsb3dzIHRoaXMgb3B0aW9uLgorCis9aXRlbSBCPC0tcHJpbnQtYWxsPgorCitQcmludCBsaXN0IG9mIGJhc2Ugb2JqZWN0cyBhbmQgbGlzdCBvZiByZXF1aXJlZCBleHRyYSBvYmplY3RzLgorCis9aXRlbSBCPC0tcHJpbnQtYmFzZT4KKworUHJpbnQgbGlzdCBvZiBiYXNlIG9iamVjdHMuCisKKz1pdGVtIEI8LS1wcmludC1leHRyYT4KKworUHJpbnQgbGlzdCBvZiBzZWxlY3RlZCBleHRyYSBvYmplY3RzLgorCis9aXRlbSBCPC0tY29weS1hbGw9Pkk8ZGlyPgorCitDb3B5IGFsbCBiYXNlIGFuZCBzZWxlY3RlZCBleHRyYSBvYmplY3RzIHRvIHNwZWNpZmllZCBkaXJlY3RvcnkuIFRoZSBkaXJlY3RvcnkgbXVzdCBleGlzdC4gRXhpc3RpbmcKK2ZpbGVzIGFyZSBvdmVyd3JpdHRlbi4KKworPWl0ZW0gQjwtLWNvcHktYmFzZT0+STxkaXI+CisKK0NvcHkgYWxsIGJhc2Ugb2JqZWN0cyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LgorCis9aXRlbSBCPC0tY29weS1leHRyYT0+STxkaXI+CisKK0NvcHkgc2VsZWN0ZWQgZXh0cmEgb2JqZWN0cyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHN0cj4KKworSWYgcHJlZml4IGlzIHNwZWNpZmllZCwgY29waWVkIG9iamVjdCBmaWxlcyBhcmUgZWRpdGVkIC0tIHN5bWJvbHMgZGVmaW5lZCBpbiBzZWxlY3RlZCBleHRyYQorb2JqZWN0IGZpbGVzIGFyZSByZW5hbWVkIChpbiBhbGwgdGhlIGNvcGllZCBvYmplY3QgZmlsZXMpIGJ5IGFkZGluZyB0aGlzIHByZWZpeC4KKworRjxvYmpjb3B5PiBwcm9ncmFtIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIHBlcmZvcm1pbmcgdGhpcyBvcGVyYXRpb24uCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZS4gQnkgZGVmYXVsdCBPUyBpcyBhdXRvZGV0ZWN0ZWQuCisKK0RlcGVuZGluZyBvbiBPUywgQjxyZXF1aXJlZC1vYmplY3RzLnBsPiB1c2VzIGRpZmZlcmVudCBleHRlcm5hbCB0b29scy4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGZpbGU+CisKK0EgbmFtZSBvZiBvYmplY3QgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICAkIHJlcXVpcmVkLW9iamVjdHMucGwgLS1iYXNlIG9iai8qLm8gLS1leHRyYSAuLi9saWIvb2JqLyoubyAtLXByaW50LWV4dHJhID4gcmVxdWlyZWQubHN0CisgICAgJCBhciBjciBsaWJ4LmEgb2JqLyoubyAkKGNhdCByZXF1aXJlZC5sc3QpCisKKyAgICAkIHJlcXVpcmVkLW9iamVjdHMucGwgLS1iYXNlIGludGVybmFsLyoubyAtLWV4dHJhIGV4dGVybmFsLyoubyAtLXByZWZpeD1fX3h5el8gLS1jb3B5LWFsbD1vYmoKKyAgICAkIGFyIGNyIHh5ei5hIG9iai8qLm8KKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1jaGVja3MubWsgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLWNoZWNrcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU5ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1jaGVja3MubWsKQEAgLTAsMCArMSw5NSBAQAorIyBjb21tb24tY2hlY2tzLm1rICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgZmlsZSBjb250YWlucyByZWFsbHkgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgbXVsdGlwbGUgbWFrZWZpbGVzLiBNb2RpZnkgaXQgY2FyZWZ1bGx5IQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIENoZWNrIHRvb2xzIHZlcnNpb25zLgorIworaWZlcSAiJChjbGVhbikiICIiICAgICMgRG8gbm90IGNoZWNrIHRvb2xzIGlmIGNsZWFuIGdvYWwgc3BlY2lmaWVkLgorCisgICAgY2hlY2tfdG9vbHNfZmxhZ3MgPSAtLW1ha2UKKworICAgICMgZGV0ZXJtaW5lIGlmIGZvcnRyYW4gY2hlY2sgaXMgcmVxdWlyZWQgZnJvbSBnb2FscworICAgICMgTUFLRUNNREdPQUxTIGlzIGxpa2UgYXJndiBmb3IgZ251IG1ha2UKKyAgICBpZm5lcSAiJChmaWx0ZXIgbW9kIGFsbCwkKE1BS0VDTURHT0FMUykpIiAiIgorICAgICAgICBjaGVja190b29sc19mbGFncyArPSAtLWZvcnRyYW4KKyAgICBlbHNlCisgICAgICAgIGlmZXEgIiQoTUFLRUNNREdPQUxTKSIgIiIgIyB3aWxsIGRlZmF1bHQgdG8gYWxsIGlmIG5vIGdvYWxzIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgIGNoZWNrX3Rvb2xzX2ZsYWdzICs9IC0tZm9ydHJhbgorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZuZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIgIyBpZiBidWlsZCBjb21waWxlciBpcyBnY2Mgb3IgY2xhbmcKKyAgICAgICAgY2hlY2tfdG9vbHNfZmxhZ3MgKz0gLS1uby1pbnRlbAorICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImNsYW5nIgorICAgICAgICBjaGVja190b29sc19mbGFncyArPSAtLWNsYW5nCisgICAgZW5kaWYKKworICAgIGN1cnJfdG9vbHMgOj0gJChzdHJpcCAkKHNoZWxsICQocGVybCkgJCh0b29sc19kaXIpY2hlY2stdG9vbHMucGwgJChvYS1vcHRzKSAkKGNoZWNrX3Rvb2xzX2ZsYWdzKSkpCisKKyAgICBpZmVxICIkKGN1cnJfdG9vbHMpIiAiIgorICAgICAgICAkKGVycm9yIGNoZWNrLXRvb2xzLnBsIGZhaWxlZCkKKyAgICBlbmRpZgorICAgIGlmbmVxICIkKGZpbmRzdHJpbmcgTi9BLCQoY3Vycl90b29scykpIiAiIgorICAgICAgICBtaXNzZWRfdG9vbHMgOj0gJChmaWx0ZXIgJS0tLV9OL0FfLS0tLCQoY3Vycl90b29scykpCisgICAgICAgIG1pc3NlZF90b29scyA6PSAkKHN1YnN0ID0tLS1fTi9BXy0tLSwsJChtaXNzZWRfdG9vbHMpKQorICAgICAgICBtaXNzZWRfdG9vbHMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSQoc3BhY2UpLCQobWlzc2VkX3Rvb2xzKSkKKyAgICAgICAgJChlcnJvciBEZXZlbG9wbWVudCB0b29scyBub3QgZm91bmQ6ICQobWlzc2VkX3Rvb2xzKSkKKyAgICBlbmRpZgorICAgIHByZXZfdG9vbHMgOj0gJChzdHJpcCAkKHNoZWxsIFsgLWUgdG9vbHMuY2ZnIF0gJiYgY2F0IHRvb2xzLmNmZykpCisgICAgJChjYWxsIHNheSxUb29scyAgOiAkKGN1cnJfdG9vbHMpKQorICAgIGlmZXEgIiQocHJldl90b29scykiICIiCisgICAgICAgICMgTm8gc2F2ZWQgY29uZmlnIGZpbGUsIGxldCB1cyBjcmVhdGUgaXQuCisgICAgICAgIGR1bW15IDo9ICQoc2hlbGwgZWNobyAiJChjdXJyX3Rvb2xzKSIgPiB0b29scy5jZmcpCisgICAgZWxzZQorICAgICAgICAjIENoZWNrIHRoZSBzYXZlZCBjb25maWcgZmlsZSBtYXRjaGVzIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgaWZuZXEgIiQoY3Vycl90b29scykiICIkKHByZXZfdG9vbHMpIgorICAgICAgICAgICAgIyBTaG93IHRoZSBkaWZmZXJ0ZW5jZSBiZXR3ZWVuIHByZXZpb3VzIGFuZCBjdXJyZW50IHRvb2xzLgorICAgICAgICAgICAgJChjYWxsIHNheSxPbGQgdG9vbHMgOiAkKGZpbHRlci1vdXQgJChjdXJyX3Rvb2xzKSwkKHByZXZfdG9vbHMpKSkKKyAgICAgICAgICAgICQoY2FsbCBzYXksTmV3IHRvb2xzIDogJChmaWx0ZXItb3V0ICQocHJldl90b29scyksJChjdXJyX3Rvb2xzKSkpCisgICAgICAgICAgICAjIEFuZCBpbml0aWF0ZSByZWJ1aWxkLgorICAgICAgICAgICAgJChjYWxsIHNheSxUb29scyBjaGFuZ2VkJChjb21tYSkgcmVidWlsZGluZy4uLikKKyAgICAgICAgICAgIGR1bW15IDo9ICQoc2hlbGwgJChybSkgLnJlYnVpbGQgJiYgZWNobyAiJChjdXJyX3Rvb2xzKSIgPiB0b29scy5jZmcpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgQ2hlY2sgY29uZmlnLgoraWZlcSAiJChjdXJyX2NvbmZpZykiICIiCisgICAgJChlcnJvciBtYWtlZmlsZSBtdXN0IGRlZmluZSBgY3Vycl9jb25maWcnIHZhcmlhYmxlKQorZW5kaWYKK3ByZXZfY29uZmlnIDo9ICQoc2hlbGwgWyAtZSBidWlsZC5jZmcgXSAmJiBjYXQgYnVpbGQuY2ZnKQorY3Vycl9jb25maWcgOj0gJChzdHJpcCAkKGN1cnJfY29uZmlnKSkKK2lmZXEgIiQoY2xlYW4pIiAiIiAgICAjIERvIG5vdCBjaGVjayBjb25maWcgaWYgY2xlYW4gZ29hbCBzcGVjaWZpZWQuCisgICAgJChjYWxsIHNheSxDb25maWcgOiAkKGN1cnJfY29uZmlnKSkKKyAgICBpZmVxICIkKHByZXZfY29uZmlnKSIgIiIKKyAgICAgICAgIyBObyBzYXZlZCBjb25maWcgZmlsZSwgbGV0IHVzIGNyZWF0ZSBpdC4KKyAgICAgICAgZHVtbXkgOj0gJChzaGVsbCBlY2hvICIkKGN1cnJfY29uZmlnKSIgPiBidWlsZC5jZmcpCisgICAgZWxzZQorICAgICAgICAjIENoZWNrIHNhdmVkIGNvbmZpZyBmaWxlIG1hdGNoZXMgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgICAgICBpZm5lcSAiJChjdXJyX2NvbmZpZykiICIkKHByZXZfY29uZmlnKSIKKyAgICAgICAgICAgICMgU2hvdyB0aGUgZGlmZmVydGVuY2UgYmV0d2VlbiBwcmV2aW91cyBhbmQgY3VycmVudCBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgICAgICQoY2FsbCBzYXksT2xkIGNvbmZpZyA6ICQoZmlsdGVyLW91dCAkKGN1cnJfY29uZmlnKSwkKHByZXZfY29uZmlnKSkpCisgICAgICAgICAgICAkKGNhbGwgc2F5LE5ldyBjb25maWcgOiAkKGZpbHRlci1vdXQgJChwcmV2X2NvbmZpZyksJChjdXJyX2NvbmZpZykpKQorICAgICAgICAgICAgIyBBbmQgaW5pdGlhdGUgcmVidWlsZC4KKyAgICAgICAgICAgICQoY2FsbCBzYXksQ29uZmlndXJhdGlvbiBjaGFuZ2VkJChjb21tYSkgcmVidWlsZGluZy4uLikKKyAgICAgICAgICAgIGR1bW15IDo9ICQoc2hlbGwgJChybSkgLnJlYnVpbGQgJiYgZWNobyAiJChjdXJyX2NvbmZpZykiID4gYnVpbGQuY2ZnKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rIGIvcmMxL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDE5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLWRlZnMubWsKQEAgLTAsMCArMSwyMjggQEAKKyMgY29tbW9uLWRlZnMubWsgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHJlYWxseSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCBieSBtdWx0aXBsZSBtYWtlZmlsZXMuIE1vZGlmeSBpdCBjYXJlZnVsbHkhCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU29tZSB0cmlja3kgdmFyaWFibGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZW1wdHkgOj0KK3NwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCitjb21tYSA6PSAsCitpZmVxICIkKGRhdGUpIiAiIgorICAgICQoZXJyb3IgQ2FsbGVyIHNob3VsZCBzcGVjaWZ5ICJkYXRlIiB2YXJpYWJsZS4pCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEhlbHBlciBmaW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgc2F5LHRleHQtdG8tcHJpbnQtdG8tdGhlLXNjcmVlbikKKyMgRGVzY3JpcHRpb246CisjICAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIGl0cyBhcmd1bWVudCB0byB0aGUgc2NyZWVuLiBJbiBjYXNlIG9mIG9sZGVyIG1ha2VzIGl0IGlzIGFuYWxvZyBvZgorIyAgICAgJCh3YXJuaW5nKSwgc3RhcnRpbmcgZnJvbSBtYWtlIDMuODEgaXMgaXMgYW5hbG9nIG9mICQoaW5mbykuCisjCitzYXkgPSAkKHdhcm5pbmcgJCgxKSkKK2lmbmVxICIkKGZpbHRlciAzLjgxLCQoTUFLRV9WRVJTSU9OKSkiICIiCisgICAgc2F5ID0gJChpbmZvICQoMSkpCitlbmRpZgorCisjIFN5bm9wc2lzOgorIyAgICAgYXJjaGl0ZWN0dXJlID0gJChjYWxsIGxlZ2FsX2FyY2gsMzIpCisjIERlc2NyaXB0aW9uOgorIyAgICAgVGhlIGZ1bmN0aW9uIHJldHVybiBwcmludGFibGUgbmFtZSBvZiBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLCBJQS0zMiBhcmNoaXRlY3R1cmUgb3IgSW50ZWwoUikgNjQuCisjCitsZWdhbF9hcmNoID0gJChpZiAkKGZpbHRlciAzMiwkKDEpKSxJQS0zMiwkKGlmICQoZmlsdGVyIDMyZSwkKDEpKSxJbnRlbChSKSA2NCwkKGlmICQoZmlsdGVyIGwxLCQoMSkpLEwxT00sJChpZiAkKGZpbHRlciBhcm0sJCgxKSksQVJNLCQoZXJyb3IgQmFkIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQ6ICQoMSkpKSkpKQorCisjIFN5bm9wc2lzOgorIyAgICAgdmFyX25hbWUgPSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsdmFyLGxpc3QpCisjIERlc2NyaXB0aW9uOgorIyAgICAgVGhlIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSB2YWx1ZSBvZiB2YXIgdmFyaWJhbGUuIElmIGl0IGlzIGVtcHR5LCB0aGUgZmlyc3Qgd29yZCBmcm9tIHRoZSBsaXN0CisjICAgICBpcyBhc3NpZ25lZCB0byB2YXIgYXMgZGVmYXVsdCB2YWx1ZS4gT3RoZXJ3aXNlIHRoZSB2YXIgdmFsdWUgbXVzdCBtYXRjaCBvbmUgb2Ygd29yZHMgaW4gdGhlCisjICAgICBsaXN0LCBvciBlcnJvciBpcyBpc3N1ZWQuCisjIEV4YW1wbGU6CisjICAgICBMSU5LX1RZUEUgPSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsTElOS19UWVBFLHN0YXRpYyBkeW5hbWljKQorIworY2hlY2tfdmFyaWFibGUgPSAkKGNhbGwgX2NoZWNrX3ZhcmlhYmxlX3dvcmRzLCQoMSkpJChjYWxsIF9jaGVja192YXJpYWJsZV92YWx1ZSwkKDEpLCQoMikpCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgX2NoZWNrX3ZhcmlhYmxlX3dvcmRzLHZhcikKKyMgRGVzY3JpcHRpb246CisjICAgICBDaGVja3MgdGhhdCB2YXJpYWJsZSB2YXIgaXMgZW1wdHkgb3Igc2luZ2xlIHdvcmQuIEluIGNhc2Ugb2YgbXVsdGlwbGUgd29yZHMgYW4gZXJyb3IgaXMKKyMgICAgIGlzc3VlZC4gSXQgaXMgaGVscGVyIGZ1bmN0aW9uIGZvciBjaGVja192YXJpYWJsZS4KKyMKK19jaGVja192YXJpYWJsZV93b3JkcyA9ICQoaWYgJChmaWx0ZXIgMCAxLCQod29yZHMgJCgkKDEpKSkpLCxcCisgICAgJChlcnJvciBJbGxlZ2FsIHZhbHVlIG9mICQoMSk6ICIkKCQoMSkpIikpCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgX2NoZWNrX3ZhcmlhYmxlX3ZhbHVlLHZhcikKKyMgRGVzY3JpcHRpb246CisjICAgICBJZiB2YXJpYWJsZSB2YXIgaXMgZW1wdHksIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhlIGxpc3QuIElmIHZhcmlhYmxlIGlzCisjICAgICBub3QgZW1wdHkgYW5kIG1hdGNoIG9uZSBvZiB3b3JkcyBpbiB0aGUgbGlzdCwgdmFyaWFibGUncyB2YWx1ZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBlcnJvciBpcworIyAgICAgaXNzdWVkLiBJdCBpcyBoZWxwZXIgZnVuY3Rpb24gZm9yIGNoZWNrX3ZhcmlhYmxlLgorIworX2NoZWNrX3ZhcmlhYmxlX3ZhbHVlID0gJChpZiAkKCQoMSkpLCQoaWYgJChmaWx0ZXIgJCgyKSwkKCQoMSkpKSwkKCQoMSkpLFwKKyAgICAkKGVycm9yIElsbGVnYWwgdmFsdWUgb2YgJCgxKTogIiQoJCgxKSkiKSksJChmaXJzdHdvcmQgJCgyKSkpCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgZGVidWcsdmFyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIElmIExJQk9NUF9NQUtFX0RFQlVHIGlzIG5vdCBlbXB0eSwgdmFyIG5hbWUgYW5kIHZhbHVlIHByaW50ZWQuIFVzZSB0aGlzIGZvciBkZWJ1ZyBwdXJwb3NlLgorIworaWZlcSAiJChMSUJPTVBfTUFLRV9ERUJVRykiICIiCisgICAgZGVidWcgPQorZWxzZQorICAgIGRlYnVnID0gJChjYWxsIHNheSxkZWJ1ZzogJCgxKT0iJCgkKDEpKSIpCitlbmRpZgorCisjIFN5bm9wc2lzOgorIyAgICAgJChjYWxsIGhlYWRlcix0YXJnZXQpCisjIERlc2NyaXB0aW9uOgorIyAgICAgUmV0dXJucyBhIHN0cmluZyB0byBwcmludCB0byBzaG93IGJ1aWxkIHByb2dyZXNzLgorIworaGVhZGVyID0gLS0tLS0gJChtYXJrZXIpIC0tLSAkKDEpIC0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2xvYmFsIG1ha2Ugc2V0dGluZ3MuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTm9uLWVtcHR5IENEUEFUSCBtYXkgbGVhZCB0byBwcm9ibGVtcyBvbiBzb21lIHBsYXRmb3Jtczogc2ltcGxlICJjZCBkaXIiICh3aGVyZSAiZGlyIiBpcyBhbgorIyBleGlzdGluZyBkaXJlY3RvcnkgaW4gY3VycmVudCBvbmUpIGZhaWxzLiBDbGVhcmluZyBDRFBBVEggc29sdmVzIHRoZSBwcm9ibGVtLgorQ0RQQVRIID0KKy5TVUZGSVhFUyA6ICAgICAgICAgICAgIyBDbGVhbiBkZWZhdWx0IGxpc3Qgb2Ygc3VmZml4ZXMuCisuREVMRVRFX09OX0VSUk9SIDogICAgICMgRGVsZXRlIHRhcmdldCBmaWxlIGluIGNhc2Ugb2YgZXJyb3IuCisKKyQoY2FsbCBzYXksJChjYWxsIGhlYWRlcixtYWtpbmcgJChpZiAkKE1BS0VDTURHT0FMUyksJChNQUtFQ01ER09BTFMpLGFsbCkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGNsZWFuIGFuZCBjbG9iYmVyIGdvYWxzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjICJjbGVhbiIgZ29hbCBtdXN0IGJlIHNwZWNpZmllZCBhbG9uZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdHJvdWJsZXMgd2l0aCBkZXBlbmRlbmN5IGZpbGVzLgorY2xlYW4gOj0gJChmaWx0ZXIgY2xlYW4lLCQoTUFLRUNNREdPQUxTKSkKK2lmbmVxICIkKGNsZWFuKSIgIiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJjbGVhbiIgZ29hbCBpcyBwcmVzZW50IGluIGNvbW1hbmQgbGluZS4KKyAgICBpZm5lcSAiJChmaWx0ZXItb3V0IGNsZWFuJSwkKE1BS0VDTURHT0FMUykpIiAiIiAgICAjIHRoZXJlIGFyZSBub24tY2xlYW4gZ29hbHMuCisgICAgICAgICQoZXJyb3IgImNsZWFuIiBnb2FscyBtdXN0IG5vdCBiZSBtaXhlZCB3aXRoIG90aGVyIGdvYWxzKQorICAgIGVuZGlmCitlbmRpZgorIyBJc3N1ZSBlcnJvciBvbiAiY2xvYmJlciIgdGFyZ2V0LgoraWZuZXEgIiQoZmlsdGVyIGNsb2JiZXIsJChNQUtFQ01ER09BTFMpKSIgIiIKKyAgICAkKGVycm9yIFRoZXJlIGlzIG5vIGNsb2JiZXIgZ29hbCBpbiBtYWtlZmlsZSkKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFuZGF0b3J5IHZhcmlhYmxlcyBwYXNzZWQgZnJvbSBidWlsZC5wbC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3MgICAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLG9zLGxpbiBscmIgbWFjIHdpbikKK2FyY2ggICAgIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxhcmNoLDMyIDMyZSA2NCBhcm0pCitwbGF0Zm9ybSA6PSAkKG9zKV8kKGFyY2gpCitwbGF0Zm9ybSA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUscGxhdGZvcm0sbGluXzMyIGxpbl8zMmUgbGluXzY0IGxpbl9hcm0gbHJiXzMyZSBtYWNfMzIgbWFjXzMyZSB3aW5fMzIgd2luXzMyZSB3aW5fNjQpCisjIG9hLW9wdHMgbWVhbnMgIm9zIGFuZCBhcmNoIG9wdGlvbnMiLiBUaGV5IGFyZSBwYXNzZWQgdG8gYWxtb3N0IGFsbCBwZXJsIHNjcmlwdHMuCitvYS1vcHRzICA6PSAtLW9zPSQob3MpIC0tYXJjaD0kKGFyY2gpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGlyZWN0b3JpZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lmZXEgIiQoTElCT01QX1dPUkspIiAiIgorICAgICQoZXJyb3IgSW50ZXJuYWwgZXJyb3I6IExJQk9NUF9XT1JLIHZhcmlhYmxlIG11c3QgYmUgc2V0IGluIG1ha2VmaWxlLm1rKQorZW5kaWYKK3Rvb2xzX2RpciA9ICQoTElCT01QX1dPUkspdG9vbHMvCisjIFdlIGRvIG5vdCBkZWZpbmUgc3JjLyBhbmQgb3RoZXIgZGlyZWN0b3JpZXMgaGVyZSBiZWNhdXNlIHRoZXkgZGVwZW5kcyBvbiB0YXJnZXQgKFJUTCwgRFNMLCB0b29scykuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsZSBzdWZmaXhlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaWZlcSAiJChvcykiICJ3aW4iICMgd2luCisgICAgYXNtID0gLmFzbQorICAgIG9iaiA9IC5vYmoKKyAgICBsaWIgPSAubGliCisgICAgZGxsID0gLmRsbAorICAgIGV4ZSA9IC5leGUKKyAgICBjYXQgPSAkKGRsbCkKK2Vsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICBhc20gPSAucworICAgIG9iaiA9IC5vCisgICAgbGliID0gLmEKKyAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgZGxsID0gLmR5bGliCisgICAgZWxzZQorICAgICAgICBkbGwgPSAuc28KKyAgICBlbmRpZgorICAgIGV4ZSA9ICQoZW1wdHkpCisgICAgY2F0ID0gLmNhdAorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWxlIG1hbmlwdWxhdGlvbiBhbmQgbWlzYyBjb21tYW5kcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGFyZ2V0ID0gQGVjaG8gIiQoY2FsbCBoZWFkZXIsJEApIgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgY3AgICAgPSBjcCAtZgorICAgIHJtICAgID0gcm0gLWYKKyAgICBta2RpciA9IG1rZGlyIC1wCisgICAgdG91Y2ggPSB0b3VjaAorICAgIHBlcmwgID0gcGVybAorICAgIHNsYXNoID0gXFwKK2Vsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICBjcCAgICA9IGNwIC1mCisgICAgcm0gICAgPSBybSAtZgorICAgIG1rZGlyID0gbWtkaXIgLXAKKyAgICB0b3VjaCA9IHRvdWNoCisgICAgcGVybCAgPSBwZXJsCisgICAgc2xhc2ggPSAvCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbW1vbiBub24tY29uZmlndXJhdGlvbiBvcHRpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGV5IG1heSBhZmZlY3QgYnVpbGQgcHJvY2VzcyBidXQgZG9lcyBub3QgYWZmZWN0IHJlc3VsdC4KKworIyBJZiBURVNUX0RFUFMgaXMgIm9mZiIsIHRlc3QgZGVwcyBpcyBzdGlsbCBwZXJmb3JtZWQsIGJ1dCBpdHMgcmVzdWx0IGlzIGlnbm9yZWQuCitURVNUX0RFUFMgIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxURVNUX0RFUFMsb24gb2ZmKQorIyBUaGUgc2FtZSBmb3IgdGVzdCB0b3VjaC4KK1RFU1RfVE9VQ0ggOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRFU1RfVE9VQ0gsb24gb2ZmKQordGQtaSA9ICQoaWYgJChmaWx0ZXIgb2ZmLCQoVEVTVF9ERVBTKSksLSkKK3R0LWkgPSAkKGlmICQoZmlsdGVyIG9mZiwkKFRFU1RfVE9VQ0gpKSwtKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbW1vbiB0YXJnZXRzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEFsbCBjb21tb24gdGFyZ2V0cyBhcmUgZGVmaW5lZCBhcyBwaG9ueS4gSXQgYWxsb3dzICJidWlsLnBsIC0tYWxsIHRlc3QteHh4Ii4KKyMgTWFrZWZpbGUgY2FuIGRlZmluZSBhY3Rpb25zIGZvciBhIHBhcnRpY2l1bGFyIHRlc3Qgb3IgbGVhdmUgaXQgbm8tb3AuCisKKyMgYWxsLCB0aGUgZGVmYXVsdCB0YXJnZXQsIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lLgorLlBIT05ZIDogYWxsCithbGwgOgorCisuUEhPTlkgOiBjb21tb24gY2xlYW4gY2xlYW4tY29tbW9uIGZhdCBpbmMgbDEwbiBsaWIKKworLlBIT05ZIDogZm9yY2UtdGVzdHMgICAgICAgICAgdGVzdHMKKy5QSE9OWSA6IGZvcmNlLXRlc3QtdG91Y2ggICAgIHRlc3QtdG91Y2gKKy5QSE9OWSA6IGZvcmNlLXRlc3QtcmVsbyAgICAgIHRlc3QtcmVsbworLlBIT05ZIDogZm9yY2UtdGVzdC1leGVjc3RhY2sgdGVzdC1leGVjc3RhY2sKKy5QSE9OWSA6IGZvcmNlLXRlc3QtaW5zdHIgICAgIHRlc3QtaW5zdHIKKy5QSE9OWSA6IGZvcmNlLXRlc3QtZGVwcyAgICAgIHRlc3QtZGVwcworCit0ZXN0cyA9IHRvdWNoIHJlbG8gZXhlY3N0YWNrIGluc3RyIGRlcHMKK3Rlc3RzICAgICAgIDogJChhZGRwcmVmaXggdGVzdC0sJCh0ZXN0cykpCitmb3JjZS10ZXN0cyA6ICQoYWRkcHJlZml4IGZvcmNlLXRlc3QtLCQodGVzdHMpKQorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tcnVsZXMubWsgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODliZWIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rCkBAIC0wLDAgKzEsMTg4IEBACisjIGNvbW1vbi1ydWxlcy5tayAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIGZpbGUgY29udGFpbnMgcmVhbGx5IGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGJ5IG11bHRpcGxlIG1ha2VmaWxlcy4gTW9kaWZ5IGl0IGNhcmVmdWxseSEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0gQ3JlYXRpbmcgYSBkaXJlY3RvcnkgLS0tCisjIEEgZGlyZWN0b3J5IGNhbm5vdCBiZSBhIHRhcmdldCwgYmVjYXVzZSBpbiBMaW51eCogT1MgZGlyZWN0b3J5J3MgdGltZXN0YW1wIGlzIHVwZGF0ZWQgZWFjaCB0aW1lIGEKKyMgZmlsZSBpcyBjcmVhdGVkIG9yIGRlbGV0ZWQgaW4gdGhlIGRpcmVjdG9yeS4gV2UgdXNlICIuZGlyIiBmaWxlIGluIHBsYWNlIG9mIGRpcmVjdG9yeS4gSWYgc3VjaAorIyBmaWxlIGV4aXN0cywgaXQgbWVhbnMgZGlyZWN0b3J5IGV4aXN0cyBhbHNvLgorCisuUFJFQ0lPVVMgOiAlLy5kaXIgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislLy5kaXIgOgorCSQodGFyZ2V0KQorCSQobWtkaXIpICQoZGlyICRAKQorCSQodG91Y2gpICRACisKKyMgLS0tIFJlYnVpbGRpbmcgLS0tCisjIFJlbW92aW5nIG9yIHRvdWNoaW5nIC5yZWJ1aWxkIGZpbGUgY2F1c2VzIHJlYnVpbGQuCisjIFRvIGxldCBpdCB3b3JrLCAucmVidWlsZCBzaG91bGQgYmUgYWRkZWQgYXMgcHJlcmVxdWlzaXRlIHRvIGV2ZXJ5IHJ1bGUgKGRlcGVuZGVuY3kgd2l0aCBjb21tYW5kcykKKyMgZXhjZXB0IGNsZWFuKiBhbmQgZm9yY2UqLCBpbiB0aGlzIGFuZCBvdGhlciBtYWtlZmlsZXMuCisucmVidWlsZCA6CisJJCh0YXJnZXQpCisJJCh0b3VjaCkgJEAKKworIyAtLSBDcmVhdGluZyBkZXBlbmRlbmN5IGZpbGUgZm9yIEMvQysrIC0tLQorCislLmQgOiAlLmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGMpICQoY3BwLWZsYWdzKSAkKGMtZmxhZ3MpICQoYy1mbGFncy1tKSAkPCA+ICRACisKKyUuZCA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgJChjeHgtZmxhZ3MtbSkgJDwgPiAkQAorCisjIC0tIENyZWF0aW5nIHByZXByb2Nlc3NlZCBmaWxlIGZvciBDL0MrKyAtLS0KKworJS5pIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAtUCAkKGMtb3V0KSRAICQ8CisKKyUuaSA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgLVAgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0gQ29tcGlsaW5nIEMvQysrIGZpbGVzIC0tLQorCislJChvYmopIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAkKGMtb3V0KSRAICQ8CisKKyUkKG9iaikgOiAlLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGNwcC1mbGFncykgJChjeHgtZmxhZ3MpICQoY3h4LW91dCkkQCAkPAorCisjIC0tIEdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tLQorCislJChhc20pIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAtUyAkKGMtb3V0KSRAICQ8CisKKyUkKGFzbSkgOiAlLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGNwcC1mbGFncykgJChjeHgtZmxhZ3MpIC1TICQoY3h4LW91dCkkQCAkPAorCisjIC0tIENvbXBpbGluZyBhc20gZmlsZXMgLS0tCisKKyUkKG9iaikgOiAlJChhc20pIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisgICAgICAgICMgVGhlcmUgaXMgYSBidWcgb24gbHJiOiBpY2MgZG9lcyBub3Qgd29yayB3aXRoICIteCBhc3NlbWJsZXItd2l0aC1jcHAiIG9wdGlvbiwgc28gd2UgaGF2ZQorICAgICAgICAjIHRvIHByZXByb2Nlc3MgZmlsZSBtYW51YWxseSBhbmQgdGhlbiBhc3NlbWJseSBpdC4KKyAgICAgICAgaWZlcSAiJChvcykiICJscmIiCisJICAgICQoYykgLUUgJChjcHAtZmxhZ3MpICQ8ID4gJEAudG1wCisJICAgICQoYXMpICQoYXMtZmxhZ3MpIC14IGFzc2VtYmxlciAkKGFzLW91dCkkQCAkQC50bXAKKyAgICAgICAgZWxzZQorCSAgICAkKGFzKSAkKGFzLWZsYWdzKSAkKGFzLW91dCkkQCAkPAorICAgICAgICBlbmRpZgorCisjIC0tIEV4cGFuZGluZyB2YXJpYWJsZXMgaW4gdGVtcGxhdGUgZmlsZXMgLS0tCisKKyMgR2VuZXJhbCBydWxlICIlIDogJS52YXIiIGRvZXMgbm90IHdvcmsgZ29vZCwgc28gd2UgaGF2ZSB0byB3cml0ZSBtb3JlIHNwZWNpZmljIHJ1bGVzOgorIyAiJS5oIDogJS5oLnZhciIsIGV0Yy4KKworLlBSRUNJT1VTIDogJS5oICUuZiAlLnJjICAgICAgICAgICAgICAgIyBEbyBub3QgZGVsZXRlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmaWxlcy4KKworZXhwYW5kLXZhcnMgPSAkKHBlcmwpICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC0tc3RyaWN0ICQoZXYtZmxhZ3MpICQ8ICRACisKKyMgQW55IGdlbmVyYXRlZCBmaWxlIGRlcGVuZHMgb24ga21wX3ZlcnNpb24uYywgYmVjYXVzZSB3ZSBleHRyYWN0IGJ1aWxkIG51bWJlciBmcm9tIHRoYXQgZmlsZS4KKworJS5oICA6ICUuaC52YXIgIFwKKyAgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworJS5mICA6ICUuZi52YXIgIFwKKyAgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworJS5mOTAgIDogJS5mOTAudmFyICBcCisgICAga21wX3ZlcnNpb24uYyAkKHRvb2xzX2RpcilleHBhbmQtdmFycy5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoZXhwYW5kLXZhcnMpCisKKyUucmMgOiAlLnJjLnZhciBcCisgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworIyAtLSBNYWtpbmcgc3RhdGljIGxpYnJhcnkgLS0tCisKKy5QUkVDSU9VUyA6ICUkKGxpYikgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUkKGxpYikgOiAlJChsaWIpLmxzdCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocm0pICRACisJJChhcikgJChhci1mbGFncykgJChhci1vdXQpJEAgJCQoY2F0ICQ8KQorICAgICAgICAjIHN0cmlwIGRlYnVnIGluZm8gaW4gY2FzZSBpdCBpcyByZXF1ZXN0ZWQgKHdvcmtzIGZvciBMaW51eCogT1Mgb25seSkKKyAgICAgICAgaWZuZXEgIiQoZGJnX3N0cmlwKSIgIiIKKyAgICAgICAgICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvZmYiCisJICAgICAgICBvYmpjb3B5IC0tc3RyaXAtZGVidWcgJEAKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisKKyMgLS0gTWFraW5nIGR5bmFtaWMgbGlicmFyeSAtLS0KKworLlBSRUNJT1VTIDogJSQoZGxsKSAgICAgICAgICAgICAgICAgICAgIyBEbyBub3QgZGVsZXRlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmaWxlcy4KKworIyBtYWtlZmlsZS5tayBzaG91bGQgcHJvcGVybHkgZGVmaW5lIGltcF9maWxlLCBkZWZfZmlsZSwgcmVzX2ZpbGUsIGFuZCBwZGJfZmlsZToKKyMgICAgIGxpbiBhbmQgbWFjOiBkZWZfZmlsZSBhbmQgcmVzX2ZpbGUgc2hvdWxkIGJlIGVtcHR5LCBpbXBfZmlsZSBhbmQgcGRiX2ZpbGUgZG8gbm90IG1hdHRlci4KKyMgICAgIHdpbjogYWxsIHRoZSB2YXJpYWJlIG1heSBiZSBlbXB0eTsgaWYgYSB2YXJpYWJsZSBzcGVjaWZpZWQsIGl0IGFmZmVjdHMgbGQtZmxhZ3MuCisjIE5vdGU6IGltcF9maWxlIGFuZCBwZGJfZmlsZSBhcmUgc2lkZSBlZmZlY3Qgb2YgYnVpbGRpbmcgdGhpcyB0YXJnZXQuCisjIE5vdGU6IHRvIHdvcmthcm91bmQgQ1EyMTUyMjkgJGxkLWZsYWdzLWV4dHJhIGludHJvZHVjZWQgdG8ga2VlcCBvcHRpb25zIGJlIHBsYWNlZCBhZnRlciBvYmplY3RzCislJChkbGwpIDogJSQoZGxsKS5sc3QgJChkZWZfZmlsZSkgJChyZXNfZmlsZSkgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGxkKSAkKGxkLWZsYWdzLWRsbCkgJChsZC1mbGFncykgJChsZC1vdXQpJEAgJCQoY2F0ICQ8KSAkKGxkLWZsYWdzLWV4dHJhKSAkKHJlc19maWxlKQorICAgICAgICAjIElmIHN0cmlwcGVkIHBkYiBleGlzdCwgcmVuYW1lIGl0IHRvIG5vcm1hbCBwZGIgbmFtZS4gU2VlIGRldnRvb2xzLm1rIGZvciBleHBsYW5hdGlvbi4KKyAgICAgICAgaWZuZXEgIiQocGRiX2ZpbGUpIiAiIgorICAgICAgICAgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9mZiIKKwkgICAgICAgIG12ICQocGRiX2ZpbGUpICQocGRiX2ZpbGUpLm5vbnN0cmlwcGVkCisJICAgICAgICBtdiAkKHBkYl9maWxlKS5zdHJpcHBlZCAkKHBkYl9maWxlKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKworJS5kYmcgOiAlJChkbGwpIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJb2JqY29weSAtLW9ubHkta2VlcC1kZWJ1ZyAkPCAkQCAKKworCisuUFJFQ0lPVVM6ICUucmVzICAgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislLnJlcyA6ICUucmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwlyYyAtZm8kQCAkPAorCisjIC0tLSBCdWlsZGluZyBoZWxwZXIgdG9vbHMgZnJvbSBzb3VyY2VzIC0tLQorCisuUFJFQ0lPVVM6ICUkKGV4ZSkgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislJChleGUpIDogJCh0b29sc19kaXIpJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0tIEZvcmNpbmcgYSB0ZXN0IC0tLQorCit0ZXN0LSUvLmZvcmNlIDogdGVzdC0lLy5kaXIKKwkkKHRhcmdldCkKKwkkKHJtKSAkKGRpciAkQCkue3Rlc3QsZm9yY2V9CisKKyMgLS0tIFJlbW92aW5nIGEgZmlsZSBpbiBidWlsZCBkaXJlY3RvcnkgLS0tCisKK3JtLSUgOgorCSQodGFyZ2V0KQorCSQocm0pICQocGF0c3Vic3Qgcm0tJSwlLCRAKQorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tdG9vbHMubWsgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLXRvb2xzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YzlmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvcnVudGltZS90b29scy9zcmMvY29tbW9uLXRvb2xzLm1rCkBAIC0wLDAgKzEsNDM4IEBACisjIGNvbW1vbi10b29scy5tayAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXYgdG9vbHMgYW5kIGdlbmVyYWwgb3B0aW9ucyAobGlrZSAtZnBpYywgLU8yIG9yIC1nKS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBjICAgICAgIC0tIEMgY29tcGlsZXIuCisjIGN4eCAgICAgLS0gQysrIGNvbXBpbGVyLgorIyBjcHAgICAgIC0tIEMgcHJlcHJvY2Vzc29yLgorIyBmb3J0ICAgIC0tIEZvcnRyYW4gY29tcGlsZXIuCisjIGFzICAgICAgLS0gQXNzZW1ibGVyLgorIyBhciAgICAgIC0tIExpYnJhcmlhbiAoc3RhdGljIGxpYnJhcnkgbWFrZXIpLgorIyBsZCAgICAgIC0tIExpbmtlciAoZHluYW1pYyBsaWJyYXJ5IG1ha2VyKS4KKyMgKi1vdXQgICAtLSBGbGFnIGRlbm90aW5nIG91dHB1dCBmaWxlLiBJZiBzcGFjZSBiZXR3ZWVuIGZsYWcgYW5kIGZpbGUgbmFtZSByZXF1aXJlZCwgYWRkIGV4cGxpY2l0CisjICAgICAgICAgICAgc3BhY2UgdG8gdmFyaWFibGUsIGUuIGcuOiAiYy1vdXQgPSAtbyQoc3BhY2UpIi4KKyMgKi1mbGFncyAtLSBGbGFncyB0byBhcHByb3ByaWF0ZSBwcm9ncmFtLCBlLiBnLiBjLWZsYWdzIC0tIGZsYWdzIGZvciBDIGNvbXBpbGVyLCBldGMuCisKKyMgLS0tIENvbW1vbiBkZWZpbml0aW9ucyAtLS0KKworIyBBZGQgY3VycmVudCBkaXJlY3RvcnkgKGl0IGNvbnRhaW5zIGdlbmVyYXRlZCBmaWxlcykuCisjIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0byBzcGVjaWZ5IGN1cnJlbnQgZGlyIGFzICIuLyIgKG5vdCBqdXN0ICIuIikuIE90aGVyd2lzZSBJbnRlbCBjb21waWxlcgorIyBvbiBXaW5kb3dzKiBPUyBnZW5lcmF0ZXMgc3VjaCBhIGRlcGVuZGVuY3k6ICJrbXBfcnVudGltZS5vYmo6IC5ca21wX2kxOG4uaW5jIiwgYW5kIG1ha2UgY29tcGxhaW5zCisjICJObyBydWxlIHRvIGJ1aWxkIC5ca21wX2kxOG4uaW5jIi4gVXNpbmcgIi4vIiBzb2x2ZXMgdGhlIHByb2JsZW0uCitjcHAtZmxhZ3MgKz0gLUkgLi8KKyMgRm9yIG5vbi14ODYgYXJjaGl0ZWN0dXJlCitpZmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgY3BwLWZsYWdzICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJmZmkpCitlbmRpZgorIyBBZGQgYWxsIFZQQVRIIGRpcmVjdG9yaWVzIHRvIHBhdGggZm9yIHNlYXJjaGluZyBpbmNsdWRlIGZpbGVzLgorY3BwLWZsYWdzICs9ICQoZm9yZWFjaCBpLCQoVlBBVEgpLC1JICQoaSkpCisKKworIyBTaG91bGRuJ3QgdGhpcyBiZSBiZWluZyBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHNvbWVob3c/CitjcHAtZmxhZ3MgKz0gLUQgVVNFX0lUVF9CVUlMRAorCitpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgTkRFQlVHCitlbHNlCisgICAgY3BwLWZsYWdzICs9IC1EIF9ERUJVRyAtRCBCVUlMRF9ERUJVRworZW5kaWYKKworIyAtLS0gTGludXgqIE9TLCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYW5kIE9TIFgqIGRlZmluaXRpb25zIC0tLQorCitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiBtYWMsJChvcykpIiAiIgorICAgICMgLS0tIEMvQysrIC0tLQorICAgIGlmZXEgIiQoYykiICIiCisgICAgICAgIGMgPSBpY2MKKyAgICBlbmRpZgorICAgICMgQysrIGNvbXBpbGVyIGlzIGEgY29tcGxlbWVudCB0byBDIGNvbXBpbGVyLgorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGN4eCA9IGljcGMKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJnY2MiCisgICAgICAgIGN4eCA9IGcrKworICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImNsYW5nIgorICAgICAgICBjeHggPSBjbGFuZysrCisgICAgZW5kaWYKKyAgICAjIE91dHB1dCBmaWxlIGZsYWcuCisgICAgYy1vdXQgICA9IC1vJChzcGFjZSkKKyAgICBjeHgtb3V0ID0gLW8kKHNwYWNlKQorICAgICMgQ29tcGlsZSBvbmx5LCBubyBsaW5rLgorICAgIGMtZmxhZ3MgICArPSAtYworICAgIGN4eC1mbGFncyArPSAtYworICAgICMgR2VuZXJhdGluZyBkZXBlbmRlY3kgZmlsZS4KKyAgICBjLWZsYWdzLW0gICArPSAtTSAtTUcKKyAgICBjeHgtZmxhZ3MtbSArPSAtTSAtTUcKKyAgICAjIEVuYWJsZSBDOTkgbGFuZ3VhZ2UuCisgICAgaWZuZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgICAgICBjLWZsYWdzICs9IC1zdGQ9Z251OTkKKyAgICBlbmRpZgorICAgICMgR2VuZXJhdGUgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSAoYSBtdXN0IGZvciBzaGFyZWQgb2JqZWN0cykuCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgYy1mbGFncyAgICs9IC1mUElDCisgICAgICAgIGN4eC1mbGFncyArPSAtZlBJQworICAgIGVuZGlmCisgICAgIyBFbWl0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKERFQlVHX0lORk8pIiAib24iCisgICAgICAgIGMtZmxhZ3MgICArPSAtZworICAgICAgICBjeHgtZmxhZ3MgKz0gLWcKKyAgICBlbmRpZgorICAgICMgSW5zdHJ1bWVudCBwcm9ncmFtIGZvciBwcm9maWxpbmcsIGdhdGhlciBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1wcm9mX2dlbngKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChjeHgpIiAiaWNwYyIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtcHJvZl9nZW54CisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICAjIFR1cm4gb3B0aW1pemF0aW9uIG9uIG9yIG9mZi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgIyAtaW5saW5lLW1pbi1zaXplPTEgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YgUEFSQUxMRUwgRVBDQyB1cCB0byAxMCUgb24gZnhpNjRsaW4wMSwKKyAgICAgICAgIyBkb2Vzbid0IGNoYW5nZSBwZXJmb3JtYW5jZSBvbiBmeGU2NGxpbjAxLgorICAgICAgICAjIFByZXNlbmNlIG9mIHRoZSAtaW5saW5lLW1pbi1zaXplPTEgc3dpdGNoIHNob3VsZCBvbmx5IGhlbHAKKyAgICAgICAgIyB0byBwcm9tb3RlIHBlcmZvcm1hbmNlIHN0YWJpbGl0eSBiZXR3ZWVuIGNoYW5nZXMsCisgICAgICAgICMgZXZlbiBpZiBpdCBoYXMgbm8gb2JzZXJ2YWJsZSBpbXBhY3QgcmlnaHQgbm93LgorCWlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtTzIgLWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1PMgorCWVuZGlmCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGN4eCkpIiAiIgorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMiAtaW5saW5lLW1pbi1zaXplPTEKKwllbHNlCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLU8yCisJZW5kaWYKKyAgICBlbHNlCisgICAgICAgIGMtZmxhZ3MgICArPSAtTzAKKyAgICAgICAgY3h4LWZsYWdzICs9IC1PMAorICAgIGVuZGlmCisgICAgIyAtLS0gQXNzZW1ibGVyIC0tLQorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGFzICAgICAgICA9IGljYworICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgYXMgICAgICAgID0gZ2NjCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgIGFzICAgICAgICA9IGNsYW5nCisgICAgZW5kaWYKKyAgICBhcy1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgYXMtZmxhZ3MgKz0gJChjcHAtZmxhZ3MpCisgICAgIyBDb21waWxlIG9ubHksIG5vIGxpbmsuCisgICAgYXMtZmxhZ3MgKz0gLWMKKyAgICBhcy1mbGFncyArPSAteCBhc3NlbWJsZXItd2l0aC1jcHAKKyAgICAjIC0tLSBGb3J0cmFuIC0tLQorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGZvcnQgPSBpZm9ydAorICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgZm9ydCA9IGdmb3J0cmFuCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgIGZvcnQgPSBnZm9ydHJhbgorICAgIGVuZGlmCisgICAgaWZlcSAiJChmb3J0KSIgIiIKKyAgICAgICAgZm9ydCA9IGlmb3J0CisgICAgZW5kaWYKKyAgICBmb3J0LW91dCAgICA9IC1vJChzcGFjZSkKKyAgICBmb3J0LWZsYWdzICs9IC1jCitlbmRpZgorCisjIC0tLSBMaW51eCogT1MgZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgICMgLS0tIEMvQysrIC0tLQorICAgICMgT24gbGluXzMyLCB3ZSB3YW50IHRvIG1haW50YWluIHN0YWNrIGFsaWdubWVudCB0byBiZSBjb25wYXRpYmxlIHdpdGggR05VIGJpbmFyaWVzIGJ1aWx0IHdpdGgKKyAgICAjIGNvbXBpbGVyLgorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUKKyAgICAgICAgZW5kaWYKKyAgICAgICAgIyBHZW5lcmF0ZSBjb2RlIHRoYXQgd2lsbCBydW4gb24gYW55IFBlbnRpdW0gb3IgbGF0ZXIgcHJvY2Vzc29yLgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLW1pYTMyCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLW1pYTMyCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiZ2NjIgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiYXJtIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1tYXJtCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICAjIC0tLSBMaWJyYXJpYW4gLS0tCisgICAgYXIgICAgICAgID0gYXIKKyAgICBhci1vdXQgICAgPSAkKGVtcHR5KQorICAgIGFyLWZsYWdzICs9IGNyCisgICAgIyAtLS0gTGlua2VyIC0tLQorICAgICMgVXNlIGxkIGJ5IGRlZmF1bHQsIGhvd2V2ZXIsIG1ha2VmaWxlIG1heSBzcGVjaWZ5IGxkPSQoYykgYmVmb3JlIGluY2x1ZGluZyBkZXZ0b29scy5tay4KKyAgICBpZmVxICIkKGxkKSIgIiIKKyAgICAgICAgbGQgPSAkKGMpCisgICAgZW5kaWYKKyAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZAorICAgIGlmZXEgIiQobGQpIiAibGQiCisgICAgICAgIGxkLW91dCA9IC1vJChzcGFjZSkKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICAgICAgbGQtZmxhZ3MgKz0gLW0gZWxmX2kzODYKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1tIGVsZl94ODZfNjQKKyAgICAgICAgZW5kaWYKKyAgICAgICAgbGQtZmxhZ3MgICAgICs9IC14IC1sYyAtbGRsCisgICAgICAgIGxkLWZsYWdzICAgICArPSAteiBub2V4ZWNzdGFjaworICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgICAgICBsZC1vdXQgICAgPSAkKGMtb3V0KQorICAgICAgICBsZC1mbGFncyArPSAtV2wsLXosbm9leGVjc3RhY2sKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1XbCwtc29uYW1lPSQoQEYpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoY3h4KSIKKyAgICAgICAgbGQtb3V0ICAgID0gJChjeHgtb3V0KQorICAgICAgICBsZC1mbGFncyArPSAtV2wsLXosbm9leGVjc3RhY2sKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1XbCwtc29uYW1lPSQoQEYpCisgICAgZW5kaWYKK2VuZGlmCisKKyMgLS0tIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBkZWZpbml0aW9ucyAtLS0KKworaWZlcSAiJChvcykiICJscmIiCisgICAgIyAtLS0gQy9DKysgLS0tCisgICAgIyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3B0aW9ucywgbmVlZCBjbGFyaWZpY2F0aW9uIGZvciBwdXJwb3NlOgorICAgICNjLWZsYWdzICAgICArPSAtbW1pYyAtbVAyT1BUX2ludHJpbl9kaXNhYmxlX25hbWU9bWVtY3B5IC1tUDJPUFRfaW50cmluX2Rpc2FibGVfbmFtZT1tZW1zZXQgLW1HTE9CX2ZyZWVzdGFuZGluZyAtbUdMT0Jfbm9uc3RhbmRhcmRfbGliIC1ub3N0ZGxpYiAtZm5vLWJ1aWx0aW4KKyAgICAjY3h4LWZsYWdzICAgKz0gLW1taWMgLW1QMk9QVF9pbnRyaW5fZGlzYWJsZV9uYW1lPW1lbWNweSAtbVAyT1BUX2ludHJpbl9kaXNhYmxlX25hbWU9bWVtc2V0IC1tR0xPQl9mcmVlc3RhbmRpbmcgLW1HTE9CX25vbnN0YW5kYXJkX2xpYiAtbm9zdGRsaWIgLWZuby1idWlsdGluCisgICAgIyBpY2MgZm9yIGxyYiBoYXMgYSBidWc6IGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgZm9yIHRhcmdldCBsaWtlIGZpbGUub2JqLCB3aGlsZSByZWFsIG9iamVjdAorICAgICMgZmlsZXMgYXJlIG5hbWVkIGZpbGUuby4gLU1UIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0uCisgICAgYy1mbGFncy1tICAgKz0gLU1UICQoYmFzZW5hbWUgJEApLm8KKyAgICBjeHgtZmxhZ3MtbSArPSAtTVQgJChiYXNlbmFtZSAkQCkubworICAgICMgLS0tIExpYnJhcmlhbiAtLS0KKyAgICBhciAgICAgICAgPSBhcgorICAgIGFyLW91dCAgICA9ICQoZW1wdHkpCisgICAgYXItZmxhZ3MgKz0gY3IKKyAgICAjIC0tLSBMaW5rZXIgLS0tCisgICAgIyBVc2UgJChjKSBieSBkZWZhdWx0LCBob3dldmVyLCBtYWtlZmlsZSBtYXkgc3BlY2lmeSBhbm90aGVyIGxpbmtlciAoZS5nLiBsZD1sZCkgYmVmb3JlIGluY2x1ZGluZyBkZXZ0b29scy5tay4KKyAgICBpZmVxICIkKGxkKSIgIiIKKyAgICAgICAgbGQgPSAkKGMpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgImxkIgorICAgICAgICBsZC1vdXQgICA9IC1vJChzcGFjZSkKKyAgICAgICAgbGQtZmxhZ3MgKz0gLW0gZWxmX2wxb21fZmJzZAorICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZCAteCAtbGMKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1zb25hbWU9JChARikKKyAgICAgICAgIyBOb3cgZmluZCBvdXQgcGF0aCB0byBsaWJyYXJpZXMuCisgICAgICAgICAgICBsZC1mbGFncy1MIDo9ICQoc2hlbGwgJChjKSAtV2wsLXYgLVwjIDI+JjEgfCBncmVwIC1lICItTCIpCisgICAgICAgICAgICAkKGNhbGwgZGVidWcsbGQtZmxhZ3MtTCkKKyAgICAgICAgICAgICMgUmVtb3ZlIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXJzOyBmaXJzdCBhZGQgYSBzcGFjZSB0byB0aGUgZW5kICgiIC1McGF0aDEgLyIgLT4gIi1McGF0aDEgLyAiKQorICAgICAgICAgICAgbGQtZmxhZ3MtTCA6PSAkKGZpbHRlci1vdXQgXCwkKGxkLWZsYWdzLUwpKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGxkLWZsYWdzLUwpCisgICAgICAgICAgICAjIExpbmtlciB0cmVhdHMgYmFja3NsYXNoICgnXCcpIGFzIGFuIGVzY2FwZSBzeW1ib2wsIHNvIHJlcGxhY2UgaXQgd2l0aCBmb3J3YXJkIHNsYXNoLgorICAgICAgICAgICAgbGQtZmxhZ3MtTCA6PSAkKHN1YnN0IFwsLywkKGxkLWZsYWdzLUwpKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGxkLWZsYWdzLUwpCisgICAgICAgIGxkLWZsYWdzICs9ICQobGQtZmxhZ3MtTCkKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAiJChjKSIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9ICQoYy1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc2hhcmVkIC1XbCwteCAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGN4eCkiCisgICAgICAgIGxkLW91dCAgICAgICAgPSAkKGN4eC1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc2hhcmVkIC1XbCwteCAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCitlbmRpZgorCisjIC0tLSBPUyBYKiBkZWZpbml0aW9ucyAtLS0KKworaWZlcSAiJChvcykiICJtYWMiCisgICAgIyAtLS0gTGlicmFyaWFuIC0tLQorICAgIGFyICAgICAgICA9IGxpYnRvb2wKKyAgICBhci1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgYXItZmxhZ3MgKz0gLXN0YXRpYworICAgICMgLS0tIExpbmtlciAtLS0KKyAgICAjIFVzZSBDIGNvbXBpbGVyIGFzIGxpbmtlciBieSBkZWZhdWx0LCBob3dldmVyLCBtYWtlZmlsZSBtYXkgc3BlY2lmeSBsZD0kKGxpYnRvb2wpIGJlZm9yZQorICAgICMgaW5jbHVkaW5nIGRldnRvb2xzLm1rLgorICAgIGlmZXEgIiQobGQpIiAiIgorICAgICAgICBsZCA9ICQoYykKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAibGlidG9vbCIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9IC1vJChzcGFjZSkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljCisgICAgICAgIGxkLWZsYWdzICAgICArPSAtbGMgLWxkbAorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgICAgICBsZC1vdXQgICAgICAgID0gJChjLW91dCkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljbGliCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoY3h4KSIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9ICQoY3h4LW91dCkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljbGliCisgICAgZW5kaWYKKyAgICAjIFRoZXNlIG9wdGlvbnMgc3VpdGFibGUgZm9yIGFueSBsaW5rZXIsIGVpdGhlciBDIGNvbXBpbGVyIG9yIGxpYnRvb2wuCisgICAgbGQtZmxhZ3MtZGxsICs9IC1oZWFkZXJwYWRfbWF4X2luc3RhbGxfbmFtZXMKKyAgICBsZC1mbGFncy1kbGwgKz0gLWluc3RhbGxfbmFtZSAkKEBGKQorZW5kaWYKKworIyAtLS0gV2luZG93cyogT1MgZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgICMgRGlzYWJsZSB3YXJuaW5nICJmdW5jdGlvbiAiLi4uIiAoZGVjbGFyZWQgYXQgbGluZSAuLi4gb2YgLi4uKSB3YXMgZGVjbGFyZWQgZGVwcmVjYXRlZC4uLiIuCisgICAgY3BwLWZsYWdzICs9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyAgICAjIC0tLSBDL0MrKyAtLS0KKyAgICBpZmVxICIkKGMpIiAiIgorICAgICAgICBjID0gaWNsLmV4ZQorICAgIGVuZGlmCisgICAgY3h4ICAgID0gJChjKQorICAgICMgT2Z0ZW4gZGVmYXVsdCBpY2wuY2ZnIGZpbGUgaW4gY29tcGlsZXIgYmluLyBkaXJlY3RvcnkgY29udGFpbnMgb3B0aW9ucyAtUXZjIGFuZAorICAgICMgLVFsb2NhdGlvbixsaW5rLiBTZXR0aW5nIElDTENGRyAoYW5kIElGT1JUQ0ZHKSB0byBzcGVjaWFsbHkgcHJlcGFyZWQgZW1wdHkgY29uZmlnIGZpbGUKKyAgICAjIG92ZXJyaWRlcyBkZWZhdWx0IGNvbmZpZy4KKyAgICBJQ0xDRkcgICA9ICQodG9vbHNfZGlyKWljYy5jZmcKKyAgICBJRk9SVENGRyA9ICQodG9vbHNfZGlyKWljYy5jZmcKKyAgICBleHBvcnQgSUNMQ0ZHCisgICAgZXhwb3J0IElGT1JUQ0ZHCisgICAgIyBPdXRwdXQgZmlsZS4KKyAgICBjLW91dCAgID0gLW8kKHNwYWNlKQorICAgIGN4eC1vdXQgPSAtbyQoc3BhY2UpCisgICAgIyBEaXNhYmxlIGFubm95aW5nIGNvbXBpbGVyIGxvZ28uCisgICAgYy1mbGFncyAgICs9IC1ub2xvZ28KKyAgICBjeHgtZmxhZ3MgKz0gLW5vbG9nbworICAgICMgR2VuZXJhdGUgY29kZSB0aGF0IHdpbGwgcnVuIG9uIGFueSBQZW50aXVtIG9yIGxhdGVyIHByb2Nlc3Nvci4KKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGMtZmxhZ3MgICArPSAtYXJjaDppYTMyCisgICAgICAgIGN4eC1mbGFncyArPSAtYXJjaDppYTMyCisgICAgZW5kaWYKKyAgICAjIENvbXBpbGUgb25seSwgbm8gbGluay4KKyAgICBjLWZsYWdzICAgKz0gLWMKKyAgICBjeHgtZmxhZ3MgKz0gLWMKKyAgICAjIC1RTSAgLS0gR2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlLgorICAgICMgLVFNTSAtLSBkbyBub3QgaW5jbHVkZSBzeXN0ZW0gaGVhZGVycy4gT24gV2luZG93cyogT1MsIHN5c3RlbSBoZWFkZXJzIG1heSBiZSBsb2NhdGVkIGluCisgICAgIyAgICAgICAgICJDOlxQcm9ncmFtIEZpbGVzXC4uLiIsIGJ1dCBwYXRoIHdpdGggc3BhY2UgY29uZnVzZXMgbWFrZSwgc28gd2UgZXhjbHVkZSBzeXN0ZW0KKyAgICAjICAgICAgICAgaGVhZGVycy4KKyAgICAjIC1RTUcgLS0gVHJlYXQgbWlzc2VkIGhlYWRlcnMgYXMgZ2VuZXJhdGVkLiBXZSBkbyBoYXZlIHNvbWUgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZXMuCisgICAgYy1mbGFncy1tICAgKz0gLVFNIC1RTU0gLVFNRworICAgIGN4eC1mbGFncy1tICs9IC1RTSAtUU1NIC1RTUcKKyAgICAjIEVuYWJsZSBDOTkgbGFuZ3VhZ2UuCisgICAgaWZuZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgIAljLWZsYWdzICAgKz0gLVFzdGQ9Z251OTkKKyAgICBlbmRpZgorICAgICMgRW5hYmxlIEMrKyBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgIyA/Pz8gV2h5IHdlIGRpc2FibGUgaXQgb24gTGludXgqIE9TPworICAgIGN4eC1mbGFncyArPSAtRUhzYworICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGljbCBpY2wuZXhlLCQoYykpIiAiIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1Rc2FmZXNlaAorICAgICAgICBlbmRpZgorICAgICAgICBpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjeHgpKSIgIiIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtUXNhZmVzZWgKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgICMgRW1pdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9uIgorICAgICAgICBjLWZsYWdzICAgKz0gLVppCisgICAgICAgIGN4eC1mbGFncyArPSAtWmkKKyAgICBlbmRpZgorICAgICMgSW5zdHJ1bWVudCBwcm9ncmFtIGZvciBwcm9maWxpbmcsIGdhdGhlciBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBjLWZsYWdzICAgKz0gLVFwcm9mX2dlbngKKyAgICAgICAgY3h4LWZsYWdzICs9IC1RcHJvZl9nZW54CisgICAgZW5kaWYKKyAgICAjIFR1cm4gb3B0aW1pemF0aW9uIG9uIG9yIG9mZi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgIyBQcmVzZW5jZSBvZiB0aGUgLWlubGluZS1taW4tc2l6ZT0xIHN3aXRjaCBzaG91bGQgb25seSBoZWxwCisgICAgICAgICMgdG8gcHJvbW90ZSBwZXJmb3JtYW5jZSBzdGFiaWxpdHkgYmV0d2VlbiBjaGFuZ2VzLAorICAgICAgICAjIGV2ZW4gaWYgaXQgaGFzIG5vIG9ic2VydmFibGUgaW1wYWN0IHJpZ2h0IG5vdy4KKyAgICAgICAgIyBTZWUgdGhlIExpbnV4KiBPUyBzZWN0aW9uIGFib3ZlLgorCWlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKwkgICAgYy1mbGFncyAgICs9IC1PMiAtUWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorCSAgICBjLWZsYWdzICAgKz0gLU8yCisJZW5kaWYgCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGN4eCkpIiAiIgorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMiAtUWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMgorCWVuZGlmCisgICAgZWxzZQorICAgICAgICBjLWZsYWdzICAgKz0gLU9kCisgICAgICAgIGN4eC1mbGFncyArPSAtT2QKKyAgICAgICAgIyBFbmFibGUgc3RhY2sgZnJhbWUgcnVudGltZSBlcnJvciBjaGVja2luZy4KKyAgICAgICAgIyAhISEgME9ic29sZXRlIG9wdGlvbi4gU2hvdWxkIHVzZSAvUlRDIGluc3RlYWQuCisgICAgICAgIGMtZmxhZ3MgICArPSAtUlRDMQorICAgICAgICBjeHgtZmxhZ3MgKz0gLVJUQzEKKyAgICBlbmRpZgorICAgICMgLS0tIEFzc2VtYmxlciAtLS0KKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzICAgPSBtbAorICAgIGVuZGlmCisgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgYXMgICA9IG1sNjQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXMpIiAiaWFzIgorICAgICAgICBhcy1vdXQgICA9IC1vJChzcGFjZSkKKyAgICBlbmRpZgorICAgIGlmbmVxICIkKGZpbHRlciBtbCBtbDY0LCQoYXMpKSIgIiIKKyAgICAgICAgYXMtb3V0ICAgPSAtRm8KKyAgICAgICAgYXMtZmxhZ3MgKz0gLW5vbG9nbyAtYworICAgIGVuZGlmCisgICAgIyAtLS0gRm9ydHJhbiAtLS0KKyAgICBmb3J0ICAgICAgICA9IGlmb3J0CisgICAgZm9ydC1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgZm9ydC1mbGFncyArPSAtbm9sb2dvCisgICAgZm9ydC1mbGFncyArPSAtYworICAgICMgLS0tIExpYnJhcmlhbiAtLS0KKyAgICBhciAgICAgPSBsaW5rLmV4ZQorICAgIGFyLW91dCA9IC1vdXQ6CisgICAgIyBHZW5lcmF0ZSBzdGF0aWMgbGlicmFyeS4gTXVzdCBiZSB0aGUgZmlyc3Qgb3B0aW9uLgorICAgIGFyLWZsYWdzICs9IC1saWIKKyAgICAjIFR1cm4gb2ZmIHRvb2wgYmFubmVyLgorICAgIGFyLWZsYWdzICs9IC1ub2xvZ28KKyAgICAjIC0tLSBMaW5rZXIgLS0tCisgICAgbGQgICAgICAgPSBsaW5rLmV4ZQorICAgIGxkLW91dCAgID0gLW91dDoKKyAgICAjIEdlbmVyYXRlIGR5bmFtaWMgbGlicmFyeS4KKyAgICBsZC1mbGFncy1kbGwgKz0gLWRsbAorICAgICMgVHVybiBvZmYgdG9vbCBiYW5uZXIuCisgICAgbGQtZmxhZ3MgKz0gLW5vbG9nbworICAgICMgR2VuZXJhdGUgcGRiIChQcm9ncmFtIERhdGFCYXNlLCBkZWJ1ZyBpbmZvcm1hdGlvbikgZmlsZS4KKyAgICAjIElmIERFQlVHX0lORk8gaXMgb24sIGdlbmVyYXRlIG5vcm1hbCAoZnVsbC1mZWF0dXJlZCkgcGRiIGZpbGUuIE90aGVyd2lzZSwgd2UgbmVlZCBvbmx5CisgICAgIyBzdHJpcHBlZCBwZGIuIEJ1dCBzdHJpcHBlZCBwZGIgY2Fubm90IGJlIGdlbmVyYXRlZCBhbG9uZSwgd2UgaGF2ZSB0byBnZW5lcmF0ZSBub3JtYWwgKmFuZCoKKyAgICAjIHN0cmlwcGVkIHBkYi4gQWZ0ZXIgZ2VuZXJhdGluZyBib3RoIHBkYiBmaWxlcyB3ZSByZW5hbWUgc3RyaXBwZWQgcGRiIHRvIG5vcm1hbCBwZGIgbmFtZSAoc2VlCisgICAgIyBydWxlcy5taykuCisgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9uIgorICAgICAgICBsZC1mbGFncyArPSAkKGlmICQocGRiX2ZpbGUpLC1kZWJ1ZyAtcGRiOiQocGRiX2ZpbGUpKQorICAgIGVsc2UKKyAgICAgICAgbGQtZmxhZ3MgKz0gJChpZiAkKHBkYl9maWxlKSwtZGVidWcgLXBkYjokKHBkYl9maWxlKSAtcGRic3RyaXBwZWQ6JChwZGJfZmlsZSkuc3RyaXBwZWQpCisgICAgZW5kaWYKKyAgICAjIFVzZSBkZWYgZmlsZSwgaWYgJChkZWZfZmlsZSkgaXMgc3BlY2lmaWVkLgorICAgIGxkLWZsYWdzICs9ICQoaWYgJChkZWZfZmlsZSksLWRlZjokKGRlZl9maWxlKSkKKyAgICAjIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5LCBpZiAkKGltcF9maWxlKSBpcyBzcGVjaWZpZWQuCisgICAgbGQtZmxhZ3MgKz0gJChpZiAkKGltcF9maWxlKSwtaW1wbGliOiQoaW1wX2ZpbGUpKQorICAgICMgU3BlY2lmeSBhcmNoaXRlY3R1cmUuCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBhci1mbGFncyArPSAtbWFjaGluZTppMzg2CisgICAgICAgIGxkLWZsYWdzICs9IC1tYWNoaW5lOmkzODYKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXJjaCkiICIzMmUiCisgICAgICAgIGFyLWZsYWdzICs9IC1tYWNoaW5lOmFtZDY0CisgICAgICAgIGxkLWZsYWdzICs9IC1tYWNoaW5lOmFtZDY0CisgICAgZW5kaWYKKyAgICAjIFNBRkVTRUgKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzLWZsYWdzICs9IC1zYWZlc2VoCisgICAgICAgIGxkLWZsYWdzICs9IC1zYWZlc2VoCisgICAgZW5kaWYKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMxL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMgYi9yYzEvcnVudGltZS90b29scy93aW5kb3dzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJlMDcwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMKQEAgLTAsMCArMSwyNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitleHBvcnQgU0hFTEwgPSBjbWQKKworIyBUT0RPIGdpdmUgYW4gZXJyb3IgaWYgYXJjaHMgZG9lc24ndCBtYXRjaAoraWZuZGVmIGFyY2gKKyAgICAkKGVycm9yIENvdWxkIG5vdCBkZXRlY3QgYXJjaDogcGxlYXNlIHNwZWNpZnkgb24gY29tbWFuZCBsaW5lLikKK2VuZGlmCisKKworQ01EPWNtZCAvQworQ1dEPSQoc2hlbGwgY21kIC9DIGVjaG8gJUNEJSkKK1JNPWNtZCAvQyBkZWwgL1EgL0YKK1JEPWNtZCAvQyBybWRpcgorTUQ9Y21kIC9jIG1rZGlyCitTTEFTSD1cXAorTlVMID0gbnVsCisKZGlmZiAtLWdpdCBhL3JjMS9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsIGIvcmMxL3J1bnRpbWUvdG9vbHMvd2lwZS1zdHJpbmcucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGVhYjk1ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsCkBAIC0wLDAgKzEsMTgzIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMiI7CisKK3N1YiB3aXBlKCQkJCkgeworCisgICAgbXkgKCAkaW5wdXQsICRvdXRwdXQsICR3aXBlICkgPSBAXzsKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggJGlucHV0LCAtYmluYXJ5ID0+IDEgKTsKKyAgICAkYnVsayA9fiBzeygkd2lwZSl9eyAiICIgeCBsZW5ndGgoICQxICkgfWdlOworICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisgICAgcmV0dXJuIHVuZGVmOworCit9OyAjIHN1YiB3aXBlCisKK215IEB3aXBlOworbXkgJHRhcmdldCA9ICIuIjsKK2dldF9vcHRpb25zKAorICAgICJ3aXBlLWxpdGVyYWw9cyIgICAgID0+CisgICAgICAgIHN1YiB7IG15ICRhcmcgPSAkX1sgMSBdOyBwdXNoKCBAd2lwZSwgcXJ7QHsgWyBxdW90ZW1ldGEoICRhcmcgKSBdIH19ICk7IH0sCisgICAgIndpcGUtcmVnZXhwPXMiICAgICAgPT4KKyAgICAgICAgc3ViIHsgbXkgJGFyZyA9ICRfWyAxIF07IHB1c2goIEB3aXBlLCBxcnskYXJnfSApOyB9LAorICAgICJ0YXJnZXQtZGlyZWN0b3J5PXMiID0+IFwkdGFyZ2V0LAorKTsKKworIyBDb252ZXJ0IHN0cmluZ3MgdG8gcmVndWxhciBleHByZXNzaW9uLgorbXkgJHdpcGUgPSBxcntAeyBbIGpvaW4oICJ8IiwgQHdpcGUgKSBdIH19OworCitteSAlam9iczsKKworIyBDb2xsZWN0IGZpbGVzIHRvIHByb2Nlc3MuCisjIGpvYnM6IG91dHB1dCAtPiBpbnB1dC4KK2ZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgIG15IEBpbnB1dHMgPSAoICReTyBlcSAiTVNXaW4zMiIgPyBic2RfZ2xvYiggJGFyZyApIDogKCAkYXJnICkgKTsKKyAgICBmb3JlYWNoIG15ICRpbnB1dCAoIEBpbnB1dHMgKSB7CisgICAgICAgIG15ICRmaWxlICAgPSBnZXRfZmlsZSggJGlucHV0ICk7CisgICAgICAgIG15ICRvdXRwdXQgPSBjYXRfZmlsZSggJHRhcmdldCwgJGZpbGUgKTsKKyAgICAgICAgaWYgKCBleGlzdHMoICRqb2JzeyAkb3V0cHV0IH0gKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgIlwiJGpvYnN7ICRvdXRwdXQgfVwiIGFuZCBcIiRpbnB1dFwiIGlucHV0IGZpbGVzIHRlbmQgdG8gYmUgd3JpdHRlbiAiIC4KKyAgICAgICAgICAgICAgICAgICAgInRvIHRoZSBzYW1lIG91dHB1dCBmaWxlIFwiJG91dHB1dFwiIgorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkam9ic3sgJG91dHB1dCB9ID0gJGlucHV0OworICAgIH07ICMgZm9yZWFjaAorfTsgIyBmb3JlYWNoICRmaWxlCisKKyMgUHJvY2VzcyBmaWxlcy4KKyVqb2JzID0gcmV2ZXJzZSggJWpvYnMgKTsgIyBqb2JzOiBpbnB1dCAtPiBvdXRwdXQuCitmb3JlYWNoIG15ICRpbnB1dCAoIHNvcnQoIGtleXMoICVqb2JzICkgKSApIHsKKyAgICBteSAkb3V0cHV0ID0gJGpvYnN7ICRpbnB1dCB9OworICAgIGluZm8oICJcIiRpbnB1dFwiIC0+IFwiJG91dHB1dFwiIiApOworICAgIHdpcGUoICRpbnB1dCwgJG91dHB1dCwgJHdpcGUgKTsKK307ICMgZm9yZWFjaCAkaW5wdXQKKworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPHdpcGUtc3RyaW5nLnBsPiAtLSBXaXBlIHN0cmluZyBpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8d2lwZS1zdHJpbmcucGw+IEk8T1BUSU9OPi4uLiBJPEZJTEU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdGFyZ2V0LWRpcmVjdG9yeT0+STxkaXI+CisKK0RpcmVjdG9yeSB0byBwdXQgcmVzdWx0IGZpbGVzIHRvLiBCeSBkZWZhdWx0IHJlc3VsdCBmaWxlcyBhcmUgd3JpdHRlbiBpbiB0aGUgY3VycmVudCB3b3JraW5nCitkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXdpcGUtbGl0ZXJhbD0+STxzdHI+CisKK1NwZWNpZnkgbGl0ZXJhbCBzdHJpbmcgdG8gd2lwZS4gTXVsdGlwbGUgbGl0ZXJhbHMgYXJlIGFsbG93ZWQuCisKKz1pdGVtIEI8LS13aXBlLXJlZ2V4cD0+STxzdHI+CisKK1NwZWNpZnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24gdG8gd2lwZS4gTXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBtYXkgYmUgc3BlY2lmaWVkLgorCitCZSBjYXJlZnVsLiBQcm90ZWN0IHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGJlaWduIGludGVycHJldGVkIGJ5IHNoZWxsLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSBuYW1lIHRvIHdpcGUgc3RyaW5nIGluLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCB3aXBlcyBzdHJpbmdzIGluIGZpbGVzLiBTdHJpbmcgbWF5IGJlIHNwZWNpZmllZCBsaXRlcmFsbHkgb3IgYnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24uCitTdHJpbmdzIGFyZSB3aXBlZCBieSByZXBsYWNpbmcgY2hhcmFjdGVycyB3aXRoIHNwYWNlcywgc28gc2l6ZSBvZiBmaWxlIHJlbWFpbnMgdGhlIHNhbWUuIFRoZSBzY3JpcHQKK21heSBiZSBhcHBsaWVkIHRvIGJvdGggdGV4dCBhbmQgYmluYXJ5IGZpbGVzLgorCitSZXN1bHQgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgZGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSwgb3IgdG8gZGlyZWN0b3J5IHNwZWNpZmllZCBieQorQjwtLXRhcmdldC1kaXJlY3Rvcnk+IG9wdGlvbiwgaWYgYW55LiBJZiBtdWx0aXBsZSBpbnB1dCBmaWxlcyB0ZW5kIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgb3V0cHV0CitmaWxlIChlLiBnLiBpZGVudGljYWxseSBuYW1lZCBpbnB1dCBmaWxlcyBsb2NhdGVkIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyksIHRoZSBzY3JpcHQgZ2VuZXJhdGVzIGFuCitlcnJvci4KKworVGhlIHNjcmlwdCByZWFkcyBlbnRpcmUgZmlsZSwgcHJvY2VzcyBpdCwgYW5kIHRoZSB3cml0ZXMgdG8gZGlzay4gVGhlcmVmb3JlIGl0IGlzIChhbG1vc3QpIHNhZmUgdG8KK3VwZGF0ZSBmaWxlcyBpbi1wbGFjZSAoc2VlIGV4YW1wbGVzKS4KKworPWhlYWQxIEVYQU1QTEVTCisKK1dpcGUgIkNvcHlyaWdodCIgd29yZCBpbiBhbGwgdGhlIGZpbGVzIHdpdGggInR4dCIgc3VmZml4IGluIGN1cnJlbnQgZGlyZWN0b3J5LCBvdmVyd3JpdGUgb3JpZ2luYWwKK2ZpbGVzICh1cGRhdGUgdGhlbSBpbi1wbGFjZSk6CisKKyAgICB3aXBlLXN0cmluZy5wbCAtLXdpcGUtbGl0ZXJhbD0iQ29weXJpZ2h0IiAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGFsbCB0aGUgZmlsZXMgd2l0aCAidHh0IiBzdWZmaXggaW4gY3VycmVudCBkaXJlY3RvcnksCit3cml0ZSByZXN1bHQgZmlsZXMgdG8gLi4vd2lwZWQgZGlyZWN0b3J5OgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLWxpdGVyYWw9Q29weXJpZ2h0IC0td2lwZS1saXRlcmFsPUNvcHlsZWZ0IC0tdGFyZ2V0LWRpcj0uLi93aXBlZCAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGZpbGVzIGZyb20gImRvYyIgZGlyZWN0b3J5LCB3cml0ZSByZXN1bHQgZmlsZXMgdG8gY3VycmVudAorZGlyZWN0b3J5OworCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iQ29weXJpZ2h0fENvcHlsZWZ0IiBkb2MvKgorCitXaXBlICJkZWZhdWx0bGliIiBkaXJlY3RpdmUgaW4gYWxsIHRoZSBsaWJyYXJ5IGZpbGVzOgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iLWRlZmF1bHRsaWI6W0EtWmEtejAtOV8uXSsiICoubGliCisKKyhCZSBjYXJlZnVsOiB0aGUgc2NyaXB0IGRvZXMgbm90IGFuYWx5emUgc3RydWN0dXJlIG9mIGxpYnJhcnkgYW5kIG9iamVjdCBmaWxlcywgaXQganVzdCB3aXBlcworVTxzdHJpbmdzPiwgc28gaXQgd2lwZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiBzdHJpbmdzIG1hdGNoaW5nIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24uKQorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9MSUNFTlNFIGIvcmMxL3Rlc3RzdWl0ZS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9NYWtlZmlsZSBiL3JjMS90ZXN0c3VpdGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMThkZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMjIgQEAKKyMgR2VuZXJhbCBNYWtlZmlsZSBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbXBpbGVyIGZsYWdzIGZvciB0aGUgdGVzdHMKKworIyBtb2RpZnkgQ0MgYW5kIENGTEFHUyBmb3IgT3Blbk1QIEMgY29tcGlsZXJzCisjIG1vZGlmeSBGQyBhbmQgRkZMQUdTIGZvciBPcGVuTVAgRm9ydHJhbiBjb21waWxlcnMKKworCisjIENvbnRlbnQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAxLiBCYXNpYyB1c2FnZQorIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyAzLiBDb21waWxlciBzZWxlY3Rpb24gYW5kIEZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxLiBCYXNpYyB1c2FnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIAltYWtlIGN0ZXN0CQlnZW5lcmF0ZSBjIHRlc3QgImN0ZXN0IgorIyAJbWFrZSBmdGVzdAkJZ2VuZXJhdGUgZm9ydHJhbiB0ZXN0ICJmdGVzdCIKKyMJbWFrZSBjbGVhbgkJcmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgYmluYXJpZXMKKyMgCW1ha2UgY2xlYW5hbGwJcmVtb3ZlcyBzb3VyY2VzLGJpbmFyaWVzIGFuZCBsb2dmaWxlcworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRm9yIGdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzIHNlZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisjIG9tcHRzLmNvbmYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEdOVSBDb21waWxlcgorQ0MgICAgID0gZ2NjCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKworIyBGdWppdHN1IENvbXBpbGVyczoKKyNDQyA9IGZjYworI0NGTEFHUyA9IC1LT01QLGZhc3RfR1AyPTIKKyNGQz1mcnQKKyNGRkxBR1M9LUtPTVAsZmFzdF9HUDI9MiAtdyAtQW0gLVg5IC1GaXhlZAorCisKKyMgUEdJIGNvbXBpbGVycworI0NDID0gcGdjYworI0NGTEFHUyA9IC1tcAorI0NGTEFHUyA9IC1tcCAtRFZFUkJPU0UKKyNDRkxBR1MgPSAtZmFzdCAtbXAKKworI0ZDID0gcGdmOTAKKyNGRkxBR1MgPSAtZmFzdCAtbXAKKyNGRkxBR1MgPSAtbXAgLWcKKworCisjIEludGVsIGNvbXBpbGVyczoKKyNDQyA9IGljYworI0NGTEFHUyA9IC1PMyAtaXAgLW9wZW5tcAorI0NGTEFHUyA9IC1XYWxsIC1PMCAtb3Blbm1wCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtIC1EVkVSQk9TRQorCisjRkMgPSBpZm9ydAorI0ZGTEFHUyA9IC1vcGVubXAgLWxtIC1mcHAKKworIyBPbW5pIGNvbXBpbGVyczoKKyNDQyA9IG9tcGNjCisjQ0ZMQUdTID0gLU8zIC1sbQorCisKKyMgQXNzdXJlIGNvbXBpbGVyczoKKyNDQyA9IGFzc3VyZWMKKyNDRkxBR1MgPSAtTzMgLVdBcG5hbWU9cHJvamVjdCAtRFVTRV9BU1NVUkU9MQorI0ZDID0KKyNGRkxBR1MgPQorCisjIE5FQzoKKyNDQyA9IGMrKworI0NDID0gc3hjKysKKyNDRkxBR1MgPSAtUG9wZW5tcAorCisjRkM9c3hmOTAKKyNGRkxBR1M9IC1Qb3Blbm1wCisKKworIyBIaXRhY2hpOgorI0NDID0geGNjCisjQ0ZMQUdTID0gLU80IC1wdmVjICtPcCAtcGFyYWxsZWwgLW9tcAorI0ZDID0KKyNGRkxBR1MgPQorCisKKyMgU0dJOgorI0NDID0gY2MKKyNDRkxBR1MgPSAtbXAgLWxtCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBJQk0gY29tcGlsZXJzOgorI0NDID0geGxjX3IKKyNDRkxBR1MgPSAtcXNtcD1vbXAgLWxtCisKKworI0ZDPXhsZjkwX3IKKyNGRkxBR1M9LXFzbXA9b21wIC1xZml4ZWQ9MTMyIC1xbGFuZ2x2bD1leHRlbmRlZAorCisKKyMgU1VOIGNvbXBpbGVycworI0NDID0gY2MKKyNDRkxBR1MgPSAtZmFzdCAteG9wZW5tcCAtbG0KKworI0ZDID1mOTAKKyNGRkxBR1MgPSAteG9wZW5tcCAtZmFzdCAtbG0KKworCisjIG9wZW42NCBjb21waWxlcnMKKyMgcmVtYXJrOiAtSS4gd2FzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIHRoZSBpbnN0YWxsYXRpb24gY2FtZSB3aXRob3V0IG9tcC5oIGZpbGUKKyNDQyA9IG9wZW5jYworI0NGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAtSS4gLWxvbXAgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JIC9ob21lL21hdHRoZXcvb3B0L3Vzci9pbmNsdWRlIC1scHRocmVhZAorI0NGTEFHUyA9IC1vcGVubXAgLWxtCisKKyNGQyA9IG9wZW5mOTAKKyNGRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gIC1sb21wIC1scHRocmVhZAorCisKKyNQYXRoc2NhbGUgQ29tcGlsZXIKKyNDQyA9IHBhdGhjYworI0NGTEFHUyA9IC1tcCAtT2Zhc3QgLWxtCisKKyNGQz1wYXRoZjkwCisjRkZMQUdTPSAtbXAgLU9mYXN0IC1sbQorCisKKyNPcGVuVUggQ29tcGlsZXIKKyNDQyA9IHVoY2MKKyNDRkxBR1MgPSAtbXAKKworI0ZDID0gdWhmOTAKKyNGRkxBR1MgPSAtbXAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgc291cmNlcyBhbmQgZXhlY3V0YWJsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbmFsbCIKKwlAZWNobyAiICAgIFJlbW92ZSB0aGUgZW50aXJlIGJpbi8gZGlyZWN0b3J5IgorCitvbXBfbXlfc2xlZXA6CisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfbXlfc2xlZXAuaCBiaW4vYy8KK29tcF90ZXN0c3VpdGU6IG9tcF90ZXN0c3VpdGUuaAorCW1rZGlyIC1wIGJpbi9jCisJY3Agb21wX3Rlc3RzdWl0ZS5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZS5oOiBvbXB0cy1jLmNvbmYgYy8qCisJLi9vbXB0c19tYWtlSGVhZGVyLnBsIC1mPW9tcHRzLWMuY29uZiAtdD1jCisuYy5vOiBvbXBfdGVzdHN1aXRlIG9tcF9teV9zbGVlcAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorCitjdGVzdDogb21wX215X3NsZWVwIG9tcF90ZXN0c3VpdGUKKwkuL3J1bnRlc3QucGwgLS1sYW5nPWMgdGVzdGxpc3QtYy50eHQKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworY2xlYW5zcmNzOgorCWZpbmQgYmluLyAtaW5hbWUgIiouW2NmXSIgLWV4ZWMgcm0ge30gXDsKK2NsZWFuYmluczoKKwlmaW5kIGJpbi8gLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIHt9IFw7CitjbGVhbmxvZ3M6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5sb2ciIC1leGVjIHJtIHt9IFw7CisKK2NsZWFuOiBjbGVhbnNyY3MgY2xlYW5iaW5zCisKK2NsZWFuYWxsOgorCXJtIC1yZiBiaW4vCisKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvUkVBRE1FIGIvcmMxL3Rlc3RzdWl0ZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhN2M2MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvUkVBRE1FCkBAIC0wLDAgKzEsMzM0IEBACisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfCAgICAgICAgICAgICAgICAgICBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSAgViAzLjAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIsIFN0dXR0Z2FydCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24gICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gMjAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RBQkxFIE9GIENPTlRFTlRTCisKK0kgICAgCUlOVFJPRFVDVElPTgorSS4xLgkgIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KK0kuMi4gCSAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCisKK0lJCQlVU0FHRQorSUkuMS4JICBGaXJzdCBydW4gd2l0aCBtYWtlCitJSS4yCSAgV2hlcmUgdG8gc2VhcmNoIGZvciByZXN1bHRzCitJSS4zLgkgIFVzaW5nIHRoZSBydW50ZXN0IHNjcmlwdAorCitJSUkJCUFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzCitJSUkuMS4JICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK0lWCQlLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKworViAgICAgICBDb250YWN0IGFuZCBTdXBwb3J0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJLiAgSU5UUk9EVUNUSU9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSS4xLiAgQWltcyBhbmQgZ2VuZXJhbCBmdW5jdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE9wZW5NUCB2YWxpZGF0aW9uIHN1aXRlIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbgorb2YgT3Blbk1QIGluIGNvbXBpbGVycy4gSXQgaXMgY2FwYWJsZSBvZiBjaGVja2luZyBGb3J0cmFuIGFzIHdlbGwgYXMgYworY29tcGlsZXIuCisKK1Rlc3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHN0YXRpc3RpY3MuIEVhY2ggZGlyZWN0aXZlIGlzIHRlc3RlZAorYnkgY29tcHV0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIHJlc3VsdCB3aXRoIHRoZSBhbHJlYWR5IGtub3duIHZhbHVlLiBJbiBtb3N0CitjYXNlcyBhIHdyb25nIGltcGxlbWVudGF0aW9uIGNhbiByZXN1bHQgaW4gdGhlIHJpZ2h0IHZhbHVlcy4gU28gdGhlIHRlc3RzIGFyZQorcnVuIHNldmVyYWwgdGltZXMuCisKK0FkZGl0aW9uYWxseSwgdGhlIHZhbGlkYXRpb24gc3VpdGUgY3JlYXRlcyBzbyBjYWxsZWQgY3Jvc3N0ZXN0cyBmb3IgZWFjaAorZGlyZWN0aXZlLiBUaGVzZSBhcmUgdGVzdHMgaW4gd2hpY2ggZWl0aGVyIHRoZSBkaXJlY3RpdmUgaXMgbWlzc2luZyBvciB1c2VkCit3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuIElmIHRoaXMgc28gY2FsbGVkIGNyb3NzdGVzdCBmYWlscywgdGhpcyBpbmRpY2F0ZXMKK3N0cm9uZ2x5IHRoYXQgdGhlIHByZXZpb3VzIHRlc3QgaXMgY2FwYWJsZSBvZiB0ZXN0aW5nIHRoZSBkaXJlY3RpdmUuCisKK0xhc3RseSwgYW4gb3JwaGFuZWQgdGVzdCBpcyBhbHNvIHJ1biB0byBkZXRlcm1pbmUgaWYgdGhlIGRpcmVjdGl2ZSBiZWluZwordGVzdGVkIGlzIGFibGUgdG8gY29ycmVjdGx5IHJ1biB3aGVuICdvcnBoYW5lZCcgZnJvbSB0aGUgbWFpbiBmdW5jdGlvbi4KK0Vzc2VudGlhbGx5LCB0aGUgZGlyZWN0aXZlJ3MgY29kZSBpcyBwbGFjZWQgaW50byBpdHMgb3duIGZ1bmN0aW9uIHdoaWNoIGlzCitjYWxsZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBmdW5jdGlvbiBhbmQgb2Z0ZW4gaW5zaWRlIGEgcGFyYWxsZWwKK3JlZ2lvbi4KKworCitJLjIuICBGaWxlcyBhbmQgZGlyZWN0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkIGMgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIGMgdGVzdHMKK2QgZm9ydHJhbiAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzCisgIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBjb21tb25fdXRpbGl0eS5mCisgIG9tcF9teV9zbGVlcC5oICAgICAgICAgICAgdGhyZWFkIHNhdmUgc2xlZXAgZnVuY3Rpb24KKyAgb21wX3Rlc3RzdWl0ZS5mICAgICAgICAgICBGb3J0cmFuIGhlYWRlciBmaWxlCisgIG9tcF90ZXN0c3VpdGUuaCAgICAgICAgICAgYXV0b2dlbmVyYXRlZCBjLWhlYWRlciBmaWxlCisgIG9tcHRzLWMuY29uZiAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYyB0ZXN0cyBhYm91dCBob3cgb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdHMgc2hhbGwgYmUgZXhlY3V0ZWQgb3IgaG93IGxhcmdlIHRoZSBsb29wIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcworICBvbXB0c19tYWtlSGVhZGVyLnBsCSAgICBwZXJsIG1vZHVsZSBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW9uIG9mIGFuIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGF0ZSBoZWFkZXIgZmlsZQorICBvbXB0c19wYXJzZXJGdW5jdGlvbnMucG0JcGVybCBtb2R1bGUgY29udGFpbmluZyBnZW5lcmFsIGZ1bmN0aW9ucyBmb3IKKwkJCQkgICAgICAgICAgICB0aGUgcGFyc2VyLnBsIHNjcmlwdAorICBvbXB0c19wYXJzZXIucGwJICAgICAgICBzY3JpcHQgZm9yIGdlbmVyYXRpbmcgdGhlIHNvdXJjZSBjb2RlIG91dCBvZiB0aGUgdGVtcGxhdGVzCisgIG9tcHRzX3N0YW5kYWxvbmVQcm9jLmMJZnJhbWV3b3JrIGZvciB0aGUgYyB0ZXN0cworICBvbXB0c19zdGFuZGFsb25lUHJvYy5mCWZyYW1ld29yayBmb3IgdGhlIEZvcnRyYW4gdGVzdHMKKyAgUkVBRE1FCQkgICAgICAgICAgICB0aGUgUkVBRE1FIGZpbGUgeW91J3ZlIGFscmVhZHkgZm91bmQgOy0pCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgY29udGFpbnMgbGljZW5zZSBpbmZvcm1hdGlvbgorICBydW50ZXN0LnBsCQkgICAgICAgIHRoZSBmcmFtZSBwcm9ncmFtIG9mIHRoZSB0ZXN0IHN1aXRlCisgIHRlc3RsaXN0LWYudHh0CSAgICAgICAgdGVzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSB0ZXN0cyBmb3IgRm9ydHJhbgorICB0ZXN0bGlzdC1jLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIGMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUkuICBVU0FHRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSUkuMS4gRmlyc3QgcnVuIHdpdGggbWFrZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitZb3UgY2FuIGRvIGEgZmlyc3Qgc2ltcGxlIHJ1biBvZiB0aGUgdGVzdHN1aXRlIG9ubHkgYWZ0ZXIgb25lIHN0ZXAgb2YKK2NvbmZpZ3VyYXRpb246CisKKzEpIE1vZGlmeSB0aGUgb21wdHMuY29uZiBhbmQgb21wdHMtYy5jb25mIGZpbGUsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMKK2FuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgZWFjaCB0ZXN0LgorCisyKSBNb2RpZnkgdGhlIE1ha2VmaWxlLCB1bmNvbW1lbnRpbmcgdGhlIENDL0ZDIGFuZCBDRkxBR1MvRkZMQUdTIHZhcmlhYmxlcyBmb3IKK3RoZSBjb21waWxlciBvZiB5b3VyIGNob2ljZS4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdHN1aXRlIGVpdGhlciBmb3IgYSBDIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBjdGVzdAorCitvciBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBmdGVzdAorCisKK0lJLjIuIFJ1bm5pbmcgY3VzdG9tIHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0luIG9yZGVyIHRvIHJ1biBzaW5nbGUgdGVzdHMgb3IgY3VzdG9tIGdyb3VwcyBvZiB0ZXN0cywgdHdvIG1ha2UgY29tbW1hbmRzCithcmUgZGVmaW5lZDogbWFrZSBzdGVzdCBhbmQgbWFrZSBmc3Rlc3QuIFRoZXNlIHR3byBjb21tYW5kIHJlZmVyZW5jZSB0aGUgZmlsZQorY3VzdG9tdGVzdC50eHQgd2hlbiBsb29raW5nIGZvciBhIHRlc3RsaXN0IHRvIHVzZS4gU2ltcGx5IGVkaXQgY3VzdG9tdGVzdC50eHQKK3RvIGluY2x1ZGUgdGhlIGRlc2lyZWQgdGVzdCBvciB0ZXN0cy4gSWYgY3VzdG9tdGVzdC50eHQgY29udGFpbnMgYyB0ZXN0cywKKworPiAgICAgIG1ha2Ugc3Rlc3QKKworb3IgZm9yIGZvcnRyYW4gdGVzdHMKKworPiAgICAgIG1ha2UgZnN0ZXN0CisKK0luIG9yZGVyIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBpbiB0aGUgdGVzdHMsIHNpbXBseSBlZGl0IHRoZQorTWFrZWZpbGUgdmFyaWFibGVzIE1JTlRIUkVBRFMgYW5kIE1BWFRIUkVBRFMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGNvbmZpZ3VyZWQKK3RvIHVzZSAyIHRocmVhZHMuIFRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdCBpcyBydW4sIGZvciBjIHRlc3RzCitlZGl0IHRoZSBSRVBFVElUSU9OUyB2YXJpYWJsZSBpbiB0aGUgZmlsZSBvbXB0cy1jLmNvbmYuIFRoZSBMT09QQ09VTlQgYW5kCitTTEVFUFRJTUUgdmFyaWFibGVzIGNhbiBhbHNvIGJlIGNoYW5nZWQgaGVyZS4gRm9yIGZvcnRyYW4gdGVzdHMsIGVkaXQgdGhlIGZpbGUKK29tcF90ZXN0c3VpdGUuZiB0byBjaGFuZ2UgYm90aCB0aGUgTE9PUENPVU5UIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdAoraXMgcnVuLgorCisKKworSUkuMy4gVW5kZXJzdGFuZGluZyB0aGUgcmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworV2hlbiBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgdGhlIHJlc3VsdHMgd2lsbCBiZSBzaG93biBvbiB0aGUgc2NyZWVuLgorCitJZiB5b3UgbmVlZCB0aGUgcmVzdWx0cyBmb3IgZnVydGhlciBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSByZXN1bHRzLnR4dCwgd2hpY2gKK2lzIGEgc2ltcGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cyBmb3IgZWFjaCBkaXJlY3RpdmUKK2luIGEgc2luZ2xlIGxpbmUuIEVhY2ggbGluZSBzdGFydHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLiBUaGVuIGZvbGxvd3MKK3RoZSByZXN1bHQgb2YgdGhlIHRlc3QgZ2l2ZW4gaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBhc3NlZCB0ZXN0cy4gSWYgMTAwJSBvZgordGhlIHRlc3RzIHBhc3NlZCBzdWNjZXNzZnVsbHksIHRoZSBzZWNvbmQgbnVtYmVyIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlCitjb3JyZXNwb25kaW5nIGNyb3NzdGVzdC4gQ3Jvc3N0ZXN0cyB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBub3JtYWwgdGVzdCBwYXNzZXMKK3dpdGggMTAwJSBhY2N1cmFjeS4gSWYgYSBjcm9zc3Rlc3Qgd2FzIG5vdCBydW4gb3IgYSB0ZXN0IGRvZXMgbm90IGV4aXN0LCBpdCBpcworZGVub3RhdGVkIGJ5IGEgIi0iLgorQWZ0ZXIgdGhlIHJlc3VsdHMgb2YgdGhlIG5vcm1hbCB0ZXN0cywgdGhlcmUgZm9sbG93IGEgc2VyaWVzIG9mIHRlc3RzIGluIHRoZQorb3JwaGFuZWQgbW9kZS4gSWYgdGhlcmUgd2VyZSBubyBvcnBoYW5lZCB0ZXN0cyBhdmFpbGFibGUgdGhpcyBpcyBzaG93biBieSBhICItIi4KKworSWYgeW91IHJ1biB0aGUgdGVzdHN1aXRlIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdGhyZWFkcyAoZS5nLiB1c2luZyB0aGUKK3J1bnRlc3QucGwgc2NyaXB0KSB0aGUgcmVzdWx0cyBhcmUgc2hvd24gaW4gYmxvY2tzIG9mIDQgY29sdW1ucyBmb3IgZWFjaCBudW1iZXIKK29mIHRocmVhZHMuCisKK0lmIGEgdGVzdCBmYWlscyB5b3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgb21wdHMubG9nLAorYmluL2MvKi5vdXQgYW5kICoubG9nIGZpbGVzLiBXaGlsZSB0aGUgb21wdHMubG9nIGZpbGUgY29udGFpbnMgYWxsIGNvbXBpbGVyCitlcnJvciBtZXNzYWdlcyBmb3IgYWxsIHRlc3RzLCB0aGUgKi5vdXQgYW5kICoubG9nIGZpbGVzIGNvbnRhaW4gZGV0YWlsZWQgaW5mb3JhbXRpb24KK29uIHRoZSBleGVjdXRpb24gcHJvY2VzcyBvZiB0aGUgc2luZ2xlIHRlc3RzLgorSW4gdGhlICoub3V0IGZpbGVzIHRoZXJlIGFyZSBsaXN0ZWQgYWxsIHRoZSByZXN1bHRzIG9mIHRoZSBzaW5nbGUgZXhlY3V0aW9ucyBvZgordGhlIHRlc3RzLiBJbiB0aGUgKi5sb2cgZmlsZXMgdGhlcmUgYXJlIGVycm9yIG1lc3NhZ2VzIG9mIHRoZSB0ZXN0cyBpdHNlbGYuCisKKworSUkuNC4gQ2xlYW5pbmcgVXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKKworQmVjYXVzZSBtYW55IGZpbGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggdGVzdGVkIGRpcmVjdGl2ZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5Cit0byBjbGVhbiB0aGUgbWFpbiBkaXJlY3RvcnkgYWZ0ZXIgYSBiYXR0ZXJ5IG9mIHRlc3RzLiBUbyBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCitpbiB0aGUgbWFpbiBkaXJlY3RvcnkgaW5jbHVkaW5nIHRoZSByZXN1bHRzIGFuZCBsb2cgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW4KKworCitUbyBjbGVhbiBvbmx5IHRoZSBsb2dzIGFuZCBvdXQgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW5sb2dzCisKK1RvIGNsZWFuIG9ubHkgdGhlIHJlc3VsdHMsCisKKz4gICAgIG1ha2UgY2xlYW5yZXN1bHRzCisKKworCitJSS40LiBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitTbyBmb3Igc3BlY2lhbCBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGEgbG90Cittb3JlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24gcHJvY2VzcyB0aGFuIHRoZSBleGVjdXRpb24gd2l0aCBtYWtlLgorCitVc2luZyB0aGUgcnVudGVzdC5wbCBzY3JpcHQgaXMgcmF0aGVyIGVhc3kuIFlvdSBjYW4gdXNlIHRoZSB0aGUgdGVzdCBzdWl0ZSBvbmx5CithZnRlciB0d28gc3RlcHMgb2YgbW9kaWZpY2F0aW9uczoKKworMS4pIE1vZGlmeSB0aGUgTWFrZWZpbGUgdG8geW91ciB3aXNoZXMgY2hvb3NpbmcgeW91ciBjb21waWxlciBhbmQgdGhlIG5lY2Vzc2FyeQorICAgIGNvbXBpbGVyIGZsYWdzLgorMi4pIElmIG5lY2Vzc2FyeSBlZGl0IG9uZSBvZiB0aGUgdGVzdCBsaXN0cyAodGVzdGxpc3QtYy50eHQpIGFuZCBjb21tZW50IG91dCB0aGUKKyAgICB0ZXN0cyB5b3UgZG8gbm90IHdhbnQgdG8gcnVuIHVzaW5nICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuIFRlc3RsaXN0cyBmb3IgRm9ydHJhbiBlbmQKKyAgICB3aXRoIC1mLnR4dCB3aGlsZSB0ZXN0IGxpc3RzIGZvciBjIHdpdGggLWMudHh0LgorCitBbmQgbm93IHlvdSBjYW4gcnVuIHRoZSB0ZXN0IHN1aXRlIGVpdGhlciBmb3IgRm9ydHJhbiB1c2luZworCSMJPiAgLi9ydW50ZXN0LnBsIC1sYW5nPWZvcnRyYW4gLWQ9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorb3IgZm9yIGMKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1jIC1kPWMgdGVzdGxpc3QtYy50eHQKKworV2l0aCB0aGUgLS1oZWxwIG9wdGlvbiB5b3UgY2FuIHNob3cgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgdGhlaXIKK2V4cGxhbmF0aW9ucy4KKworVGhlIHRlc3QgcmVzdWx0cyBhcmUgc3VtbWFyaXplZCBpbiBjcmVzdWx0cyBvciBmcmVzdWx0cy50eHQgd2hpbGUgKi5sb2cga2VlcAorZGV0YWlscyBmb3IgaW5kaXZpZHVhbCB0ZXN0cy4gVGhlcmUgaXMgYWxzbyBhIGZpbGUgKG9tcHRzLmxvZykga2VlcGluZworY29tcGlsYXRpb24gaW5mb3JtYXRpb24uIChzZWUgc2VjdGlvbiBJSS4yICkKKworSWYgeW91IGRvbid0IHdhbnQgdG8gdGVzdCB0aGUgZGlyZWN0aXZlcyBpbiBvcnBoYW5lZCBtb2RlIHlvdSBjYW4gdXNlIHRoZQorLW5vcnBoYW4gb3B0aW9uLiBZb3UgYWxzbyBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCBlaXRoZXIgdG8gY29tcGlsZSBhbGwKK3Rlc3RzIG9yIHJ1biBjb21waWxlZCB0ZXN0cyBlLmcuIGZvciBjcm9zcyBjb21waWxhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuIEZvcgordGhpcyB0aGVyZSBhcmUgdGhlIG9wdGlvbnMgLW5vcnVuIGFuZCAtbm9jb21waWxlLgorCitIYXBweSB0ZXN0aW5nIQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJSUkuCUhvdyB0byBhZGQgbmV3IHRlc3RzIC8gVGhlIHN0cnVjdHVyZSBvZiB0ZXN0IHRlbXBsYXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lJSS4xICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc3VpdGUgaXMgYmFzZWQgb24gdGVtcGxhdGVzIHNvIHRoYXQgeW91IG9ubHkgaGF2ZSBvbmUgZmlsZSBmb3IgdGVzdCwKK2Nyb3NzdGVzdCBhbmQgdGhlIG9ycGhhbmVkIHZlcnNpb25zIG9mIHRoZW0uCisKKwlBKSBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK1RoZSBzeW50YXggb2YgdGhlIHRlbXBsYXRlcyBpcyBtdWNoIGxpa2UgeG1sLiBTbyBlYWNoIHRlc3QgYmVnaW5zIHdpdGgKKyc8b21wdHM6dGVzdD4nIGFuZCBlbmRzIHdpdGggJzwvb21wdHM6dGVzdD4nLgorCitJbiBiZXR3ZWVuIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGJsb2NrcyBob2xkaW5nIGluZm9ybWF0aW9uOgorCistIDxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPiBJbiBiZXR3ZWVuIHRoaXMgdGFnIHlvdSBjYW4KKyAgZ2l2ZSBhIGRlc2NyaXB0aW9uIG9uIHdoYXQgdGhlIHRlc3QgY2hlY2tzIGFuZCBob3cgaXQgd29ya3MuCisKKy0gPG9tcHRzOm9tcHZlcnNpb24+IDwvb21wdHM6dmVyc2lvbj4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICBPcGVuTVAtdmVyc2lvbiB3aGljaCBpbmNsdWRlcyB0aGUgdGVzdGVkIGRpcmVjdGl2ZS4KKworLSA8b21wdHM6ZGlyZWN0aXZlPiA8L29tcHRzOmRpcmVjdGl2ZT4gVXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RpdmUgaG93IGl0IGlzCisgIGNhbGxlZCBpbiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKKy0gPG9tcHRzOmRlcGVuZGVuY2VzPiA8L29tcHRzOmRlcGVuZGVuY2VzPiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gc3BlY2lmeSBvdGhlcgorICBvbXAgZGlyZWN0aXZlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgY29ycmVjdCBleGVjdXRpb24gb2YgeW91ciB0ZXN0LgorVGhlIGRpcmVjdGl2ZXMgaGF2ZSB0byBiZSBsaXN0ZWQgYnkgdGhlaXIgZGlyZWN0aXZlIG5hbWVzIGFzIGl0IGlzIGNhbGxlZCBpbgordGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLiBNdWx0aXBsZSBkaXJlY3RpdmVzIGFyZSBzZXBhcmF0ZWQgYnkgJywnLgorCistIDxvbXB0czp0ZXN0Y29kZT4gPC9vbXB0czp0ZXN0Y29kZT4gSW4gdGhpcyB0YWcgc3RhbmRzIHRoZSB3aG9sZSBzb3VyY2UgY29kZQorZm9yIHRoZSB0ZXN0IC8gY3Jvc3N0ZXN0LiAgRWFjaCB0ZXN0IGhhcyB0byBiZSB3cml0dGVuIGFzIGEgZnVuY3Rpb24uIFRoZQorc3ludGF4IG9mIHRoZSBmdW5jdGlvbnMgZGlmZmVycyBiZXR3ZWVuIEMgYW5kIEZvcnRyYW46IEluIEMgaXQgaGFzIHRvIHRha2UgYQorZmlsZSBwb2ludGVyICdGSUxFICogbG9nRmlsZScgYW5kIHJldHVybiBhbiBpbnQuIElmIHRoZSB0ZXN0IGhhcyBiZWVuIHBhc3NlZAorc3VjY2Vzc2Z1bCBpdCBoYXMgdG8gcmV0dXJuIGEgdmFsdWUgdW5lcXVhbCB0byAwLiBUaGUgZmlsZSBwb2ludGVyIGNhbiBiZSB1c2VkCit0byB3cml0ZSBpbmZvcm1hdGlvbiBpbnRvIGEgbG9nIGZpbGUuICBJbiBGb3J0cmFuIHRoZSBmdW5jdGlvbiB0YWtlcyBubworYXJndW1lbnQgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIG11c3Qgbm90IGV4Y2VlZCBYWCBjaGFyYWN0ZXJzLiAgVGhlIHJldHVybiB2YWx1ZQoraGFzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgJzx0ZXN0ZnVuY3Rpb25uYW1lPicgdGFncy4gSXQgaGFzIHRvIGJlIDEgaWYgdGhlCit0ZXN0IHN1Y2NlZWRlZCBhbmQgMCBpZiB0aGUgdGVzdCBmYWlsZWQuIEZvciBkZXRhaWxzIHNlZSB0aGUgZXhhbXBsZS4KKworVG8gdGVsbCB0aGUgdGVzdCBzdWl0ZSB0aGUgbmFtZSBvZiB5b3VyIHRlc3QgZnVuY3Rpb24geW91IGhhdmUgdG8gZW5jbG9zZSBpdAoraW50byB0aGUgJzxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPicgdGFnLgorCitJZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXN0IGFuZCBjcm9zc3Rlc3QgeW91IGNhbiB1c2UgdGhlCis8b21wdHM6Y2hlY2s+IDwvb21wdHM6Y2hlY2s+IGFuZCA8b21wdHM6Y3Jvc3NjaGVjaz4gPC9vbXB0czpjcm9zc2NoZWNrPiB0YWcuCitXaGVuIGdlbmVyYXRpbmcgdGhlIHRlc3QgdGhlIHBhcnNlciB3aWxsIHVzZSB0aGUgY29kZSBlbmNsb3NlZCBpbgorPG9tcHRzOmNoZWNrPiB0YWdzIGFuZCBjdXQgb3V0IHRoZSBjb2RlIHdyaXR0ZW4gaW4gPG9tcHRzOmNyb3NzY2hlY2s+IHRhZ3MuIFNvCit5b3UgaGF2ZSB0d28gcG9zc2liaWxpdGllcyB0byB3cml0ZSB5b3VyIHRlbXBsYXRlIGZvciB0ZXN0IGFuZCBjcm9zc3Rlc3Q6IFRoZQorZmlyc3Qgd2F5IHlvdSBjYW4gd3JpdGUgdGhlIGNvbXBsZXRlIGNvZGUgaXMgdG8gd3JpdGUgdGhlIHRlc3QgaW4gb25lCis8b21wdHM6Y2hlY2s+IHRhZyBhbmQgbGF0ZXIgdGhlIGNyb3NzdGVzdCBpbiBvbmUgPG9tcHRzOmNyb3NzY2hlY2s+IHRhZy4gIFRoZQorc2Vjb25kIHdheSBpcyB0byB3cml0ZSBib3RoIHRlc3RzIG9ubHkgYnkgZW5jbG9zaW5nIGRpZmZlcmluZyBwYXJ0cyBpbgorY29ycmVzcG9uZGluZyB0YWdzLgorCitUaGUgZmlyc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgdGVzdCBhbmQgY3Jvc3N0ZXN0IGRpZmZlciBtdWNoIGZyb20KK2VhY2ggb3RoZXIuIFRoZSBzZWNvbmQgZS5nLiBpZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSBhIGZldyBvcHRpb25zIGxpa2UKK3JlcGxhY2luZyBhbiBvbXAgc2luZ2xlcHJpdmF0ZSBjbGF1c2UgYnkgYW4gb21wIHByaXZhdGUgY2xhdXNlIG9yIHRvIGN1dCBvdXQKK2EgZGlyZWN0aXZlIGxpa2Ugb21wIGZsdXNoLiAgV2hlbiB5b3UgdXNlIHRoZSBmaXJzdCB3YXkgeW91IGhhdmUgdG8gdGFrZSBjYXJlCitvZiB0aGUgZnVuY3Rpb24gbmFtZSEgWW91IGhhdmUgdG8gZGVjbGFyZSBpdCB0d2ljZSB3aXRoCis8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiEKKworLSA8b21wdHM6b3JwaGFuPiA8L29tcHRzOm9ycGhhbj4gVGhpcyB0YWcgY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gZW5hYmxlCisgIHlvdXIgdGVzdCB0byBjaGVjayB0aGUgZGlyZWN0aXZlIGluIG9ycGhhbiByZWdpb25zLCB0b28uICBUaGUgY29kZSBlbmNsb3NlZAoraW4gdGhpcyBwYXJ0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkCitpbnN0ZWFkLiAgSWYgeW91IGhhdmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIG91dHNpZGUgdGhpcyByZWdpb24geW91IGhhdmUgdG8KK2RlY2xhcmUgdGhlbSBhcyBnbG9iYWwgdmFyaWFibGVzIGVuY2xvc2VkIGluIGFuIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLiBGb3IKK2Z1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPG9tcHRzOm9ycGhhbjp2YXJzPiB0YWcuCisKKy0gPG9tcHRzOm9ycGhhbjp2YXJzPiA8L29tcHRzOm9ycGhhbjp2YXJzPiBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgZ2xvYmFsCisgIHZhcmlhYmxlcyBmb3IgYW4gb3JwaGFuIHJlZ2lvbiB3aGljaCBhbGxvdyB0aGUgZXhjaGFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4KK3RoZSBtYWluIHByb2dyYW0gYW5kIHRoZSBvcnBoYW5lZCBmdW5jdGlvbnMuIFRoZSB1c2FnZSBkaWZmZXJzIGJldHdlZW4gQyBhbmQKK0ZvcnRyYW4uICBJbiBDIHlvdSBoYXZlIHRvIHVzZSBhIHNpbmdsZSBkZWNsYXJhdGlvbiBmb3IgZWFjaCB2YXJpYWJsZS4gWW91IGNhbgorZWl0aGVyIGRlY2xhcmUgYWxsIHZhcmlhYmxlcyBpbiBvbmUgc2luZ2xlIG9yIGluIHNldmVyYWwgZGlmZmVyZW50IHJlZ2lvbnMuIFlvdQorbXVzdCBub3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGluc2lkZSEgIEluIEZvcnRyYW4geW91IGhhdmUgdG8gcHV0IGFsbAorZGVjbGFyYXRpb25zIGluIG9uZSBzaW5nbGUgdGFnLiBCZWNhdXNlIHRoZXJlIGV4aXN0IG5vIGdsb2JhbCB2YXJpYWJsZXMgYXMgaW4KK0MgeW91IGhhdmUgdG8gdXNlIGNvbW1vbiBibG9ja3MuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZXhhbXBsZXMuCisKK0lJSS4yLiAgQWRkaW5nIHRlc3RzIHRvIHRoZSB0ZXN0IGxpc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgbmV3IHRlc3QgeW91IGhhdmUgdG8gYWRkIHRoZW0gdG8gYSB0ZXN0bGlzdC4gU2ltcGx5CithZGQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYSBuZXcgTGluZSBpbnRvIGEgZmlsZS4KKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0lWLiAgIEtub3duIElzc3VlcyBhbmQgV29ya2Fyb3VuZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBTdW4gT1MgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSAtbWF4ZGVwdGggb3B0aW9uIG9uIHRoZSAnbWFrZSBjbGVhbmFsbCcKK2NvbW1hbmQuIFRoaXMgcHJldmVudHMgdGhlIHRlc3RzIGZyb20gYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIGZ1dHVyZSB0ZXN0cy4gVG8gcmVtZWR5LCBlZGl0IHRoZSBtYWtlZmlsZSBsaW5lCit1bmRlciB0aGUgY2xlYW4gY29tbWFuZDoKKworICAgICAtcm0gW2NmXXRlc3QqLltjZl0gW2NmXWNyb3NzdGVzdCouW2NmXSBbY2ZdY3Rlc3QqLltjZl0gW2NmXW9ycGhhbiouW2NmXQorCitDaGFuZ2UgdG86CisKKyAgICAgLXJtIFtjZl10ZXN0KiBbY2ZdY3Jvc3N0ZXN0KiBbY2ZdY3Rlc3QqIFtjZl1vcnBoYW4qCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVi4gICBDb250YWN0IGFuZCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGFjdDogaHR0cDovL3d3dy5jcy51aC5lZHUvfmhwY3Rvb2xzCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhOTczCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDMwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIE9wZW5NcCBzdXBwb3J0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5fT1BFTk1QPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+aGFzX29wZW5tcDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBydmFsdWUgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIDxvbXB0czpjaGVjaz4KKyNpZmRlZiBfT1BFTk1QCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjaWYgMAorCXJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICA8L29tcHRzOm9ycGhhbj4KKwlyZXR1cm4gKHJ2YWx1ZSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKQEAgLTAsMCArMSw0MzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKyAgICAgICAgaW50IGRpZmY7CisgICAgICAgIGRvdWJsZSBkc3VtID0gMDsKKyAgICAgICAgZG91YmxlIGR0ID0gMC41OwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgICAgIGRvdWJsZSBkZGlmZjsKKyAgICAgICAgaW50IHByb2R1Y3Q7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgKmxvZ2ljczsKKyAgICAgICAgaW50IGJpdF9hbmQgPSAxOworICAgICAgICBpbnQgYml0X29yID0gMDsKKyAgICAgICAgaW50IGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisgICAgaW50IGo7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fZGlmZjsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNfYW5kID0gMTsKKyAgICBpbnQgbG9naWNfb3IgPSAwOworICAgIGRvdWJsZSBka25vd25fc3VtOworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OworICAgIGRvdWJsZSBkcHQsIGRpdjsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgICAKKyAgICBzdW0gPSAwOworICAgIGRpZmYgPSAwOworICAgIHByb2R1Y3QgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorCQlzdW0gKz0gaTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICAgc3VtLCBrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gICAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBkaWZmIC09IGk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9kaWZmID0gKChMT09QQ09VTlQgLSAxKSAqIExPT1BDT1VOVCkgLyAyICogLTE7CisgICAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICAgIGRzdW0gPSAwOworICAgIGRwdCA9IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorICAgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRzdW0gKz0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkc3VtICE9IGRrbm93bl9zdW0gJiYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICAgICAgICAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgfQorICAgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfSAKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsCisgICAgICAgICAgICAgICAgIGRkaWZmKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIAorICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmIChrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAvPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHByb2R1Y3QgIT0gMSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAxXG4iLAorICAgICAgICAgICAgICAgICBwcm9kdWN0KTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorICAgIAorICAgIGRpdiA9IDUuMEUrNTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRpdiAvPSBpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWJzKGRpdi0wLjEzNzc4NykgPj0gMS4wRS00ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgICB9CisKKyAgICB4ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IExPT1BDT1VOVCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gKytcbiIpOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gLS1cbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDE7CisgICAgfQorICAgIGJpdF9hbmQgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICghYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9hbmQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAwOworICAgIH0KKyAgICBiaXRfb3IgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCFiaXRfb3IpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChleGNsdXNpdl9iaXRfb3IpIAorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIHggPSAxOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICB4IDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIHggIT0gMTAyNCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPDxcbiIpOworICAgICAgICB4ID0gMTAyNDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IDEpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluID4+XG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBiYXJyaWVyIGRpcmVjdGl2ZS4gVGhlIHRlc3QgY3JlYXRlcyBzZXZlcmFsIHRocmVhZHMgYW5kIHNlbmRzIG9uZSBvZiB0aGVtIHNsZWVwaW5nIGJlZm9yZSBzZXR0aW5nIGEgZmxhZy4gQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2JhcnJpZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgcmVzdWx0MSA9IDA7CisgICAgcmVzdWx0MiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgIDxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwlpZiAocmFuayA9PTEpIHsKKyAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOworICAgICAgICByZXN1bHQyID0gMzsKKwl9Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYmFycmllcjwvb21wdHM6Y2hlY2s+CisJaWYgKHJhbmsgPT0gMikgeworCSAgICByZXN1bHQxID0gcmVzdWx0MjsKKwl9CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIHByaW50ZigicmVzdWx0MT0lZFxuIixyZXN1bHQxKTsKKyAgICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2YyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtPTA7CisgICAgaW50IGtub3duX3N1bTsKKwkgIAorICAgIDxvbXB0czpvcnBoYW4+CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICBpbnQgbXlzdW09MDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICAjcHJhZ21hIG9tcCBmb3IKKwkgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBjcml0aWNhbDwvb21wdHM6Y2hlY2s+CisJICAgIHN1bSA9IG15c3VtICtzdW07CisgICAgICAgIAorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAgcHJpbnRmKCJzdW09JWRcbiIsc3VtKTsKKyAgICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZmx1c2ggZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmx1c2g8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgYmFycmllcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDE7CisJaW50IHJlc3VsdDI7CisJaW50IGR1bW15OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlyZXN1bHQxID0gMDsKKwlyZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgYmFycmllcgorCWlmIChyYW5rID09IDEpIHsKKwkgICAgcmVzdWx0MiA9IDM7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlkdW1teSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKworCWlmIChyYW5rID09IDApIHsKKwkgICAgPG9tcHRzOmNoZWNrPm15X3NsZWVwKFNMRUVQVElNRV9MT05HKTs8L29tcHRzOmNoZWNrPgorCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpPC9vbXB0czpjaGVjaz4KKwkJcmVzdWx0MSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGNvbGxhcHNlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIHN0YXRpYyBpbnQgbGFzdF9pOworICAgIGludCBpc2xhcmdlcjsKKyAgICBpZiAoaT09MSkKKyAgICAgIGxhc3RfaT0wOworICAgIGlzbGFyZ2VyID0gKChpID49IGxhc3RfaSkmJihpIC0gbGFzdF9pPD0xKSk7CisgICAgbGFzdF9pID0gaTsKKyAgICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgaW50IGksajsKKwkgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShpLGopIHNjaGVkdWxlKHN0YXRpYywxKSA8b21wdHM6Y2hlY2s+Y29sbGFwc2UoMik8L29tcHRzOmNoZWNrPiBvcmRlcmVkCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKyl7CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpJiYgbXlfaXNsYXJnZXI7PC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIGZvciAoaiA9MTsgaiA8MTAwOyBqKyspCisgICAgICAgICAgeworICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQkgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorCQkgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJm15X2lzbGFyZ2VyOworICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgZmlyc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgZmlyc3Rwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGVuZCBhbGwgZmlyc3Rwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA4MGEyCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsb21wIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCSAgICBpbnQgaTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWkwID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCSAgICBzdW0wID0gMDsKKwkgICAgewkvKiBCZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworCSAgICA8b21wdHM6b3JwaGFuPgorCQlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQkvKiBlbmQgb2YgZm9yICovCisJICAgIDwvb21wdHM6b3JwaGFuPgorCSAgICB9CS8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgICB7CisJCXN1bSA9IHN1bSArIHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJZnByaW50Zihsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsa25vd25fc3VtLHN1bSk7CisJZnByaW50Zihsb2dGaWxlLCIgTE9PUENPVU5UID0gJWQgLCBpMCA9ICVkIFxuIixMT09QQ09VTlQsaTApOworCXJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VjNDBiCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw1NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjEuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCWludCBteWFycmF5W0xPT1BDT1VOVF07CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJCWludCByYW5rOworCQlpbnQgaTsKKworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+bm93YWl0PC9vbXB0czpjaGVjaz4gCisJCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMCkgeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZW50ZXJpbmcgZm9yIGxvb3AgYW5kIGdvaW5nIHRvIHNsZWVwLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW5kIHNldCBjb3VudCA9IDEuXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorCQkKKwkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGl0ZWQgZmlyc3QgZm9yIGxvb3AgYW5kIGVudGVycyB0aGUgc2Vjb25kLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmb3IKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSAKKwkJeworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQlyZXN1bHQgPSAxOworCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgb3JkZXJlZCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYW4gdmFyaWFibGUgaW4gYW4gcGFyYWxsZWxpemVkIGxvb3AgYW5kIHdhdGNoaW5nIGVhY2ggaXRlcmF0aW9uIGlmIHRoZSBzdW1hbmQgaXMgbGFyZ2VyIGFzIHRoZSBsYXN0IG9uZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIGludCBpc2xhcmdlcjsKKyAgICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGxhc3RfaSA9IDA7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisJICAgIGludCBteV9pc2xhcmdlciA9IDE7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBvcmRlcmVkPC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpICYmIG15X2lzbGFyZ2VyOworCQkgICAgc3VtID0gc3VtICsgaTsKKwkJfQkvKiBlbmQgb2Ygb3JkZXJlZCAqLworCSAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCSAgICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY1MTEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgcHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiB0aGlzIHRocmVhZCB3YWl0cyBzb21lIHRpbWUgYmVmb3JlIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgcHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiAoMSkgaXMgYXNzaWduZWQgdG8gKDIpLiBBdCB0aGUgZW5kIGFsbCBwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICgpeworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisJc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICAgIH0KK30KKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bSA9IDA7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtMCA9IDA7CS8qIHNldHRpbmcgKGdsb2JhbCkgc3VtMCA9IDAgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJc3VtMSA9IDA7CS8qIHNldHRpbmcgc3VtMSBpbiBlYWNoIHRocmVhZCB0byAwICovCisKKwl7CS8qIGJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQlzdW0wID0gc3VtMTsKKyNwcmFnbWEgb21wIGZsdXNoCisJCXN1bTAgPSBzdW0wICsgaTsKKwkJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMSA9IHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorCX0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyplbmQgb2YgY3JpdGljYWwqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMTkxNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNDI5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBkdDsKKwlpbnQgc3VtOworCWludCBkaWZmOworCWludCBwcm9kdWN0ID0gMTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZGRpZmY7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCAqbG9naWNzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCisgICAgaW50IGk7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsJLyogb3ZlciBhbGwgcm91bmRpbmcgZXJyb3IgdG8gYmUgaWdub3JlZCBpbiB0aGUgZG91YmxlIHRlc3RzICovCisgICAgZG91YmxlIGRwdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKworICAgIC8qIFZhcmlhYmxlcyBmb3IgaW50ZWdlciB0ZXN0cyAqLworICAgIHN1bSA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgICAgZHQgPSAxLiAvIDMuOwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgZHN1bSA9IDAuOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGxvZ2ljICB0ZXN0cyAqLworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNfb3IgPSAwOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGJpdCBvcGVyYXRvcnMgdGVzdHMgKi8KKyAgICBiaXRfYW5kID0gMTsKKyAgICBiaXRfb3IgPSAwOworICAgIC8qIFZhcmlhYmxlcyBmb3IgZXhjbHVzaXYgYml0IG9yICovCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgaW50ZWdlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIGFkZGl0aW9uICoqKiovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJc3VtID0gc3VtICsgajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7IAorICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworCisgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKQorCSAgICB7CisJCWRpZmYgPSBkaWZmIC0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkaWZmICE9IDApIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgbXVsdGlwbGljYXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKQorCSAgICB7CisJCXByb2R1Y3QgKj0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGRvdWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIGFkZGl0aW9uICoqKiovCisKKyAgICBkc3VtID0gMC47CisgICAgZHB0ID0gMS47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgIHsKKwlkcHQgKj0gZHQ7CisgICAgfQorICAgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykKKwkgICAgewkKKwkJZHN1bSArPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOyAKKwlmcHJpbnRmIChsb2dGaWxlLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgICAgfQorCisjaWYgMAorICAgIGRwdCA9IDEuOworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisjZW5kaWYKKworCisvKioqKiBUZXN0aW5nIGRvdWJsZSBzdWJ0cmFjdGlvbiAqKioqLworCisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisJICAgIHsKKwkJZGRpZmYgLT0gcG93IChkdCwgaik7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsIGRkaWZmKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGxvZ2ljYWwgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBsb2dpY19hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKGxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcikgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKCFsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBiaXQgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCkgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICAvKmZwcmludGYgKCJcblJlc3VsdDolZFxuIiwgcmVzdWx0KTsqLworICAgIHJldHVybiAocmVzdWx0ID09IDApOworCisgICAgZnJlZSAobG9naWNzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3Igc2NoZWR1bGUgYXV0bzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGF1dG88L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2F1dG88L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZGE1NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpAQCAtMCwwICsxLDExMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkeW5hbWljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKy8qCisqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyogTWV0aG9kOiBjYWN1bGF0ZSBob3cgbWFueSB0aW1lcyB0aGUgaXRlcmF0aW9uIHNwYWNlIGlzIGRpc3BhdGNoZWQKKyogICAgICAgICBhbmQganVkZ2UgaWYgZWFjaCBkaXNwYXRjaCBoYXMgdGhlIHJlcXVlc3RlZCBjaHVuayBzaXplCisqICAgICAgICAgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IG9uZS4KKyogSXQgaXMgcG9zc2libGUgZm9yIHR3byBhZGphY2VudCBjaHVua3MgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHRocmVhZAorKiBNb2RpZnlpZWQgYnkgQ2h1bmh1YSBMaWFvCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZETUFYX1NJWkUgMTAwCitjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDc7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aWQ7Cis8b21wdHM6b3JwaGFuOnZhcnM+ICAKKyAgaW50ICp0aWRzOworICBpbnQgaTsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgaW50IHRpZHNBcnJheVtDRkRNQVhfU0laRV07CisgIGludCBjb3VudCA9IDA7CisgIGludCB0bXBfY291bnQgPSAwOyAvKmRpc3BhdGNoIHRpbWVzKi8KKyAgaW50ICp0bXA7ICAvKnN0b3JlIGNodW5rIHNpemUgZm9yIGVhY2ggZGlzcGF0Y2gqLworICBpbnQgcmVzdWx0ID0gMDsKKyAgCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgewkJCQkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgaW50IHRpZDsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspCisgICAgICB7CisJdGlkc1tpXSA9IHRpZDsKKyAgICAgIH0KKyAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0JCQkJLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIGNvdW50Kys7CisJfQorICAgIH0KKworICB0bXAgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKGNvdW50ICsgMSkpOworICB0bXBbMF0gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkKKyAgICB7CisgICAgICBpZiAodG1wX2NvdW50ID4gY291bnQpCisJeworCSAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gc21hbGwhISFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIHRtcF9jb3VudCsrOworCSAgdG1wW3RtcF9jb3VudF0gPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0bXBbdG1wX2NvdW50XSsrOworCX0KKyAgICB9CisvKgorcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgKytpKQorCXByaW50ZigiJWQgIix0aWRzW2ldKTsKK3ByaW50ZigiZGVidWctLS0tXG4iKTsKKyovCisvKiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgCisvKml0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkKi8KKwl7CisgICAgICAgICByZXN1bHQrKzsKKyAgZnByaW50Zihsb2dGaWxlLCJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKwkgIC8qcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsqLworCX0KKyAgICB9CisgIGlmICgodG1wW2NvdW50XSVjaHVua19zaXplKSE9KENGRE1BWF9TSVpFJWNodW5rX3NpemUpKQorICAgeyAKKyAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgIH0KKyAgLyogZm9yIChpbnQgaT0wO2k8Y291bnQrMTsrK2kpIHByaW50ZigiJWRcdDo9XHQlZFxuIixpKzEsdG1wW2ldKTsgKi8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1NjRhNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCkBAIC0wLDAgKzEsMjI1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGd1aWRlZCBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGZvciBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAxNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgIDAuMDA1CisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwMQorI2VuZGlmCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50ICogdGlkczsKKwlpbnQgKiBjaHVua3NpemVzOworCWludCBub3RvdXQ7CisJaW50IG1heGl0ZXI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCB0aHJlYWRzOworICAgIGludCBpOworICAgIGludCByZXN1bHQ7CisKKyAgICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKwltYXhpdGVyID0gMDsKKyAgICByZXN1bHQgPSAxOworICAgIG5vdG91dCA9IDE7CisKKy8qIFRlc3RpbmcgaWYgZW5vdWdodCB0aHJlYWRzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hlY2suICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgeworCQl0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKwkgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKwlpZiAodGhyZWFkcyA8IDIpIHsKKwkgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMgLlxuIik7CisJICBmcHJpbnRmIChsb2dGaWxlLCAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcy4gQXZhaWxhYmxlIHdlcmUgb25seSAlZCB0aHJlYWQocykuXG4iLCB0aHJlYWRzKTsKKwkgIHJldHVybiAoMCk7CisJfSAvKiBlbmQgaWYgKi8KKworCisgICAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6ICAKKyAgICAgKgorCSAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAgICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCQorCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisjaWZkZWYgVkVSQk9TRQorCSAgcHJpbnRmKCIuIik7CisjZW5kaWYKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXsKKwkgIGludCBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisJICBpbnQgZ2xvYmFsX2NodW5rbnIgPSAwOworCSAgaW50IGxvY2FsX2NodW5rbnJbTlVNQkVSX09GX1RIUkVBRFNdOworCSAgaW50IG9wZW53b3JrID0gQ0ZTTUFYX1NJWkU7CisJICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIGRvdWJsZSBjID0gMTsKKworCSAgZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9USFJFQURTOyBpKyspCisJCWxvY2FsX2NodW5rbnJbaV0gPSAwOworCisJICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgICAvKgorCSAgICogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZ2xvYmFsIGNodW5rcworCSAgICovCisJICAvKmZwcmludGYobG9nRmlsZSwiIyBnbG9iYWxfY2h1bmtuciB0aHJlYWQgbG9jYWxfY2h1bmtuciBjaHVua3NpemVcbiIpOyAqLworCSAgZm9yKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCWlmIChsYXN0X3RocmVhZG5yPT10aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UKKwkJeworCQkgIC8qIGZwcmludGYgKGxvZ0ZpbGUsICIlZFx0JWRcdCVkXHQlZFxuIiwgZ2xvYmFsX2NodW5rbnIsbGFzdF90aHJlYWRuciwgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSwgbSk7ICovCisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisJICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworCSAgY2h1bmtzaXplcyA9IChpbnQqKW1hbGxvYyhnbG9iYWxfY2h1bmtuciAqIHNpemVvZihpbnQpKTsKKworICAgICAgLyoKKwkgICAqIEV2YWx1YXRlIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcworCSAgICovCisJICBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsJICAgIAorCSAgZm9yIChpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKQorCSAgeworCQkvKiBJZiB0aGUgdGhyZWFkbnVtYmVyIHdhcyB0aGUgc2FtZSBhcyBiZWZvcmUgaW5jcmVhc2UgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBmb3IgdGhpcyBjaHVuaworCQkgKiBvdGhlcndpc2Ugc2V0IHRoZSBkZXRlY3RlZCBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQgdGhyZWFkIGluIGxhc3RfdGhyZWFkbnIuIAorCQkgKi8KKwkJaWYgKGxhc3RfdGhyZWFkbnIgPT0gdGlkc1tpXSkgeyAKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKwkJfQorCQllbHNlIHsKKwkJICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworCQkgIGdsb2JhbF9jaHVua25yKys7CisJCSAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworCQkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworCQkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkJfQorCSAgfQorCisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgImZvdW5kXHRleHBlY3RlZFx0Y29uc3RhbnRcbiIpOworI2VuZGlmCisKKwkgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwgZGVjcmVhc2Ugb2YgdGhlIGNodW5rc2l6ZSAqLworCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKwkgIGMgPSAoZG91YmxlKSBjaHVua3NpemVzWzBdIC8gZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIAorCSAgZm9yIChpID0gMDsgaSA8IGdsb2JhbF9jaHVua25yOyBpKyspCisJICB7CisJCS8qIGNhbGN1bGF0ZSB0aGUgbmV3IGV4cGVjdGVkIGNodW5rc2l6ZSAqLworCQlpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpIAorCQkgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworCQkKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKGxvZ0ZpbGUsICIlOGRcdCU4ZFx0JWxmXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplLCBjICogY2h1bmtzaXplc1tpXS9leHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCQkKKwkJLyogY2hlY2sgaWYgY2h1bmtzaXplIGlzIGluc2lkZSB0aGUgcm91bmRpbmcgZXJyb3JzICovCisJCWlmIChhYnMgKGNodW5rc2l6ZXNbaV0gLSBleHBlY3RlZF9jaHVua19zaXplKSA+PSAyKSB7CisJCSAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCB2YWx1ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSwgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisJCSAgcmV0dXJuIDA7CisjZW5kaWYKKwkJfSAvKiBlbmQgaWYgKi8KKworI2lmbmRlZiBWRVJCT1NFCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDAgKQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisJCS8qIGNhbGN1bGF0aW5nIHRoZSByZW1haW5pbmcgYW1vdW50IG9mIHdvcmsgKi8KKwkJb3BlbndvcmsgLT0gY2h1bmtzaXplc1tpXTsKKwkgIH0JCisJfQorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE2NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKQEAgLTAsMCArMSwyMTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUgY29uc2lkZXJpbmcgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY2h1bmsgZGlzdHJpYnV0aW9uIG9mIHNldmVyYWwgbG9vcCByZWdpb25zIGlzIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbiBNUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgKiB0aWRzMjsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlIHNhbWUgCisgICAqIGxvZ2ljYWwgYXNzaWduZW1lbnQgb2YgY2h1bmtzIHRvIHRocmVhZHMuCisgICAqIFdlIHVzZSB0aGUgbm93YWl0IGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICB7CisgICAgICAgICAgaW50IG47CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmNoZWNrPiBub3dhaXQKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgdGlkc1tuXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICB0aWRzMlttLTFdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzMltpXSkgeworICAgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCBsYXRlciB0byB0aHJlYWQgJWQuXG4iLCBpLCB0aWRzW2ldLHRpZHMyW2ldKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgIHRocmVhZHMgKi8KKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzX2xpYjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBudGhyZWFkcyA9IDA7CisKKyAgICBudGhyZWFkc19saWIgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIG50aHJlYWRzKys7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorCXsgCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+bnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWZwcmludGYgKGxvZ0ZpbGUsICJDb3VudGVkICVkIHRocmVhZHMuIGdldF9udW1fdGhyZWFkcyByZXR1cm5lZCAlZC5cbiIsIG50aHJlYWRzLCBudGhyZWFkc19saWIpOworICAgIHJldHVybiAobnRocmVhZHMgPT0gbnRocmVhZHNfbGliKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSB0aWNrOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgdGljayA9IC0xLjsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnRpY2sgPSBvbXBfZ2V0X3d0aWNrICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgZnByaW50ZiAobG9nRmlsZSwgIldvcmsgdG9vayAlbGYgc2VjLiB0aW1lLlxuIiwgdGljayk7CisgICAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aW1lIGZ1bmN0aW9uLiBJdCBjb21wYXJlcyB0aGUgdGltZSB3aXRoIHdoaWNoIGlzIGNhbGxlZCBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggdGhlIHRpbWUgaXQgdG9vayBieSBtZXNzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FsbCBvZiB0aGUgc2xlZXAgZnVuY3Rpb24gYW5kIGl0cyBlbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpbWU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpbWU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBzdGFydDsKKwlkb3VibGUgZW5kOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgICAgaW50IHdhaXRfdGltZSA9IDE7IAorCisgICAgc3RhcnQgPSAwOworICAgIGVuZCA9IDA7CisKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5zdGFydCA9IG9tcF9nZXRfd3RpbWUgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKwlteV9zbGVlcCAod2FpdF90aW1lKTsgCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+ZW5kID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgICAgZnByaW50Zihsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCBtZWFzdXJlZF90aW1lKTsKKyAgICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45OSAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAxICogd2FpdF90aW1lKSkgOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWI2MTExCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogQ2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCisgKiBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc2VyaWFsOworCWludCBpc3BhcmFsbGVsOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzZXJpYWwgPSAxOworICAgIGlzcGFyYWxsZWwgPSAwOworCisgICAgPG9tcHRzOmNoZWNrPgorCTxvbXB0czpvcnBoYW4+CisJICAgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwk8L29tcHRzOm9ycGhhbj4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCWlzcGFyYWxsZWwgPSBvbXBfaW5fcGFyYWxsZWwgKCk7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CisgICAgPC9vbXB0czpjaGVjaz4KKworICAgIDxvbXB0czpjcm9zc2NoZWNrPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwkgICAgeworCisJICAgIH0KKwl9CisgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorCisJcmV0dXJuICghKHNlcmlhbCkgJiYgaXNwYXJhbGxlbCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisgICAgCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisgIG9tcF9pbml0X2xvY2sgKCZsY2spOworICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCW5yX2l0ZXJhdGlvbnMrKzsKKwlucl90aHJlYWRzX2luX3NpbmdsZS0tOworCXJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jaygmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorICAgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2sgKCZsY2spOworICAKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyZjFlCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpAQCAtMCwwICsxLDM3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG50aHJlYWRzID0gMDsKKyAgICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBtYXN0ZXIgPC9vbXB0czpjaGVjaz4KKwkgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgbnRocmVhZHMrKzsKKwkJfQorCQlleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisJICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICAgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uIEl0IGFsc28gY2hlY2tzIHRoYXQgdGhlIG1hc3RlciB0aHJlYWQgaGFzIHRoZSB0aHJlYWQgbnVtYmVyIDAgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgICAgIGludCB0aWRfcmVzdWx0ID0gMDsgLyogY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIHRocmVhZC4gKE11c3QgYmUgMCkgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisgICAgICAgICAgICAgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgICAgIGlmICh0aWQgIT0gMCkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGUzODkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9uZXN0X2xvY2sgYW5kIHRoZSBvbXBfdW5zZXRfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTdiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX25lc3RlZCBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGVzdCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmVzdGVkIHBhcmFsbGVsaXNtCisgKiBCeSBDaHVuaHVhIExpYW8sIFVuaXZlcnNpdHkgb2YgSG91c3RvbgorICogT2N0LiAyMDA1CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNpZmRlZiBfT1BFTk1QCisgICAgPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdGVkKDEpOzwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+b21wX3NldF9uZXN0ZWQoMCk7PC9vbXB0czpjcm9zc2NoZWNrPgorI2VuZGlmCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChjb3VudGVyKQoreworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlciArKzsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgY291bnRlciAtLTsKKyAgICB9Cis8L29tcHRzOm9ycGhhbj4KK30KKyAgICByZXR1cm4gKGNvdW50ZXIgIT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgY29weWluIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGNvcHlpbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2NvcHlpbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xID0gNzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5jb3B5aW4oc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODczNzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGRlZmF1bHQgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkZWZhdWx0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2RlZmF1bHQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQgbXlzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgPG9tcHRzOm9ycGhhbj4KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmRlZmF1bHQoc2hhcmVkKTwvb21wdHM6Y2hlY2s+IHByaXZhdGUoaSkgcHJpdmF0ZShteXN1bTxvbXB0czpjcm9zc2NoZWNrPixzdW08L29tcHRzOmNyb3NzY2hlY2s+KQorICB7CisJbXlzdW0gPSAwOworICAjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICA8L29tcHRzOm9ycGhhbj4KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI0YwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xPTc7CisgICAgbnVtX3RocmVhZHMgPSAwOworCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworCisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I0OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW0gOworICAgIGludCBpMjsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bT0wOworICAgIGkyPTM7CisgICAgaW50IGtub3duX3N1bTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyICsgaTIgKiBMT09QQ09VTlQ7CisgICAgCisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ODZiYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz48L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgaW50IGtub3duX3N1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG51bV90aHJlYWRzOworICAgIGludCBzdW0sIHN1bTI7CisgICAgaW50IGk7CisgICAgaW50IGNvbnRyb2w7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb250cm9sID0gMDsKKyAgICBudW1fdGhyZWFkcz0wOworICAgIHN1bSA9IDA7CisgICAgc3VtMiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbD09MSk8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwlzdW0gPSBzdW0gKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZGViYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGkwID0gLTE7CisgICAgaW50IGtub3duX3N1bTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlzdW0gPSBzdW0gKyBpOworCWkwID0gaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKK2ludCBpOworCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEgCisgIFV0aWxpdHkgZnVuY3Rpb246IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGxhcmdlciB0aGFuIAorICB0aGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLgorICAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMiAoaW50IGkpeworCWludCBpc2xhcmdlcjsKKwlpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKwlsYXN0X2kgPSBpOworCXJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXI7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWludCBrbm93bl9zdW07CisJaW50IGk7CisJCisJc3VtID0gMDsKKwlpc19sYXJnZXIgPSAxOworCWxhc3RfaSA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPm9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCWZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykKKwl7CisJCWlpID0gaTsKKwk8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworCQkJaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisJCQlzdW0gID0gc3VtICsgaWk7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJa25vd25fc3VtID0gKDk5ICogMTAwKSAvIDI7CisJZnByaW50ZiAobG9nRmlsZSwiIGtub3duX3N1bSA9ICVkICwgc3VtID0gJWQgXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJZnByaW50ZiAobG9nRmlsZSwiIGlzX2xhcmdlciA9ICVkXG4iLCBpc19sYXJnZXIpOworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI4MGNjCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoaSk7CisgICAgfQorfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9MDsKKyAgICBpMj0wOworICAgIGludCBrbm93bl9zdW07CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIAorICAgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgICAgeworCWkyID0gaTsKKyNwcmFnbWEgb21wIGZsdXNoCisJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlzdW0gPSBzdW0gKyBpMjsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyODAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkJLyogZHReRE9VQkxFX0RJR0lUUyAqLworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbTE9PUENPVU5UXTsKKwlpbnQgaTsKKwlkb3VibGUgZHB0OworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHN1bSA9MDsKKyAgICBkc3VtPTA7CisJZHQgPSAxLi8zLjsKKyAgICByZXN1bHQgPSAwOworICAgIHByb2R1Y3QgPSAxOworCWxvZ2ljX2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X2FuZD0xOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworCisJa25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorCXsKKwkJc3VtPXN1bStpOworCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisJfQorCisJZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkKKwl7CisJCWRpZmY9ZGlmZi1pOworCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCS8qIFRlc3RzIGZvciBkb3VibGVzICovCisJZHN1bT0wOworCWRwdD0xOworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkc3VtICs9IHBvdyhkdCxpKTsKKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJfQorCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKQorCXsKKwkJcHJvZHVjdCAqPSBpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisJfQorCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNDViMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG15c3VtOworICBpbnQgY29udHJvbD0xOworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+aWYoY29udHJvbD09MCk8L29tcHRzOmNoZWNrPgorICB7CisJPG9tcHRzOm9ycGhhbj4KKyAgICBteXN1bSA9IDA7CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIDwvb21wdHM6b3JwaGFuPgorICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdGhlIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gd2hpY2ggd2FzIHN0YXJ0ZWQgd2l0aCBhbiBleHBsaWNpdGx5IHN0YXRlZCBudW1iZXIgb2YgdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmVsbGVsIG51bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIG1hc3RlcixvbXAgcGFyYWxsZWwgcmVkdWN0aW9uLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgZmFpbGVkOworCWludCB0aHJlYWRzOworCWludCBudGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IG1heF90aHJlYWRzID0gMDsKKworICAgIGZhaWxlZCA9IDA7CisKKyAgICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgbWFzdGVyCisJbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0KKworICAgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgICAgZm9yICh0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKQorICAgIHsKKwludGhyZWFkcyA9IDA7CisKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKSA8b21wdHM6Y2hlY2s+bnVtX3RocmVhZHModGhyZWFkcyk8L29tcHRzOmNoZWNrPgorCSAgICB7CisJCWZhaWxlZCA9IGZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzICgpKTsKKyNwcmFnbWEgb21wIGF0b21pYworCSAgICBudGhyZWFkcyArPSAxOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisJZmFpbGVkID0gZmFpbGVkICsgIShudGhyZWFkcyA9PSB0aHJlYWRzKTsKKyAgICB9CisgICAgcmV0dXJuICghZmFpbGVkKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2NjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIDxvbXB0czpjcm9zc2NoZWNrPiBzdW0xPTA7IDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwk8b21wdHM6Y2hlY2s+CisJc3VtMSA9IDc7CisJPC9vbXB0czpjaGVjaz4KKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI3OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtID0wOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0PTE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0PTA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMzODM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9NzsKKyAgc3VtMD0xMTsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICAgIH0gICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0xMSozKzc7CityZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQgaTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAgc3VtMCA9IDA7CisgIGkwID0gLTE7CisgIAorICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpLHN1bTApIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IgKGk9MTtpPDQwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOworCSAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfS8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT00MDA7aTw3MDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGZvciovCisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT03MDA7aTwxMDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisgICAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfQorICAgIH0vKiBlbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworICA8L29tcHRzOm9ycGhhbj4gCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPSA3OworICBzdW0wPTA7CisKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKDxvbXB0czpjaGVjaz5zdW0wLDwvb21wdHM6Y2hlY2s+IGkpCisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT00MDA7aTw3MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICB9ICAgICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0oOTk5KjEwMDApLzIrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlYTZhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDU2OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CQorCWRvdWJsZSBkcHQ7CisgICAgZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTU7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW0gPSA3OworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworICAgIGRwdCA9IDE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0wOworCS8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKwkvKmludCBpc19sYXJnZXI9MTsqLworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworCisgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLHN1bSwga25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0xO2k8MztpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTM7aTw3O2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NztpPDExO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1s1MDFdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI4ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHNoYXJlZCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNoYXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPSAwOworICBpbnQga25vd25fc3VtOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5zaGFyZWQoc3VtKTwvb21wdHM6Y2hlY2s+IDxvbXB0czpjcm9zc2NoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjcm9zc2NoZWNrPgorICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBpbnQgbXlzdW0gPSAwOworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCis8L29tcHRzOm9ycGhhbj4KKworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgIAlmcHJpbnRmKGxvZ0ZpbGUsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM1ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZSBieSBhZGRpbmcgYSB2YXJpYWJsZSB3aGljaCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBzdW07CisJICAgIGludCBzdW0wOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGtub3duX3N1bTsKKworCXN1bTAgPSAxMTsKKwlzdW0gPSA3OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfSAgICAgICAgICAgICAgIAorCQl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisJa25vd25fc3VtID0gMTEgKiAzICsgNzsKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDczIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpMCA9IC0xOworCWludCBzdW0gPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHN1bTAgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGkwID0gLTE7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uICAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfQorCX0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IDk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIHByaXZhdGUgZGlyZWN0aXZlIGJ5IHVwY291bnRpbmcgYSB2YXJpYWJsZSBpbiBhIHRvIHNldmVyYWwgc2VjdGlvbnMgc3BsaXR0ZWQgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBzdW0wOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDc7CisgICAgc3VtMCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgICAgICAgICAgICAgCisJfSAvKmVuZCBvZiBzZWN0aW9ucyovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYTM3NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKQEAgLTAsMCArMSw2NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzZWN0aW9ucywgb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbnNfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCisJcmVzdWx0ID0gMDsKKwljb3VudCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKwk8b21wdHM6b3JwaGFuPgorCWludCByYW5rOworCisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkKKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiBhbmQgZ2V0cyBzbGVlcGluZy5cbiIsIHJhbmspOworCQkJCW15X3NsZWVwKFNMRUVQVElNRSk7CisJCQkJY291bnQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbiBzZXQgY291bnQgdG8gMS5cbiIsIHJhbmspOworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBmaXJzdCBzZWN0aW9uLlxuIiwgcmFuayk7CisJCQl9CisJCX0KKy8qIEJlZ2luIG9mIHNlY29uZCBzZWN0aW9ucyBlbnZpcm9ubWVudCAqLworI3ByYWdtYSBvbXAgc2VjdGlvbnMKKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIHNlY29uZCBzZWN0aW9uIGFuZCBjb250cm9scyB0aGUgdmFsdWUgb2YgY291bnRcbiIsIHJhbmspOworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQlyZXN1bHQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJjb3V0IHdhcyAlZCIsIGNvdW50KTsKKwkJCX0KKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNjEzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRwdCxkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKwlpbnQgbG9naWNfYW5kOworCWludCBiaXRfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1sxMDAwXTsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisKKyAgICBzdW0gPTc7CisgICAgZHB0ID0xOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworCWxvZ2ljX2FuZD0xOworCWJpdF9hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdCA9IDA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJKytyZXN1bHQ7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisJfQorCisJZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisKKwlrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0xO2k8MztpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTM7aTw3O2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NztpPDExO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiXG5FcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyYjBkMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGRpcmVjdGl2ZSBieSBjb250cm9sbGluZyBob3cgb2Z0ZW4gYSBkaXJlY3RpdmUgaXMgY2FsbGVkIGluIGFuIG9tcCBzaW5nbGUgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisJaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgPC9vbXB0czpjaGVjaz4KKwkJeyAgCisjcHJhZ21hIG9tcCBmbHVzaAorCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCQl9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3Y2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBjb3B5cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJsbGVsLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgajsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaikKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJLyoKKwkJICAgaW50IHRocmVhZDsKKwkJICAgdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQkgKi8KKyNwcmFnbWEgb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+Y29weXByaXZhdGUoaik8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBqID0gaTsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCX0KKwkJLyoJI3ByYWdtYSBvbXAgYmFycmllciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICAvKnByaW50ZiAoInRocmVhZCA9ICVkLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsqLworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgaiAtIGk7CisJCX0KKyNwcmFnbWEgb21wIGJhcnJpZXIKKwkgICAgfSAvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15X2l0ZXJhdGlvbnM7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15X2l0ZXJhdGlvbnMpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRvdGFsX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgbXlfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBhdG9taWMgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCW15X2l0ZXJhdGlvbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHRvdGFsX2l0ZXJhdGlvbnMgKz0gbXlfaXRlcmF0aW9uczsKKwl9CisKKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSAmJiAodG90YWxfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteWl0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlpdCkKK2ludCBteXJlc3VsdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15cmVzdWx0KQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisKKyAgICBteWl0ID0gMDsKKyAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgcmVzdWx0ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlteXJlc3VsdCA9IDA7CisJbXlpdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5wcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKSA8L29tcHRzOmNoZWNrPm5vd2FpdAorCSAgICB7ICAKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlteWl0Kys7CisJCW15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovICAgIAorCTwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisgICAgICAgICAgICByZXN1bHQgKz0gbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKwl9CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUgcHJpdmF0ZSAqLyAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODk3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFzazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCB0aWRzW05VTV9UQVNLU107CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzazwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKy8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgICAgZm9yIChpID0gMTsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwMGM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpbmFsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpbmFsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBlcnJvcjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgbXlpID0gaTsKKworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+ZmluYWwoaT49MTApPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzEwXSAhPSB0aWRzW2ldKQorICAgICAgICAgICAgZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEwNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA9IDEyMzQ7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgICAgICAgICAgICB7IHJlc3VsdCsrOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YWIyZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICAgIGludCBjb3VudDsKKyAgICBpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgY291bnQ9MDsKKyAgICBjb25kaXRpb25fZmFsc2UgPSAobG9nRmlsZSA9PSBOVUxMKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+aWYgKGNvbmRpdGlvbl9mYWxzZSk8L29tcHRzOmNoZWNrPiBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRV9MT05HKTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorICAgICAgICAgICAgcmVzdWx0ID0gKDAgPT0gY291bnQpOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBjb3VudCA9IDE7CisvLyNwcmFnbWEgb21wIGZsdXNoIChjb3VudCkKKworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhmMGVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgcHJpdmF0ZSB3b3JrcyBwcm9wZXJseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaT01OworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgdGFza19yZXN1bHQgPSAxOworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgIAorICAgICAgICAKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspCisJICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgc2hhcmVkKHJlc3VsdCAsIHRhc2tfcmVzdWx0PG9tcHRzOmNyb3NzY2hlY2s+LCBpPC9vbXB0czpjcm9zc2NoZWNrPikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCQkgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3Jlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBOVU1fVEFTS1M7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBmaXJzdHByaXZhdGUgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKwkgICNwcmFnbWEgb21wIHRhc2t3YWl0CisJICByZXN1bHQgPSAodGFza19yZXN1bHQgJiYgaT09NSk7CisgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHdoaWNoIGdldHMgZGVjbGFyZWQgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBzdW0gPSAwOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJlc3VsdCwga25vd25fc3VtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCSAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKwkJICAgIDxvbXB0czpjaGVjaz5zdW0gPSAwOzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaW1wX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGk9MDsKKyAgICBpbnQgayA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjcm9zc2NoZWNrPiBmaXJzdHByaXZhdGUoaSkgPC9vbXB0czpjcm9zc2NoZWNrPiA8b21wdHM6Y2hlY2s+IHNoYXJlZChpKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBzaGFyZWQgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KKworcmVzdWx0ID0gaTsKK3JldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKKyAgICAgCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmViZTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKQEAgLTAsMCArMSw2OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgZm9yIHVudGllZCBjbGF1c2UuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayB1bnRpZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgY291bnQ7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGNvdW50ID0gMDsKKyAgCisgIC8qaW5pdGlhbGl6YXRpb24qLworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKyAgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShpKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz51bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgICAgIAorICAgICAgICAgIDxvbXB0czpjaGVjaz5pZigoc3RhcnRfdGlkW215aV0gJTIpICE9MCl7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIH0gLyogZW5kIG9mIGlmICovIAorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCisgICAgICAgIH0gLyplbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKQorICB7CisgICAgcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCkBAIC0wLDAgKzEsNzUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2t3YWl0IGRpcmVjdGl2ZS4gRmlyc3Qgd2UgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MsIHdoaWNoIHNldCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gVGhlbiB3ZSBkbyBhIHRhc2t3YWl0IGFuZCBjaGVjayBpZiBhbGwgdGFza3MgZmluaXNoZWQgbWVhbmluZyBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWUuIFRoZW4gd2UgZ2VuZXJhdGUgYSBzZWNvbmQgc2V0IHNldHRpbmcgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFub3RoZXIgdmFsdWUuIEFmdGVyIHRoZSBwYXJhbGxlbCByZWdpb24gd2UgY2hlY2sgaWYgYWxsIHRhc2tzIG9mIHRoZSBzZWNvbmQgc2V0IGZpbmlzaGVkIGFuZCB3ZXJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0YXNrcyBvZiB0aGUgZmlyc3Qgc2V0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCB0YXNrPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t3YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQgcmVzdWx0MSA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIG5vdCBmaW5pc2hlZCB0YXNrcyBhZnRlciB0aGUgdGFza3dhaXQgKi8KKyAgICBpbnQgcmVzdWx0MiA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKworICAgIGludCBhcnJheVtOVU1fVEFTS1NdOworICAgIGludCBpOworCisgICAgLyogZmlsbCBhcnJheSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgIGFycmF5W2ldID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgICAgICBteWkgPSBpOworI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrd2FpdDwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgCisgICAgICAgICAgICAgKiB0aGUgdmFsdWVzIGluIHRoZSB0aWRzIGFycmF5ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisKKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgICAgICAgcmVzdWx0MisrOworICAgIH0KKworICAgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTI3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHRhc2t5aWVsZCBkaXJlY3RpdmUuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3lpZWxkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNreWllbGQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2sgdW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICAKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLGksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorCis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0bG9jayBmdW5jdGlvbi4gVGhlIHRlc3QgY291bnRzIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aGljaCBpcyBidWlsZCB3aXRoIGEgdGVzdF9sb2NrIGluIGFuIGVuZGxlc3MgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz53aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorCQl7fTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkNmE0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitzdGF0aWMgb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIAorICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgCisgICAgeworCisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPndoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorCSAgICB7fTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMgYi9yYzEvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw5NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUgYnkgZmlsbGluZyBhbiBhcnJheSB3aXRoIHJhbmRvbSBudW1iZXJzIGluIGFuIHBhcmFsbGVsaXNlZCByZWdpb24uIEVhY2ggdGhyZWFkIGdlbmVyYXRlcyBvbmUgbnVtYmVyIG9mIHRoZSBhcnJheSBhbmQgc2F2ZXMgdGhpcyBpbiBhIHRlbXBvcmFyeSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlLiBJbiBhIHNlY29uZCBwYXJhbGxlbGlzZWQgcmVnaW9uIHRoZSB0ZXN0IGNvbnRyb2xzLCB0aGF0IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgY29udGFpbnMgc3RpbGwgdGhlIGZvcm1lciB2YWx1ZSBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgb25lIGluIHRoZSBhcnJheS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wX3NldF9keW5hbWljLG9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogICAgbG9jYWwgY29weSBmb3IgZWFjaCB0aHJlYWQuIE90aGVyd2lzZSByYWNlIGNvbmRpdGlvbiBhbmQgCisgKiAgICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogICAgcGFyYWxsZWwgcmVnaW9ucworICovCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgc3VtMD0wOworc3RhdGljIGludCBteXZhbHVlID0gMDsKKworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSk8L29tcHRzOmNoZWNrPgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJaW50IGk7IAorCWludCBpdGVyOworCWludCAqZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgZmFpbGVkID0gMDsKKwlpbnQgbXlfcmFuZG9tOworCW9tcF9zZXRfZHluYW1pYygwKTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCSAgc3VtMCA9IDA7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgICBzdW0gPSBzdW0gKyBzdW0wOworCSAgfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwkvKiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gaXMganVzdCB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMqLworCW9tcF9zZXRfZHluYW1pYygwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyAgICAgICNwcmFnbWEgb21wIG1hc3RlcgorCSAgeworCQkJc2l6ZT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisJCQlkYXRhPShpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7CisJICB9CisJfS8qIGVuZCBwYXJhbGxlbCovCisKKworCXNyYW5kKDQ1KTsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspeworCQlteV9yYW5kb20gPSByYW5kKCk7CS8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGNhbGxlZCBpbnNpZGUgc2VyaWFsIHJlZ2lvbiovCisKKwkvKiB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl5ZSBteXZhbHVlIGFuZCB0aGUgYXJyYXkgd2l0aCBteV9yYW5kb20rcmFuayovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIGludCByYW5rOworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQlteXZhbHVlID0gZGF0YVtyYW5rXSA9IG15X3JhbmRvbSArIHJhbms7CisJfQorCisJLyogdGhlIHNlY29uZCBwYXJhbGxlbCByZWdpb24gdmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2YgIm15dmFsdWUiIGlzIHJldGFpbmVkICovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKQorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCWZhaWxlZCA9IGZhaWxlZCArIChteXZhbHVlICE9IGRhdGFbcmFua10pOworCQlpZihteXZhbHVlICE9IGRhdGFbcmFua10peworCQkgIGZwcmludGYgKGxvZ0ZpbGUsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisJCX0KKwl9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFmYWlsZWQ7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYyBiL3JjMS90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQzNTlkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgY2FuIGJlIHVzZWQgYXMgYSBsb29waW5kZXguPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSk8L29tcHRzOmNoZWNrPgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZV9mb3I8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJCWludCBrbm93bl9zdW07CisJCWludCBzdW07CisJCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwkJc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJCWludCBzdW0wID0gMDsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCQlzdW0wID0gc3VtMCArIGk7CisJCX0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJCXN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKwkKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZiBiL3JjMS90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCkBAIC0wLDAgKzEsNTcgQEAKKyAgICAgIHN1YnJvdXRpbmUgcHJpbnRfcmVzdWx0KHMsY3Jvc3NmYWlsZWQsTSxuYW1lKSAgICAgCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorCSAgIHJlYWwgY2VydAorCSAgIGludGVnZXIgTSxjcm9zc2ZhaWxlZAorCSAgIGludGVnZXIgcworCSAgIGNoYXJhY3RlciAobGVuPTExKSA6OiBjCisgCSAgIGNoYXJhY3RlciAobGVuPTE4KSA6OiBjMgorCSAgIGNlcnQ9MTAwLjAqY3Jvc3NmYWlsZWQvTQorISAgICAgICAgICAgcHJpbnQgKiwgImNlcnQiLCBjZXJ0LCAiY3Jvc3MgIiwgY3Jvc3NmYWlsZWQKKyEJdGVzdDE9aHVuZHJlZCpjcm9zc2ZhaWxlZAorCSAgIGM9IiUgY2VydGFpbnR5IgorCSAgIGMyPSIgLi4uIHZlcmlmaWVkIHdpdGggIgorICAgICAgaWYocy5lcS4xKSB0aGVuCisgICAgICAgICB3cml0ZSAoKiwiKEEsIEEsIEY3LjIsIEEpIikgbmFtZSwgYzIsIGNlcnQsIGMKKyAgICAgIGVsc2UKKyAgICAgICAgIHdyaXRlICgqLCIoQSxBKSIpIG5hbWUsIiAuLi4gRkFJTEVEIgorICAgICAgZW5kaWYKKwkgICBlbmQKKworICAgICAgc3Vicm91dGluZSBkb190ZXN0KHRlc3RfZnVuYyxjcm9zc190ZXN0X2Z1bmMsbmFtZSxOLGZhaWxlZCwKKyAgICAgeCAgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCkKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgc3VjY2VlZAorICAgICAgaW50ZWdlciBjcm9zc2ZhaWwKKyAgICAgIGludGVnZXIgZmFpbGVkCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6dGVzdF9mdW5jCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6Y3Jvc3NfdGVzdF9mdW5jCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorICAgICAgaW50ZWdlciBmYWlsCisgICAgICBpbnRlZ2VyIE4saQorICAgICAgaW50ZWdlciBudW1fdGVzdHMsY3Jvc3NjaGVja2VkCisgICAgICBudW1fdGVzdHM9bnVtX3Rlc3RzKzEKKyAgICAgIHN1Y2NlZWQ9MQorICAgICAgY3Jvc3NmYWlsPTAKKyAgICAgIGZhaWw9MAorICAgICAgZG8gaT0xLE4KKyAgICAgICAgIGlmKHRlc3RfZnVuYygpLmVxLjApIHRoZW4KKyAgICAgICAgICAgIHN1Y2NlZWQ9MAorICAgICAgICAgICAgZmFpbD1mYWlsKzEKKyAgICAgICAgICAgIGV4aXQKKyAgICAgICAgIGVuZCBpZgorICAgICAgICAgaWYoY3Jvc3NfdGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorISAgICAgICAgICAgIHByaW50ICosIGNyb3NzZmFpbAorICAgICAgICAgICAgY3Jvc3NmYWlsPWNyb3NzZmFpbCsxLjAgCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGRvCisgICAgICAKKyAgICAgIGlmIChmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgZmFpbGVkPWZhaWxlZCsxCisgICAgICBlbHNlCisgICAgICAgICBpZihjcm9zc2ZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICAgICBjcm9zc2NoZWNrZWQ9Y3Jvc3NjaGVja2VkKzEKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kaWYKKyAgICAgIGNhbGwgcHJpbnRfcmVzdWx0KHN1Y2NlZWQsY3Jvc3NmYWlsLE4sbmFtZSkKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9jdXN0b210ZXN0LnR4dCBiL3JjMS90ZXN0c3VpdGUvY3VzdG9tdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkMDVhZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvY3VzdG9tdGVzdC50eHQKQEAgLTAsMCArMSwyIEBACisjIEFkZCBjdXN0b20gdGVzdHMgaW4gdGhpcyBsaXN0CitvbXBfcGFyYWxsZWxfY29weWluCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMV9URVNUIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDJfVEVTVCBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0NzY2NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxNzI1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGRvIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyKGkpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgSU5URUdFUiA6OiBpCisgICAgICAgIElOVEVHRVIsIHNhdmUgOjogbGFzdF9pCisgICAgICAgIExPR0lDQUwgOjogaXNfbGFyZ2VyCisKKyAgICAgICAgaWYgKGkgLmVxLiAxKSBsYXN0X2kgPSAwCisKKyAgICAgICAgaXNfbGFyZ2VyID0gKGkgLmdlLiBsYXN0X2kpIC5hbmQuICgoaS1sYXN0X2kpIC5sZS4gMSkKKyAgICAgICAgbGFzdF9pID0gaQorCisgICAgICAgIGNoZWNrX2lzX2xhcmdlciA9IGlzX2xhcmdlcgorCisgICAgICBFTkQgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBqCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIExPR0lDQUwgY2hlY2tfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgbXlfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgaXNfbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgaXNfbGFyZ2VyID0gLnRydWUuCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNfbGFyZ2VyKQorPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlfaXNfbGFyZ2VyID0gLnRydWUuCishJG9tcCBkbyBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+CishJG9tcCsgICBvcmRlcmVkCisgICAgICAgIERPIGk9MSwxMDAKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBteV9pc19sYXJnZXIgPSBjaGVja19pc19sYXJnZXIoaSkgLmFuZC4gbXlfaXNfbGFyZ2VyCisgICAgICAgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIERPIGo9MSwwMAorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKyAgICAgICAgICAgIG15X2lzX2xhcmdlciA9IGNoZWNrX2lzX2xhcmdlcihpKSAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBvcmRlcmVkCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIGlzX2xhcmdlciA9IGlzX2xhcmdlciAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBjcml0aWNhbAorPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgaWYgKGlzX2xhcmdlcikgdGhlbgorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgZWxzZQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgZW5kIGlmCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MjM2MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGRvIGZpcnN0cHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBlbmQgYWxsIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgbnVtdGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgIAorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAxMjM0NQorICAgICAgICBzdW0xID0gMAorICAKKyAgCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyEkb21wIHNpbmdsZQorICAgICAgICBudW10aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCisKKworPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUgKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIFdSSVRFICgxLCopIHN1bTAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKworCisgICAgICAgIGtub3duX3N1bT0xMjM0NSpudW10aHJlYWRzKyAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJGb3VuZCBzdW0gd2FzIiwgc3VtLCAiaW5zdGVhZCBvZiIsIGtub3duX3N1bQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAyZTUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsaTAsaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLGkwLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBkbzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX29yZGVyZWQuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4N2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKQEAgLTAsMCArMSw3MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGlyZWN0aXZlPmRvIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXJhbGxlbCBwcml2YXRlLCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIGlfaXNsYXJnZXIoaSkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIGlzbGFyZ2VyCisgICAgICAgIElOVEVHRVIgbGFzdF9pCisgICAgICAgIENPTU1PTiAvbXljb20vIGxhc3RfaQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kpIFRIRU4KKyAgICAgICAgICBpc2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzbGFyZ2VyID0gMAorICAgICAgICBFTkQgSWYKKyAgICAgICAgbGFzdF9pID0gaQorICAgICAgICBpX2lzbGFyZ2VyID0gaXNsYXJnZXIKKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0sIGlzX2xhcmdlcgorICAgICAgICBJTlRFR0VSIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGlfaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9teWNvbS8gbGFzdF9pCisKKzxvbXB0czpvcnBoYW46cGFybXM+IGkgPC9vbXB0czpvcnBoYW46cGFybXM+CisKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sIGksIG15X2lzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X2lzbGFyZ2VyLCBzdW0KKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIGxhc3RfaSA9IDAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNsYXJnZXIpCisgICAgICAgIG15X2lzbGFyZ2VyID0gMQorISRvbXAgZG8gc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgSUYgKGlfaXNsYXJnZXIoaSkgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSkgVEhFTgorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgc3VtID0gc3VtICsgaQorPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIElGIChpc19sYXJnZXIgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc19sYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKDk5KjEwMCkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3ByaXZhdGUuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ODdjZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSwgb21wIGZsdXNoLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmsoKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtPTAuMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVC0xCisgICAgICAgICAgc3VtID0gc3VtICsgc3FydChSRUFMKGkpKQorICAgICAgICBFTkRETworCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+ICAgICAgICAKKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgc3VtICA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgc3VtMSA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICAgICAgICBzdW0wID0gMAorICAgICAgICBzdW0xID0gMAorCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBDQUxMIGRvX3NvbWVfd29yaygpCishJG9tcCBmbHVzaAorISAgICAgICAgICBwcmludCAqLCBzdW0wCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorISAgICAgICAgcHJpbnQgKiwgInN1bToiLCBzdW0sICJrbm93bl9zdW0iLCBrbm93bl9zdW0KKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyNWE0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDUxNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgUEFSQU1FVEVSIChrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLGRpZmYscHJvZHVjdCxpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxkZGlmZixkdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0scHJvZHVjdCxkaWZmLGksZHN1bSxkZGlmZixkdCxsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGJpdF9hbmQsYml0X29yLGludF9hcnJheSwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLmdlLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOmRtYXgpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9keW5hbWljLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjhiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCkBAIC0wLDAgKzEsOTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZHluYW1pYyBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb3VudCwgdG1wX2NvdW50CisgICAgICAgIElOVEVHRVIsQUxMT0NBVEFCTEU6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgQ0ZETUFYX1NJWkUKKyAgICAgICAgUEFSQU1FVEVSIChDRkRNQVhfU0laRSA9IDEwMDApCisgICAgICAgIElOVEVHRVIgaSx0aWRzKDA6Q0ZETUFYX1NJWkUtMSksdGlkLGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWRzLHRpZCxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBDRkRNQVhfU0laRS0xCisgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBETyBpPTAsIENGRE1BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAubmUuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworIAorICAgICAgICBBTExPQ0FURSggdG1wKDA6Y291bnQpICkKKyAgICAgICAgdG1wKDApID0gMQorIAorICAgICAgICBETyBpID0gMCwgQ0ZETUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0bXBfY291bnQgLkdULiBjb3VudCApIFRIRU4KKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhISIKKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgR09UTyAxMAorICAgICAgICAgIEVORCBJZgorICAgICAgICAgIElGICggdGlkcyhpKSAuTkUuIHRpZHMoaSsxKSApIHRoZW4KKyAgICAgICAgICAgIHRtcF9jb3VudCA9IHRtcF9jb3VudCArIDEKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKzEKKyAgICAgICAgICBFTkQgSUYgCisgICAgICAgIEVORCBETyAgICAgICAgICAKKworIS4uLiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAKKworIDEwICAgICBETyBpPTAsIGNvdW50IC0xCisgICAgICAgICAgSUYgKCBNT0QodG1wKGkpLGNodW5rX3NpemUpIC5uZS4gMCApIFRIRU4KKyEgLi4uIGl0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkIAorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICAgV1JJVEUoMSwqKSAiVGhlIGludGVybWVkaWF0ZSBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLiIKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCBNT0QodG1wKGNvdW50KSwgY2h1bmtfc2l6ZSkgLk5FLiAKKyAgICAgJiAgICAgTU9EIChDRkRNQVhfU0laRSwgY2h1bmtfc2l6ZSkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgIAorICAgICAgICBJRiAoIHJlc3VsdCAuZXEuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwZTdlZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZgpAQCAtMCwwICsxLDE3NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBndWlkZWQgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgISBUT0RPOgorICAhIEMuIE5pZXRoYW1tZXI6CisgICEgICAgICAgRmluZCBjaGVjayB0byBkZWNpZGUgaWYgdGhlIHRlc3Qgd2FzIHJ1biBhcyBzY2hlZHVsZShzdGF0aWMpIGJlY2F1c2UKKyAgISAgICAgICB0aGlzIGFsc28gY2FuIHBhc3MgdGhlIHRlc3QgaWYgdGhlIHdvcmsgaXMgZGl2aWRlZCBpbnRvIHRocmVhZC1jb3VudHMgCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIENIQVJBQ1RFUioyMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRtcF9jb3VudAorICAgICAgICBJTlRFR0VSLCBhbGxvY2F0YWJsZSA6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaSwgZmxhZworICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIGV4cGVjdGVkCisgICAgICAgIElOVEVHRVIgb3BlbndvcmsKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBjCisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIHRpZAorICAgICAgICBJTlRFR0VSIGNvdW50CisKKyAgICAgICAgSU5URUdFUiBERUxBWSAKKyAgICAgICAgSU5URUdFUiBNQVhfVElNRQorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisKKyEgLi4uIGNob29zZSBzbWFsbCBpdGVyYXRpb24gc3BhY2UgZm9yIHNtYWxsIHN5bmMuIG92ZXJoZWFkCisgICAgICAgIFBBUkFNRVRFUiAoREVMQVkgPSAxKQorICAgICAgICBQQVJBTUVURVIgKE1BWF9USU1FID0gNSkKKyAgICAgICAgUEFSQU1FVEVSIChDRlNNQVhfU0laRSA9IDE1MCkKKworICAgICAgICBJTlRFR0VSIG5vdG91dAorICAgICAgICBJTlRFR0VSIG1heGl0ZXIKKyAgICAgICAgSU5URUdFUiB0aWRzKDA6Q0ZTTUFYX1NJWkUtMSkKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBub3RvdXQsbWF4aXRlcix0aWRzCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIG5vdG91dCA9IDEKKyAgICAgICAgbWF4aXRlciA9IDAKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgb3BlbndvcmsgPSBDRlNNQVhfU0laRQorPG9tcHRzOmNoZWNrPgorCishIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzCishJG9tcCBwYXJhbGxlbCAKKyEkb21wIHNpbmdsZQorICAgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCB0aHJlYWRzIC5MVC4gMikgVEhFTgorICAgICAgICAgIFBSSU5UICosIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgV1JJVEUoMSwqKSAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIFNUT1AKKyAgICAgICAgRU5EIElGCisKKyEgLi4uIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOgorISAuLi4gRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkLGNvdW50KSBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKQorICAgICAgICBETyBpID0gMCAsIENGU01BWF9TSVpFLTEKKyAgICAgICAgICBjb3VudCA9IDAKKyEkb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICAgICAgSUYgKCBpIC5HVC4gbWF4aXRlciApIFRIRU4gICAgICAgICAgICAgICAgIAorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIG1heGl0ZXIgPSBpCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBFTkQgSUYKKworIS4uICAgICAgICAgaWYgaXQgaXMgbm90IG91ciB0dXJuIHdlIHdhaXQKKyEgICAgICAgICAgIGEpIHVudGlsIGFub3RoZXIgdGhyZWFkIGV4ZWN1dGVkIGFuIGl0ZXJhdGlvbgorISAgICAgICAgICAgd2l0aCBhIGhpZ2hlciBpdGVyYXRpb24gY291bnQKKyEgICAgICAgICAgIGIpIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIChmaXJzdCB0aHJlYWQgZmluaXNoZWQKKyEgICAgICAgICAgICAgYW5kIHNldCBub3RvdXQ9MCBPUgorISAgICAgICAgICAgYykgdGltZW91dCBhcnJpdmVkIAorCishJG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgICBJRiAoIG5vdG91dCAuR0UuIDEgLkFORC4gY291bnQgLkxULiBNQVhfVElNRQorICAgICAmICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKSBUSEVOCisgICAgICAgICAgICAgIERPIFdISUxFICggbm90b3V0IC5HRS4gMSAuQU5ELiBjb3VudCAuTFQuIE1BWF9USU1FCisgICAgICYgICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKQorICAgICAgICAgICAgICAgIENBTEwgc2xlZXAoREVMQVkpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIERFTEFZCisgICAgICAgICAgICAgIEVORCBETyAgICAgICAgIAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvIG5vd2FpdAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBub3RvdXQgPSAwCishJG9tcCBmbHVzaChub3RvdXQpCisKKyEkb21wIGVuZCBwYXJhbGxlbCAKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCishIGV2YWx1YXRpb24gb2YgdGhlIHZhbHVlcworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIERPIGk9MCwgQ0ZTTUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5ORS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgQUxMT0NBVEUoIHRtcCgwOmNvdW50KSAgKQorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHRtcCgwKSA9IDEKKyEgLi4uIGNhbGN1bGF0ZSB0aGUgY2h1bmtzaXplIGZvciBlYWNoIGRpc3BhdGNoCisKKyAgICAgICAgRE8gaT0wLCBDRlNNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLkVRLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKyAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgdG1wX2NvdW50ID0gdG1wX2NvdW50ICsgMQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCishIC4uLiBDaGVjayBpZiBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2VkIHVudGlsIGVxdWFscyB0byAKKyEgLi4uIHRoZSBzcGVjaWZpZWQgb25lLCBpZ25vcmUgdGhlIGxhc3QgZGlzcGF0Y2ggCishIC4uLiBmb3IgcG9zc2libGUgc21hbGxlciByZW1haW5kZXIKKworISBEZXRlcm1pbmUgdGhlIGNvbnN0YW50IAorICAgICAgICBleHBlY3RlZCA9IG9wZW53b3JrIC8gdGhyZWFkcworICAgICAgICBjID0gcmVhbCh0bXAoMCkpIC8gcmVhbChleHBlY3RlZCkKKyAgICAgICAgV1JJVEUoMSwqKSAiRm91bmQgY29uc3RhbnQgdG8gYmUgIiwgYworCisgICAgICAgIERPIGkgPSAwLCBjb3VudCAtIDIKKyAgICAgICAgICBXUklURSgxLCopICJvcGVuOiIsIG9wZW53b3JrLCAic2l6ZToiLCB0bXAoaSkKKyAgICAgICAgICBJRiAoZXhwZWN0ZWQgLkdULiAxKSBUSEVOCisgICAgICAgICAgICBleHBlY3RlZCA9IGMgKiBvcGVud29yayAvIHRocmVhZHMKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIElGIChhYnModG1wKGkpIC0gZXhwZWN0ZWQpIC5HRS4gMiApIFRIRU4KKyAgICAgICAgICAgIHJlc3VsdCA9IDEKKyAgICAgICAgICAgIFdSSVRFKDEsKikgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIsCisgICAgICYgICAgICAgICAidmFsdWU6ICIsdG1wKGkpLCAiaW5zdGVhZCAiLCBleHBlY3RlZAorICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgSUYgKGkgLkdULiAwIC5BTkQuICh0bXAoaS0xKSAtIHRtcChpKSkgLkxULiAwKSBUSEVOCisgICAgICAgICAgICBXUklURSgxLCopICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogIiwgdG1wKGkpLAorICAgICAmICAgICAgICAgImluc3RlYWQiLHRtcChpLTEpCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBvcGVud29yayA9IG9wZW53b3JrIC0gdG1wKGkpICAKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMSAKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czpjaGVjaz4KKzxvbXB0czpjcm9zc2NoZWNrPgorICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgIEVORAorPC9vbXB0czpjcm9zc2NoZWNrPgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb210cHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIwMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZG8gbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgY291bnQKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZTTUFYX1NJWkUgPSAxMDAwKQorICAgICAgICBJTlRFR0VSIGksdGlkcygwOkNGU01BWF9TSVpFLTEpLCB0aWQsIGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWQsdGlkcyxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIAorISRvbXAgc2luZ2xlCisgICAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggdGhyZWFkcyAuTFQuIDIpIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIFdSSVRFKDEsKikgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBTVE9QCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSgxLCopICJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAiLENGU01BWF9TSVpFCisgICAgICAgICAgV1JJVEUoMSwqKSAiVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICIsY2h1bmtfc2l6ZQorICAgIAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICAgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gaSA9IDAgLENGU01BWF9TSVpFIC0xCisgICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgICBETyBpID0gMCwgQ0ZTTUFYX1NJWkUtMQorIS4uLiByb3VuZC1yb2JpbiBmb3Igc3RhdGljIGNodW5rCisgICAgICAgICAgICBpaSA9IG1vZCggaS9jaHVua19zaXplLHRocmVhZHMpCisgICAgICAgICAgICBJRiAodGlkcyhpKSAuTkUuIGlpICkgVEhFTgorICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgICAgIFdSSVRFKDEsKikiSXRlcmF0aW9uICIsaSwic2hvdWxkIGJlIGFzc2lnbmVkIHRvICIsCisgICAgICYgICAgICAgICAgIGlpLCJpbnN0ZWFkIG9mICIsdGlkcyhpKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIClUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL2hhc19vcGVubXAuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NWVmMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKQEAgLTAsMCArMSwyNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3RpbmcgaWYgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIHN1cHBvcnRlZCBvciBub3QuICAKK1lpIFdlbiBhdCAwNTAzMjAwNDogRG8gd2Ugd2FudCB0byB3cml0ZSB0d28gdmVyc2lvbnMgb2YgaGFzX29tcD8gIGJvdGggQzIzNDU2Nzg5IAorYW5kICNpZmRlZiBmb3JtYXRzIGFyZSBzdXBwb3NlZCB0byB3b3JrLiBBdCBsZWFzdCBTdW4ncyBjb21waWxlciBjYW5ub3QgZGVhbCB3aXRoIAordGhlIHNlY29uZCBmb3JtYXQgKCNpZmRlZik8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKworPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmhhc19vcGVubXA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCis8b21wdHM6Y2hlY2s+CishdmVyc2lvbiAxLgorIUMyMzQ1Njc4OSAKKyEkICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorCishIHZlcnNpb24gMi4KKyEjaWZkZWYgX09QRU5NUAorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorISNlbmRpZgorPC9vbXB0czpjaGVjaz4KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9hdG9taWMuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKQEAgLTAsMCArMSw1ODggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEZ1bmN0aW9uczogb21wX2F0b21pYworISBjaGFuZ2UgImNoYXJhY3RlcioyMCIgaW50byAiY2hhcmFjdGVyIChMRU49MjApOjoiCishIGdldCByaWQgb2YgdGhlICJ0YWIiIGtleSBieSBaaGVueWluZyBMaXUsIG9uIE9jdC4gMTYsIDIwMDUuCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCwgaW50X2NvbnN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtMikKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0saSxkaWZmLHByb2R1Y3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGR0LGRkaWZmCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxwcm9kdWN0LGRpZmYsaSxkc3VtLGRkaWZmLGR0LGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsYml0X2FuZCxiaXRfb3IsaW50X2FycmF5LAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSWYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgZGlmZiwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGIChkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElmCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLmxlLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNTk5NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCAgICBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiAgQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC8gICBvbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMygpCisgICAgICAgIFJFQUwgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAuMAorICAgICAgICBETyBXSElMRSAoaSA8IExPT1BDT1VOVC0xKQorICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoaSkKKyAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgRU5EIERPCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9iYXJyaWVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHNsZWVwdGltZQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIsIHJhbmsKKyAgICAgICAgcmVzdWx0MSA9IDAKKyAgICAgICAgcmVzdWx0MiA9IDAKKyAgICAgICAgc2xlZXB0aW1lID0gMQorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEgICAgICAgIFBSSU5UICosICJyYW5rIiwgcmFuaworICAgICAgICBJRiAoIHJhbmsgLkVRLiAxICkgVEhFTgorICAgICAgICAgIENBTEwgc2xlZXAoc2xlZXB0aW1lKQorICAgICAgICAgIHJlc3VsdDIgPSAzCisgICAgICAgIEVORCBJRgorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBiYXJyaWVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0MSAuRVEuIDMgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NvcHlpbi5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRmMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvICAgb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEgQ2hhbmdlbG9nOgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jb3B5aW48L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIElOVEVHRVIsIFNBVkU6OnN1bTEgCishICAgICAgICBpbXBsaWNpdGx5IGJ5IG9tcF90aHJlYWRwcml2YXRlLCBzZWUgc3BlYzI1IENoYXAuIDIuOC4yCisgICAgICAgIElOVEVHRVIgc3VtMQorICAgICAgICBDT01NT04gL2NzdW0xLyBzdW0xCisgICAgICAgIElOVEVHRVIgc3VtLCBpLCB0aHJlYWRzCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgaSwgdGhyZWFkcworISAgIEMuIE5pZXRoYW1tZXIgMzAuMTEuMDY6IG1vdmVkIHRocmVhZHByaXZhdGUgc3RhdGVtZW50IGludG8gdGhlIG9ycGhhbmVkCishICAgICAgZnVuY3Rpb24KKyEkb21wIHRocmVhZHByaXZhdGUoL2NzdW0xLykKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTEgPSA3CisgICAgICAgIHRocmVhZHMgPSAwCisJCTxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Y29weWluKHN1bTEpPC9vbXB0czpjaGVjaz4KKyEgICAgICAgIHByaW50ICosInN1bTEiLHN1bTEKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgOTk5CisgICAgICAgICAgc3VtMSA9IHN1bTEgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorICAgICAgICB0aHJlYWRzID0gdGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuPgorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yICsgNyp0aHJlYWRzCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgcmVnaW9uIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uCisKKzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGosbXlpLG15aiwgc3VtCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgbXlpLCBteWoKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gMAorICAgICAgICBteWkgPSAwCisgICAgICAgIG15aiA9IDUwMAorISRvbXAgcGFyYWxsZWwKKyEkb21wIHNlY3Rpb25zCisKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDAgLCA0OTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgc3VtID0gc3VtICsgbXlpCisgICAgICAgICAgIG15aSA9IG15aSArIDEKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBqID0gNTAwICwgOTk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHN1bSA9IHN1bSArIG15agorICAgICAgICAgICBteWogPSBteWogKyAxCisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgc2VjdGlvbnMKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRm91bmQgc3VtIHdhcyIsIHN1bSwgImluc3RlYWQiLCBrbm93bl9zdW0KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZsdXNoIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZsdXNoPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGJhcnJpZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIGR1bW15LCByYW5rCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHJlc3VsdDIKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgcmVzdWx0MT0wCisgICAgICAgIHJlc3VsdDI9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEkb21wIGJhcnJpZXIKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQyID0gMworICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZmx1c2gocmVzdWx0MikKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgIGR1bW15ID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICBjYWxsIHNsZWVwKDEpCisgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBmbHVzaChyZXN1bHQyKQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKworISAgICAgICAgUFJJTlQgKiwiMToiLCByZXN1bHQxLCAiMjoiLCByZXN1bHQyLCAiZHVtbXkiLCBkdW1teQorICAgICAgICBJRiAoIChyZXN1bHQxIC5FUS4gcmVzdWx0MikgLkFORC4gKHJlc3VsdDIgLkVRLiBkdW1teSkgLkFORC4KKyAgICAgJiAgICAgICAocmVzdWx0MiAuRVEuIDMpICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfbnVtX3RocmVhZHMuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKQEAgLTAsMCArMSwzNyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxzb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElOVEVHRVIgbnRocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkc19saWIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHNfbGliCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgbnRocmVhZHNfbGliPS0xCisKKyEkb21wIHBhcmFsbGVsCishc2hhcmVkKG50aHJlYWRzLG50aHJlYWRzX2xpYikKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNpbmdsZQorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIG50aHJlYWRzX2xpYj1vbXBfZ2V0X251bV90aHJlYWRzKCkKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKG50aHJlYWRzIC5FUS4gbnRocmVhZHNfbGliKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJkMDNkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aWNrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGlja3M8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gdGljaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyB0aWNrCisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgdGljayA9IDEKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPgorICAgICAgICB0aWNrPW9tcF9nZXRfd3RpY0soKQorPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgV1JJVEUoMSwqKSAid29yayB0b29rIix0aWNrLCJzZWMuIHRpbWUuIgorICAgICAgICBJRih0aWNrIC5HVC4gMC4gLkFORC4gdGljayAuTFQuIDAuMDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2luX3BhcmFsbGVsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyEgICBjaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyEgICBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uCisgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisgICAgICAgIExPR0lDQUwgc2VyaWFsLCBwYXJhbGxlbAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzZXJpYWwsIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHNlcmlhbD0uVFJVRS4KKyAgICAgICAgcGFyYWxsZWw9LkZBTFNFLgorCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc2VyaWFsPW9tcF9pbl9wYXJhbGxlbCgpCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgcGFyYWxsZWw9b21wX2luX3BhcmFsbGVsKCk7CisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoLk5PVC4gc2VyaWFsKSAuQU5ELiAocGFyYWxsZWwpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKQEAgLTAsMCArMSw1OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCishbG9jayB2YXJpYWJsZQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworIXJlc3VsdCBpczoKKyEgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgQ0FMTCBvbXBfaW5pdF9sb2NrKGxvY2spCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBvbXBfc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgb21wX3Vuc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIG9tcF9kZXN0cm95X2xvY2sobG9jaykKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESWYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTFmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD0tMQorCishJG9tcCBwYXJhbGxlbAorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBtYXN0ZXIKKwkJPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD1vbXBfZ2V0X3RocmVhZF9udW0oKQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgbWFzdGVyCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAobnRocmVhZHMgLkVRLiAxKSAuQU5ELiAoZXhlY3V0aW5nX3RocmVhZCAuRVEuIDApICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIyYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5NUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKyAgICAgICAgSU5URUdFUiB0aWRfcmVzdWx0ICEgY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgISBmb3IgdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQsIHRpZF9yZXN1bHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgdGlkX3Jlc3VsdCA9IDAKKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPS0xCisKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICBpZiAob21wX2dldF90aHJlYWRfbnVtKCkgLm5lLiAwKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgdGlkX3Jlc3VsdCA9IHRpZF9yZXN1bHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZW5kIGlmCishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9b21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKG50aHJlYWRzIC5FUS4gMSkgLkFORC4gKGV4ZWN1dGluZ190aHJlYWQgLkVRLiAwKSAuQU5ELgorICAgICAmICAgICAgICh0aWRfcmVzdWx0IC5FUS4gMCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RfbG9jay5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjllM2FhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbmVzdF9sb2NrIGFuZCB0aGUgb21wX3Vuc2V0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyFyZXN1bHQgaXM6CishICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9ORVNUX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgb21wX2luaXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfc2V0X25lc3RfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2spCishICAgICAgICAgICAgICAgUFJJTlQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdGVkLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0IG5lc3RlZCBwYXJhbGxlbGlzbS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuNTwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+bmVzdGVkdGVzdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGNvdW50ZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gY291bnRlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjb3VudGVyID0wCisgICAgICAgIAorICAgICAgICA8b21wdHM6Y2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKQorISNpZmRlZiBfT1BFTk1QCishICAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKSAKKyEjZW5kaWYKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLkZBTFNFLikKKyEjaWZkZWYgX09QRU5NUAorISAgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5GQUxTRS4pCishI2VuZGlmCisgICAgICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKworISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgLSAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICAKKyAgICAgICAgSUYgKGNvdW50ZXIgLkVRLiAwICkgVEhFTgorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMgMCIKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRUxTRQorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMiLCBjb3VudGVyCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVORCBJRiAKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVkZTczCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgbWF4X3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgZmFpbGVkLHRocmVhZHMsbnRocmVhZHMsdG1wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGZhaWxlZCx0aHJlYWRzLG50aHJlYWRzCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgbWF4X3RocmVhZHMgPSAwCisgICAgICAgICAKKyEkb21wIHBhcmFsbGVsCishJG9tcCBtYXN0ZXIKKyAgICAgICAgbWF4X3RocmVhZHMgPSBPTVBfR0VUX05VTV9USFJFQURTKCkgICAgICAgCishJG9tcCBlbmQgbWFzdGVyCishJG9tcCBlbmQgcGFyYWxsZWwKKyEgICAgICAgICBwcmludCAqLCAibWF4IHRocmVhZHM6IixtYXhfdGhyZWFkcworCishWWkgV2VuIGFkZGVkIG9tcF9TZXRfZHluYW1pY3MgaGVyZSB0byBtYWtlIHN1cmUgbnVtX3RocmVhZHMgY2xhdXNlIHdvcmsKKyFUaGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQuIHNob3VsZCBiZSBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdGVzdCBsb29wCishYmVjYXVzZSBpdCBhbGxvd3MgdGhlIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYXQgcnVudGltZQorIWluc3RlYWQgb2YgdXNpbmcgdGhlIG1heF90aHJlYWRzIHNldC4gCisKKyAgICAgICAgIUNBTEwgT01QX1NFVF9EWU5BTUlDKC5UUlVFLikKKyAgICAgICAgRE8gdGhyZWFkcyA9IDEsIG1heF90aHJlYWRzCisgICAgICAgICAgbnRocmVhZHMgPSAwCisgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyh0aHJlYWRzKSByZWR1Y3Rpb24oKzpmYWlsZWQpCishICAgICAgICAgIHByaW50ICosIHRocmVhZHMsIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIHRtcCA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIElGICggdGhyZWFkcyAuTkUuIHRtcCApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogZm91bmQgIiwgdG1wLCAiIGluc3RlYWQgb2YgIiwKKyAgICAgJiAgICAgICAgICB0aHJlYWRzLCAiIHRocmVhZHMiCisgICAgICAgICAgRU5EIElGCishJG9tcCBhdG9taWMKKyAgICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishICAgICAgICAgICAgcHJpbnQgKiwgdGhyZWFkcywgbnRocmVhZHMKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+SUYgKCBudGhyZWFkcyAuTkUuIHRocmVhZHMgKSBUSEVOPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5JRiAoIG50aHJlYWRzIC5FUS4gdGhyZWFkcyApIFRIRU48L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIElGKGZhaWxlZCAuTkUuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3NpbmdsZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgyMWNhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQtMQorCQk8b21wdHM6b3JwaGFuPgorISRvbXAgc2luZ2xlCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgMQorICAgICAgICAgIDxvbXB0czpjaGVjaz5ucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlIC0gMTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDE8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyEkb21wIGVuZCBzaW5nbGUKKwkJPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNkN2IwCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBFWFRFUk5BTCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15agorICAgICAgICBJTlRFR0VSIGksagorICAgICAgICBJTlRFR0VSIHRpZHMoTlVNX1RBU0tTKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBqLHRpZHMKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlqKSBzaGFyZWQoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICBqID0gaQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBteWogPSBqCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIHRhc2sKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICB0aWRzKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLgorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmICh0aWRzKDEpIC5uZS4gdGlkcyhpKSkgdGhlbgorICAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc3NTllCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDEyMzQKKyAgICAgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbyBqID0gMCwgTE9PUENPVU5UCishJG9tcCBmbHVzaAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5ZjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIGR1bW15CisgICAgICAgIExPR0lDQUwgY29uZGl0aW9uX2ZhbHNlCisgICAgICAgIElOVEVHRVIgY250CisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBjb25kaXRpb25fZmFsc2UsIGNudCwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgY29uZGl0aW9uX2ZhbHNlID0gKGR1bW15IC5lcS4gMzE0MTU5KQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjbnQscnNsdCkKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRV9MT05HKQorISRvbXAgZmx1c2gKKyAgICAgICAgICBpZiAoY250IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgICByc2x0ID0gMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnNsdCA9IDAKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBjbnQgPSAxCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gcnNsdAorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfcHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB3aGljaCBnZXRzIGRlY2xhcmVkIHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDAKKyAgICAgICAgcnNsdCA9IDAKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJzbHQsIGtub3duX3N1bSkKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+bXlfc3VtID0gMDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG8gaiA9IDAsIExPT1BDT1VOVAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGkKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIElOVEVHRVIgaworCisgICAgICAgIGkgPSAwCisgICAgICAgIGsgPSAwCisgICAgICAgIHJzbHQgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaykgc2hhcmVkKGkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaz0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXArICAgICA8b21wdHM6Y2hlY2s+c2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworICAgICAgICAgICAgaSA9IGkgKyAxCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICByc2x0ID0gaQorICAgICAgICBpZiAocnNsdCAuZXEuIE5VTV9UQVNLUykgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThlOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mCkBAIC0wLDAgKzEsNjMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGZvciB1bnRpZWQgY2xhdXNlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgdW50aWVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRVhURVJOQUwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5URUdFUiBteWoKKyAgICAgICAgSU5URUdFUiBpLGoKKyAgICAgICAgSU5URUdFUiBjbnQKKyAgICAgICAgSU5URUdFUiBzdGFydF90aWQoTlVNX1RBU0tTKQorICAgICAgICBJTlRFR0VSIGN1cnJlbnRfdGlkKE5VTV9UQVNLUykKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaiwgY250LCBzdGFydF90aWQsIGN1cnJlbnRfdGlkCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY250ID0gMAorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgc3RhcnRfdGlkKGkpID0gMAorICAgICAgICAgIGN1cnJlbnRfdGlkKGkpID0gMAorICAgICAgICBlbmQgZG8KKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteWopIHNoYXJlZChqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIGogPSBpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIG15aiA9IGoKKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgc3RhcnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISRvbXAgdGFza3dhaXQKKyAgICAgIDxvbXB0czpjaGVjaz5pZiAoTU9EKHN0YXJ0X3RpZChteWopLDIpIC5uZS4gMCkgdGhlbjwvb21wdHM6Y2hlY2s+CisgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICBjdXJyZW50X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICBlbHNlCisgICAgICAgIGN1cnJlbnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgIGVuZCBpZjwvb21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHVudGllZCB0YXNrIHN3aXRjaGVkIHRocmVhZHMKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoY3VycmVudF90aWQoaSkgLm5lLiBzdGFydF90aWQoaSkpIHRoZW4KKyAgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhOTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZgpAQCAtMCwwICsxLDgzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrd2FpdCBkaXJlY3RpdmUuIEZpcnN0IHdlIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzLCB3aGljaCBzZXQgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdmFsdWUuIFRoZW4gd2UgZG8gYSB0YXNrd2FpdCBhbmQgY2hlY2sgaWYgYWxsIHRhc2tzIGZpbmlzaGVkIG1lYW5pbmcgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlLiBUaGVuIHdlIGdlbmVyYXRlIGEgc2Vjb25kIHNldCBzZXR0aW5nIHRoZSBhcnJheSBlbGVtZW50cyB0byBhbm90aGVyIHZhbHVlLiBBZnRlciB0aGUgcGFyYWxsZWwgcmVnaW9uIHdlIGNoZWNrIGlmIGFsbCB0YXNrcyBvZiB0aGUgc2Vjb25kIHNldCBmaW5pc2hlZCBhbmQgd2VyZSBleGVjdXRlZCBhZnRlciB0aGUgdGFza3Mgb2YgdGhlIGZpcnN0IHNldC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t3YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgdGFzazwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIKKyAgICAgICAgSU5URUdFUiBhcnJheShOVU1fVEFTS1MpCisgICAgICAgIElOVEVHRVIgaSwgbXlpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQxID0gMAorICAgICAgICByZXN1bHQyID0gMAorCisgICAgICAgICEgZmlsbCBhcnJheQorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgYXJyYXkoaSkgPSAwCisgICAgICAgIGVuZCBkbworCishJG9tcCBwYXJhbGxlbCBzaGFyZWQoaSkgcHJpdmF0ZShteWkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICEgRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICEgd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgICAgICAgISBvdmVyd3JpdHRlbiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lCisgICAgICAgICAhIHdoaWNoIGlzIG5lZWRlZCB0byBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorCisgICAgICAgICBteWkgPSBpCisKKyEkb21wIHRhc2sKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICBhcnJheShteWkpID0gMQorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgdGFza3dhaXQKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgISBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZAorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDEpIHRoZW4KKyAgICAgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDEgKyAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICAgICEgZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgdGhlIHZhbHVlc2luIHRoZQorICAgICAgICAhIGFycmF5CisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgbXlpID0gaQorISRvbXAgdGFzaworICAgICAgICAgIGFycmF5KG15aSkgPSAyCishJG9tcCBlbmQgdGFzaworICAgICAgICBlbmQgZG8KKworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgISBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcworICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDIpIHRoZW4KKyAgICAgICAgICAgIHJlc3VsdDIgPSByZXN1bHQyICsgMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgICBpZiAoIChyZXN1bHQxIC5lcS4gMCkgLmFuZC4gKHJlc3VsdDIgLmVxLiAwKSApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5NmQyNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDYxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CishcmVzdWx0IGlzOgorISAgICAgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgICAgICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX05FU1RfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBJTlRFR0VSICBsY2sKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgT01QX0lOSVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBXSElMRShPTVBfVEVTVF9ORVNUX0xPQ0sobG9jaykgLkVRLiAwKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9jaykKKyEgICAgICAgICAgICAgICBwcmludCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzMDRkCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mCkBAIC0wLDAgKzEsNTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdGxvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTE9DS19LSU5EKTo6bG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIE9NUF9JTklUX0xPQ0sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIERPIFdISUxFICguTk9ULiBPTVBfVEVTVF9MT0NLKGxvY2spKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTE9DSyhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgT01QX0RFU1RST1lfTE9DSyhsb2NrKQorISAgICAgICAgICAgICAgIHByaW50ICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdHN1aXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDQ4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCkBAIC0wLDAgKzEsMiBAQAorCWludGVnZXIgTE9PUENPVU5UCisJcGFyYW1ldGVyIChMT09QQ09VTlQ9MTAwMCkKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCkBAIC0wLDAgKzEsODkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlIGJ5IGZpbGxpbmcgYW4gYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyBpbiBhbiBwYXJhbGxlbGlzZWQgcmVnaW9uLiBFYWNoIHRocmVhZCBnZW5lcmF0ZXMgb25lIG51bWJlciBvZiB0aGUgYXJyYXkgYW5kIHNhdmVzIHRoaXMgaW4gYSB0ZW1wb3JhcnkgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZS4gSW4gYSBzZWNvbmQgcGFyYWxsZWxpc2VkIHJlZ2lvbiB0aGUgdGVzdCBjb250cm9scywgdGhhdCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvbnRhaW5zIHN0aWxsIHRoZSBmb3JtZXIgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIG9uZSBpbiB0aGUgYXJyYXkuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcF9zZXRfZHluYW1pYyxvbXBfZ2V0X251bV90aHJlYWRzLG9tcCBtYXN0ZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorIVlpIFdlbiBtb2RpZmllZCB0aGlzIGZ1bmN0aW9uIGZyb20gaGlzIG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZW1hbnRpY3MKKyFvZiBDIHZlcnNpb24gYXQgMDUwNDIwMDQKKyFUaGUgdW5kZWVzdGFuZGluZyBpcyB0aGF0IHN1bTAgYW5kIG15dmFsdWUgY2FuIGJlIGxvY2FsIHN0YXRpYyB2YXJpYWJsZXMKKyFvZiB0aGUgY2hrX29tcF90aHJlYWRwcml2YXRlIGZ1bmN0aW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBjb21tb24KKyFibG9jaworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaXRlciwgcmFuayxzaXplLCBmYWlsZWQKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgUkVBTCBteV9yYW5kb20KKyAgICAgICAgUkVBTCwgQUxMT0NBVEFCTEU6OiBkYXRhKDopCisgICAgICAgIElOVEVHRVIgcmFuZG9tX3NpemUKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9udW1iZXIKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9zZWVkCisgICAgICAgIEVYVEVSTkFMIG9tcF9zZXRfZHluYW1pYworCishWWkgV2VuIG1vZGlmaWVkIGF0IDA1MDQyMDA0IDogYWRkICJzYXZlIgorICAgICAgICBJTlRFR0VSLCBTQVZFOjogc3VtMAorICAgICAgICBSRUFMLCBTQVZFOjpteXZhbHVlCishWWkgV2VuIGNvbW1lbnRlZCB0d28gY29tbW9uIGJsb2NrcworIQljb21tb24vY3N1bTAvIHN1bTAKKyEJY29tbW9uL2NteXZhbHVlLyBteXZhbHVlCishISEhISEhISEhJG9tcCB0aHJlYWRwcml2YXRlKC9jc3VtMC8sL2NteXZhbHVlLykKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgdGhyZWFkcHJpdmF0ZShzdW0wLG15dmFsdWUpCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBzdW0gPSAwCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgc3VtMD0wCisgICAgICAgIG15dmFsdWU9MAorICAgICAgICByYW5kb21fc2l6ZT00NQorICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLk5FLiBzdW0gKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwgJyBrbm93bl9zdW0gPScsIGtub3duX3N1bSwgJywgc3VtID0nLHN1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgbWFzdGVyCisgICAgICAgIHNpemUgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgQUxMT0NBVEUgKCBkYXRhKHNpemUpICkKKyEkb21wIGVuZCBtYXN0ZXIKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIFJBTkRPTV9TRUVEKFNJWkU9cmFuZG9tX3NpemUpCisgICAgICAgIERPIGl0ZXIgPSAwLCA5OQorICAgICAgICAgIENBTEwgUkFORE9NX05VTUJFUihIQVJWRVNUPW15X3JhbmRvbSkKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkrMQorICAgICAgICAgIG15dmFsdWUgPSBteV9yYW5kb20gKyByYW5rCisgICAgICAgICAgZGF0YShyYW5rKSA9IG15dmFsdWUKKyEkb21wIGVuZCBwYXJhbGxlbAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKSsxCisgICAgICAgICAgSUYgKCBteXZhbHVlIC5ORS4gZGF0YShyYW5rKSApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFBSSU5UICosICcgbXl2YWx1ZSA9JyxteXZhbHVlLCcgZGF0YShyYW5rKT0nLCBkYXRhKHJhbmspCisgICAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIERFQUxMT0NBVEUoIGRhdGEpCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgLkFORC4gKGZhaWxlZCAuTkUuIDEpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMCAKKyAgICAgICAgZW5kIGlmCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpAQCAtMCwwICsxLDE0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIFdPUktTSEFSRSBpcyBwcmVzZW50Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgd29ya3NoYXJlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBGdW5jdGlvbjogb21wX3dvcmtzaGFyZQorISAKKyEgYnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyEgT2N0LiAyMDA1IC0gRmlyc3QgdmVyc2lvbgorISAKKyEgVGhlIGlkZWEgZm9yIHRoZSB0ZXN0IGlzIHRoYXQgaWYgV09SS1NIQVJFIGlzIG5vdCBwcmVzZW50LAorISB0aGUgYXJyYXkgYXNzaWdubWVudCBpbiBQQVJBTExFTCByZWdpb24gd2lsbCBiZSBleGVjdXRlZCBieSBlYWNoIAorISB0aHJlYWQgYW5kIHRoZW4gd3JvbmdmdWxseSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLgorIQorISBUT0RPOkRvIHdlIG5lZWQgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTD8KKyEgQSBzaW1wbGUgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTCBpcyBhZGRlZCBieSBaaGVueWluZyBMaXUKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsaQorICAgICAgICBJTlRFR0VSIHNjYWxhcjAyLHNjYWxhcjEyLHNjYWxhcjIyLHNjYWxhcjMyLGNvdW50CisgICAgICAgIFJFQUwsIERJTUVOU0lPTigxMDAwKTo6RkYKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzCisgICAgICAgIElOVEVHRVIsIERJTUVOU0lPTigxMDAwKTo6QUEsQkIsQ0MKKyAgICAgICAgUkVBTCwgRElNRU5TSU9OKDEwMDApOjpERAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzLAorICAgICAmICAgICAgQUEsQkIsQ0MsREQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgc2NhbGFyMD0wCisgICAgICAgIHNjYWxhcjAyPTAKKyAgICAgICAgc2NhbGFyMT0wCisgICAgICAgIHNjYWxhcjEyPTAKKyAgICAgICAgc2NhbGFyMj0wCisgICAgICAgIHNjYWxhcjIyPTAKKyAgICAgICAgc2NhbGFyMz0wCisgICAgICAgIHNjYWxhcjMyPTAKKyAKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgQUE9MAorICAgICAgICBCQj0wCisKKyAgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgICBDQyhpKSA9IGkKKyAgICAgICAgICBGRihpKSA9IDEuMC9pCisgICAgICAgIGVuZCBkbworCishJE9NUCBQQVJBTExFTAorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJE9NUCAgIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+CisKKyEgdGVzdCBpZiB3b3JrIGlzIGRpdmlkZWQgb3Igbm90IGZvciBhcnJheSBhc3NpZ25tZW50CisgICAgICAgIEFBPUFBKzEKKworISB0ZXN0IGlmIHNjYWxhciBhc3NpZ25tZW50IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCisgICAgICAgIHNjYWxhcjA9c2NhbGFyMCsxIAorCishIHRlc3QgaWYgYXRvbWljIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBBVE9NSUMKKyAgICAgICAgc2NhbGFyMT1zY2FsYXIxKzEgCishIHRlc3QgaWYgY3JpdGljYWwgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIENSSVRJQ0FMCisgICAgICAgIHNjYWxhcjI9c2NhbGFyMisxCishJE9NUCBFTkQgQ1JJVElDQUwKKworISB0ZXN0IGlmIFBBUkFMTEVMIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBQQVJBTExFTAorICAgICAgICBzY2FsYXIzPXNjYWxhcjMrMQorISRPTVAgRU5EIFBBUkFMTEVMCisKKyAgICAgICAgV0hFUkUgKCBDQyAubmUuIDAgKSBERCA9IDEuMC9DQworCisgICAgICAgIEZPUkFMTCAoST0xOjEwMDApIENDKGkpID0gLWkKKworPG9tcHRzOmNoZWNrPiEkT01QICAgRU5EIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkT01QIEVORCBQQVJBTExFTAorCishc2VxdWVudGlhbCBlcXVpdmFsZW50IHN0YXRlbWVudHMgZm9yIGNvbXBhcmlzb24gCisgICAgICAgQkI9QkIrMQorICAgICAgIHNjYWxhcjAyPXNjYWxhcjAyKzEKKyAgICAgICBzY2FsYXIxMj1zY2FsYXIxMisxCisgICAgICAgc2NhbGFyMjI9c2NhbGFyMjIrMQorICAgICAgIHNjYWxhcjMyPXNjYWxhcjMyKzEKKworISAgICAgIHdyaXRlICgxLCopICJjazpzdW0gb2YgQUEgaXMiLFNVTShBQSksIiBzdW0gb2YgQkIgaXMgIixzdW0oQkIpCisgICAgICAgaWYgKFNVTShBQSkvPVNVTShCQikpIHRoZW4KKyAgICAgICAgICAgIHdyaXRlKDEsKikgIkFycmF5IGFzc2lnbm1lbnQgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICAgIHJlc3VsdD1yZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIwLz1zY2FsYXIwMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIlNjYWxhciBhc3NpZ25tZW50IGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMS89c2NhbGFyMTIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJBdG9taWMgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMi89c2NhbGFyMjIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJDUklUSUNBTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIzLz1zY2FsYXIzMikgdGhlbgorICAgICAgICAgICB3cml0ZSgxLCopICJQQVJBTExFTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgIGlmICggYWJzKCBERChpKS0gRkYoaSkpIC5ndC4gMS4wRS00ICkgdGhlbgorCSAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiV0hFUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICBlbmQgaWYKKworICAgICAgIGNvdW50ID0gMAorICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICBpZiAoIENDKGkpIC5uZS4gLWkgKSB0aGVuCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiRk9SQUxMIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgZW5kIGlmCisKKworIWlmIGFueXRoaW5nIGlzIHdyb25nLCBzZXQgcmV0dXJuIHZhbHVlIHRvIDAKKyAgICAgICBpZiAocmVzdWx0PT0wKSB0aGVuCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICBlbHNlCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICBlbmQgaWYKKyAgICAgICBlbmQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3NGM0MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZgpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB3b3Jrc2hhcmUgZGVmYXVsdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZV9kZWZhdWx0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIG15c3VtCisgICAgICAgIElOVEVHRVIgaQorCisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIKKworISRvbXAgcGFyYWxsZWwgZGVmYXVsdChwcml2YXRlKSBzaGFyZWQoc3VtKQorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCA5OTkKKyAgICAgICAgICAgbXlzdW0gPSBteXN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8gCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIG15c3VtCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3MzM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZgpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN0YXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZW5kdGltZQorICAgICAgICBDT01NT04gc3RhcnQsIGVuZHRpbWUKKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHdhaXRfdGltZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG1lYXN1cmVkX3RpbWUKKyAgICAgICAgSU5URUdFUiBmaWxldW5pdAorICAgICAgICB3YWl0X3RpbWU9MQorCisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZW5kdGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgc3RhcnQ9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgQ0FMTCBzbGVlcCh3YWl0X3RpbWUpCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIGVuZHRpbWU9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgbWVhc3VyZWRfdGltZT1lbmR0aW1lLXN0YXJ0CisgICAgICAgIFdSSVRFKDEsKikgIndvcmsgdG9vayIsbWVhc3VyZWRfdGltZSwic2VjLiB0aW1lLiIKKyAgICAgICAgSUYobWVhc3VyZWRfdGltZS5HVC4wLjk5KndhaXRfdGltZSAuQU5ELgorICAgICAmIG1lYXN1cmVkX3RpbWUgLkxULiAxLjAxKndhaXRfdGltZSkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2ZpcnN0cHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFlNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDI2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24scGFyIGRvIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaTIsIGkKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPTAKKyAgICAgICAgaTIgPSAzCishJG9tcCBwYXJhbGxlbCBkbyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+IHJlZHVjdGlvbigrOnN1bSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyAoIGkrIGkyKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIrMypMT09QQ09VTlQKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2ZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYKQEAgLTAsMCArMSwzMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpLCBudW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvbnRyb2wKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisKKyAgICAgICAgY29udHJvbCA9IDAKKyEkb21wIHBhcmFsbGVsIGRvIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbCA9PSAxKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBXUklURSAoMSwqKSAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieToiXAorICAgICAgICAgICAgICAgICAgICAib21nX2dldF9udW1fdGhyZWFzZDoiLCBudW1fdGhyZWFkcworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gbnVtX3RocmVhZHMgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDIxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLCBwYXIgZG8gcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaTAKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisgICAgICAgIGkwID0gLTEKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSAuQU5ELiAoaTAgLkVRLiBMT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkNGNkMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIHNjaGVkdWxlIHN0YXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEhlbHBlciBmdW5jdGlvbiBpc19sYXJnZXIKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgSU5URUdFUiBGVU5DVElPTiBpX2lzbGFyZ2VyMihpKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIGxhc3RfaSxpc2xhcmdlcgorICAgICAgICBDT01NT04gL2NvbS8gbGFzdF9pCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyEgICAgICAgIHByaW50ICosICJsYXN0X2kiLGxhc3RfaSwgImkiLCBpCishIGxhc3RfaSBpcyBhIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kgKSBUSEVOCisgICAgICAgICAgaXNsYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICAgIGxhc3RfaSA9IGkKKyAgICAgICAgaV9pc2xhcmdlcjIgPSBpc2xhcmdlcgorICAgICAgRU5EIEZVTkNUSU9OCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ09NTU9OIC9jb20vIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bSxpLCBsYXN0X2kKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpc19sYXJnZXIsc3VtLGlfaXNsYXJnZXIyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcixzdW0saQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgCisgICAgICAgIHN1bT0wCisgICAgICAgIGlzX2xhcmdlcj0xCisgICAgICAgIGxhc3RfaT0wCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShzdGF0aWMsIDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgSUYoIGlfaXNsYXJnZXIyKGkpIC5FUS4gMSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxICkgVEhFTiAgCisgICAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNfbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgICAgc3VtID0gc3VtICsgaQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgb3JkZXJlZAorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoOTkqMTAwKS8yCishWWkgV2VuOyBTdW4gY29tcGlsZXIgd2lsbCBmYWlsIHNvbWV0aW1lcworISAgICAgICAgcHJpbnQgKiwgInN1bSIsIHN1bSwgImtzIiwga25vd25fc3VtLCAibGEiLCBpc19sYXJnZXIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzOWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgUkVBTCBpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMC4wCisgICAgICAgIGkgPSAwCisgICAgICAgIERPIFdISUxFIChpIDwgTE9PUENPVU5UKQorICAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KGkpCisgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBFTkQgRE8KKyAgICAgIEVORAorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGksIGkyLCBpMworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpMiA9IGkKKyEkb21wIGZsdXNoCisgICAgICAgICAgQ0FMTCBkb19zb21lX3dvcmsyKCkKKyEkb21wIGZsdXNoCisgICAgICAgICAgc3VtID0gc3VtICsgaTIKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19yZWR1Y3Rpb24uZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw0MTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgIGFicyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLm9yLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLm5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oSU9SOmJpdF9vcikKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5sZS4gMCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6ZG1heCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmI4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDExCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPiAgCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbCAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gMTEqMyArIDcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNzIxZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bSwgaSAsaTAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTA9aQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyEgICAgICAgIHByaW50ICosICJzdW0iLCBzdW0sICJrcyIsIGtub3duX3N1bSwgaTAKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3ByaXZhdGUuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwYWMwZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKQEAgLTAsMCArMSw4NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5lcS4gc3VtICkgdGhlbgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKworICAgICAgICBpbnRlZ2VyIGZ1bmN0aW9uIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlKCkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBpbnRlZ2VyIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgaWYgKCBrbm93bl9zdW0gLmVxLiBzdW0gKSB0aGVuCisgICAgICAgICAgY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUgPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSA9IDAKKyAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZAorCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkZTMwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZgpAQCAtMCwwICsxLDYzMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fcmVkdWN0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgSU5URUdFUiBjdXQxLCBjdXQyLCBjdXQzLCBjdXQ0CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLikKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSAyICogY3V0MQorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCw2CisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMgorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsIDYKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywgMTIKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLDMKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTQsNgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIGlmICgubm90LiBsb2dpY19hbmQpIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgZW5kIGlmCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZG1heCAubHQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0xPU0UoMikKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzAwNThhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sc3VtMAorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMTEKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IDExKjMrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2xhc3Rwcml2YXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTcxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLCBpMCwgc3VtLCBzdW0wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksaTAsc3VtCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tdHM6dGVzdD4KKworCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODA5MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMCxpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxzdW0wLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2U3MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw3NDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0sIGkyCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bSxkcHQKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksZHVtbXkKKyAgICAgICAgSU5URUdFUiBzdW0sIGRJRmYKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sIGRkSUZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBJTlRFR0VSIGN1dDEsIGN1dDIsIGN1dDMsIGN1dDQKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHN1bSxkSUZmLHByb2R1Y3QsZHQsZHN1bSxkZElGZixsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGludF9hcnJheSxiaXRfYW5kLGJpdF9vciwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4zKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IGN1dDEgKiAyCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLjMpCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gY3V0MSAqIDIKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZElGZiA9IGtub3duX3N1bQorCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkSUZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZElGZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkSUZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyEgICBUZXN0IGZvciBET3VibGVzCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsNgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTIKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMyxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworIAorICAgICAgICBJRiAoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgYWJzKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBET3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERJRmZlcmVuY2U6ICIsCisgICAgICYgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZHB0ID0gMQorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZGRJRmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRJRmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLCA2CisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsIDEyCisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYWJzKGRkSUZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBESUZmZXJlbmNlIHdpdGggRE91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZGRJRmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsMworICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT00LDYKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5hbmQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmFuZC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigub3IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm9yLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5mYWxzZS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5mYWxzZS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpYW5kOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLmx0LiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlhbmQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpb3I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaW9yOmJpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpZW9yOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGllb3I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtaW46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgRE91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1pbjpkbWluKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBET3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERPdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENMT1NFKDIpCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZiBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc4YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgY29weXByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFybGxlbCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksaix0aHJlYWQsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfaXRlcmF0aW9ucyxyZXN1bHQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxqLHRocmVhZCkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgRE8gaT0wLExPT1BDT1VOVC0xCisgICAgICAgICAgdGhyZWFkPU9NUF9HRVRfVEhSRUFEX05VTSgpCishJG9tcCBzaW5nbGUgCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBqPWkKKyEkb21wIGVuZCBzaW5nbGUgPG9tcHRzOmNoZWNrPmNvcHlwcml2YXRlKGopPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtqLWk7CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGKHJlc3VsdCAuRVEuIDAgLkFORC4gCisgICAgICYgICAgIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfbm93YWl0LmYgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsIHRvdGFsX2l0ZXJhdGlvbnMsIG15X2l0ZXJhdGlvbnMsaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl9pdGVyYXRpb25zCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICB0b3RhbF9pdGVyYXRpb25zPTAKKyAgICAgICAgbXlfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJG9tcCBzaW5nbGU8L29tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCisgICAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxteV9pdGVyYXRpb25zKQorICAgICAgICBteV9pdGVyYXRpb25zID0gMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorPG9tcHRzOmNoZWNrPiEkb21wIHNpbmdsZTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbXlfaXRlcmF0aW9ucyA9IG15X2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHRvdGFsX2l0ZXJhdGlvbnMgPSB0b3RhbF9pdGVyYXRpb25zICsgbXlfaXRlcmF0aW9ucworISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UIC5BTkQuCisgICAgICYgICAgIHRvdGFsX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mIGIvcmMxL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNGE2YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zLCBpCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZSwgbXlyZXN1bHQsIG15aXQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gcmVzdWx0LG5yX2l0ZXJhdGlvbnMKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG15cmVzdWx0PTAKKyAgICAgICAgbXlpdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLCBteXJlc3VsdCwgbXlpdCkKKzxvbXB0czpvcnBoYW4+CisgICAgICAgIG15cmVzdWx0ID0gMAorICAgICAgICBteWl0ID0gMAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCishJG9tcCBiYXJyaWVyCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCishJG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDAKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbXlpdCA9IG15aXQgKyAxCisgICAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCishJG9tcCBlbmQgc2luZ2xlIG5vd2FpdAorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgbXlpdAorISRvbXAgZW5kIGNyaXRpY2FsCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBXUklURSgxLCopICJyZXN1bHQgaXMiLHJlc3VsdCwibnJfaXQgaXMiLG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQgYi9yYzEvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NjZlMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDQ1IEBACitkb19maXJzdHByaXZhdGUuZgorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorI2RvX3NjaGVkdWxlX2R5bmFtaWMKKyNkb19zY2hlZHVsZV9ndWlkZWQKKyNkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKKyNvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NvcHlpbgorb21wX2NyaXRpY2FsCisjb21wX2ZsdXNoCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jaworb21wX25lc3RlZAorb21wX251bV90aHJlYWRzCitvbXBfdGVzdGxvY2sKK29tcF90ZXN0c3VpdGUKK29tcF90aHJlYWRwcml2YXRlCisjb21wX3RpY2tzX3RpbWUKKyNvbXBfd29ya3NoYXJlCisjb21wX3d0aW1lCisjcGFyX2RvZmlyc3Rwcml2YXRlCisjcGFyX2RvX2xhc3Rwcml2YXRlCisjcGFyX2RvX29yZGVyZWQKKyNwYXJfZG9fcHJpdmF0ZQorI3Bhcl9kb19yZWR1Y3Rpb24KKyNwYXJfc2VjdGlvbmlyc3Rwcml2YXRlLmYKKyNwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorI3Bhcl9zZWN0aW9uX3ByaXZhdGUKKyNwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KKyNzZWN0aW9uaXJzdHByaXZhdGUuZgorI3NlY3Rpb25fbGFzdHByaXZhdGUKKyNzZWN0aW9uX3ByaXZhdGUKKyNzZWN0aW9uX3JlZHVjdGlvbgorI3NpbmdsZQorI3NpbmdsZV9jb3B5cHJpdmF0ZQorI3NpbmdsZV9ub3dhaXQKKyNzaW5nbGVfcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuZiBiL3JjMS90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjYjA0YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKQEAgLTAsMCArMSwyNiBAQAorISBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQKKyEgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLgorCisgICAgICBzdWJyb3V0aW5lIG15X3NsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBkb3VibGUgcHJlY2lzaW9uIDo6IHNsZWVwdGltZQorICAgICAgICBpbnRlZ2VyIDo6IHUKKyAgICAgICAgaW50ZWdlciA6OiB0KDgpCisgICAgICAgIGludGVnZXIgOjogbXMxLCBtczIKKyAgICAgICAgaW50ZWdlciA6OiBjbnQKKworICAgICAgICB1ID0gc2xlZXB0aW1lICogMTAwMAorCisgICAgICAgIGNhbGwgZGF0ZV9hbmRfdGltZSh2YWx1ZXM9dCkKKworICAgICAgICAhIGNhbGN1bGF0ZSBzdGFydCB0aW1lIGluIG1zCisgICAgICAgIG1zMSA9IHQoOCkgKyB0KDcpKjEwMDAgKyB0KDYpKjYwMDAwICsgdCg1KSozNjAwMDAwCisKKyAgICAgICAgbXMyID0gbXMxCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZG8gd2hpbGUgKCAobXMyIC0gbXMxKSA8IHUpCisgICAgICAgICAgICBjYWxsIGRhdGVfYW5kX3RpbWUodmFsdWVzPXQpCisgICAgICAgICAgICBtczIgPSB0KDgpICsgdCg3KSoxMDAwICsgdCg2KSo2MDAwMCArIHQoNSkqMzYwMDAwMAorICAgICAgICAgICAgY250ID0gY250KzEKKyAgICAgICAgZW5kIGRvCisgICAgICBlbmQgc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuaCBiL3JjMS90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MGE1YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+IAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZiBiL3JjMS90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmggYi9yYzEvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE4NjZlCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX25lc3RlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBpZiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrd2FpdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGNyaXRpY2FsICovCitpbnQgY3Jvc3N0ZXN0X29tcF9jcml0aWNhbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyZWxsZWwgbnVtX3RocmVhZHMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfY29sbGFwc2UoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9uZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF93dGljayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGRlZmF1bHQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgKi8KK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbG9jayAqLworaW50IHRlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGJhcnJpZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9pbl9wYXJhbGxlbCAqLworaW50IGNyb3NzdGVzdF9vbXBfaW5fcGFyYWxsZWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmx1c2ggKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2ZsdXNoKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvb21wdHMtYy5jb25mIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvb21wdHMtZi5jb25mIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1YWYzMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9vbXB0cy5jb25mIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0cy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzMTM1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+Cis8bG9nZmlsZT5vbXB0cy5sb2c8L2xvZ2ZpbGU+Cis8c2luZ2xldGVzdHRpbWVvdXQ+MTIwPC9zaW5nbGV0ZXN0dGltZW91dD4KKzxkaXNwbGF5ZXJyb3JzPjE8L2Rpc3BsYXllcnJvcnM+Cis8ZGlzcGxheXdhcm5pbmdzPjA8L2Rpc3BsYXl3YXJuaW5ncz4KKzxlbnZzZXR0aHJlYWRzY29tbWFuZD5PTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7PC9lbnZzZXR0aHJlYWRzY29tbWFuZD4KKzxyZXN1bHRzZmlsZT5yZXN1bHRzLnR4dDwvcmVzdWx0c2ZpbGU+Cis8bnVtdGhyZWFkcz44PC9udW10aHJlYWRzPgorPC9nbG9iYWxjb25maWc+CisKKzxsYW5ndWFnZXM+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmM8L2xhbmd1YWdlbmFtZT4KKzxkaXI+YzwvZGlyPgorPGZpbGVleHRlbnNpb24+YzwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2MucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmZvcnRyYW48L2xhbmd1YWdlbmFtZT4KKzxkaXI+Zm9ydHJhbjwvZGlyPgorPGZpbGVleHRlbnNpb24+ZjwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8L2xhbmd1YWdlcz4KKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyMTJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwKQEAgLTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIG9tcHRzX21ha2VIZWFkZXIgW29wdGlvbnNdIC1mPU5BTUUgLXQ9RElSCisjCisjIENyZWF0cyB0aGUgaGVhZGVyZmlsZSBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIHRoZSB0ZW1wbGF0ZWZpbGVzIAorIyB3aXRjaCBhcmUgaW4gdGhlIGRlZmF1bHQvZXhwbGljaXRlbHkgc3BlY2lmaWVkIGRpciBhbmQgdGhlIHNldHRpbmdzIGluIHRoZQorIyBnaXZlbiBjb25maWcgZmlsZS4gCisjIAorIyBBVFRFTlRJT046CisjCUF0IHRoZSBtb21lbnQgaXQgYnVpbHRzIG9ubHkgYSBjLWhlYWRlcmZpbGUhCisjCisjIC1mPUZJTEVOQU1FOiBVc2luZyBmaWxlIEZJTEVOQU1FIGFzIGNvbmZpZ2ZpbGUKKyMgLXQ9RElSOglEaXJlY3RvcnkgaG9sZGluZyB0aGUgdGVtcGxhdGUgZmlsZXMKKyMgCisjIG9wdGlvbnMKKyMgLWk9RklMRU5BTUU6IEluY2x1ZGUgb3RoZXIgSGVhZGVyZmlsZS4gVGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIG11c3QgYmUgc3BlY2lmaWVkCisjIAlhZnRlciBzZXR0aW5nIHRoaXMgb3B0aW9uLiAoTm90IGltcGxlbWVudGVkIHlldC4pCisjIC1vPUZJTEVOQU1FOiBvdXRwdXRmaWxlbmFtZSAoZGVmYXVsdCBpcyAib21wX3Rlc3RzdWl0ZS5oIikKKworJGhlYWRlcmZpbGUgPSAiXC9cKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSBcKlwvXG5cblwvXCogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG9tcHRzX21ha2VIZWFkZXIucGwgc2NyaXB0IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3Bpb25zOlwgKlwvXG5cL1wqICI7CitpZihAQVJHViA+IDApCit7CisJZm9yZWFjaCAkb3B0IChAQVJHVikKKwl7CisJCSRoZWFkZXJmaWxlIC49ICIkb3B0ICI7CisJfQorfQorZWxzZQoreworCSRoZWFkZXJmaWxlIC49ICJObyBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIjsKK30KKyRoZWFkZXJmaWxlIC49IiBcKlwvXG5cblxuIjsKKwordXNlIEdldG9wdDo6TG9uZzsKK0dldE9wdGlvbnMoIi1vPXMiID0+IFwkb3V0ZmlsZSwgIi1mPXMiID0+XCRjb25maWdmaWxlLCAiLXQ9cyIgPT4gXCR0ZW1wbGF0ZWRpciwgIi1pPXMiID0+IFwkaW5jbHVkZSk7CisKKyRpbmNsdWRlID0gIiI7CisKKworIyBHZXR0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIG5lY2Vzc2FyeSBvcHRpb25zOgoraWYoISRjb25maWdmaWxlKSB7CQorCWRpZSAiQ29uZmlnIGZpbGUgbmFtZSBpcyBtaXNzaW5nLiI7Cit9CQorZWxzZSB7CisgICAgaWYgKCEoLWUgJGNvbmZpZ2ZpbGUpKSB7CisJICBkaWUgIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdmaWxlLiI7CisJfQorfQorCQoraWYoISR0ZW1wbGF0ZWRpcikgewkKKwlkaWUgIkRpcmVjdG9yeW5hbWUgaXMgbWlzc2luZy4iOworfQkKKworaWYoISRvdXRmaWxlKXsKKwkkb3V0ZmlsZSA9ICJvbXBfdGVzdHN1aXRlLmgiOwkjIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGhlYWRlcmZpbGUKK30KKworCisKKyNAaW5jbHVkZWZpbGVzOwkJCQkJIyBsaXN0IGhvbGluZyBleHRyYSBpbmNsdWRlZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIAorCisKKyMgZ2VuZXJhdGluZyB0aGUgaGVhZCBvZiB0aGUgaW5jbHVkZWd1YXJkOgorJGhlYWRlcmZpbGUgLj0gIlwjaWZuZGVmIE9NUF9URVNUU1VJVEVfSFxuXCNkZWZpbmUgT01QX1RFU1RTVUlURV9IXG5cbiI7CisKKyMgaW5zZXJ0aW5nIGdlbmVyYWwgc2V0dGluZ3Mgb3V0IG9mIHRoZSBjb25maWdmaWxlOgorb3BlbihPTVBUU19DT05GLCRjb25maWdmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJGNvbmZpZ2ZpbGUuIjsKK3doaWxlKDxPTVBUU19DT05GPil7CisJJGhlYWRlcmZpbGUgLj0gJF87Cit9CitjbG9zZShPTVBUU19DT05GKTsKKworIyBzZWFyY2hpbmcgdGhlIHRlc3RzOgorb3BlbmRpciBURU1QTEFURURJUiwgJHRlbXBsYXRlZGlyIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gZGlyICR0ZW1wbGF0ZWRpci4iOworQHRlbXBsYXRlcyA9IGdyZXAgLyguKilcLmMvLCByZWFkZGlyIFRFTVBMQVRFRElSOworY2xvc2VkaXIgVEVNUExBVEVESVI7CisKKyMgaW5zZXJ0aW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnM6Citmb3JlYWNoICR0ZW1wbGF0ZSAoQHRlbXBsYXRlcyl7CisJJHNvdXJjZSA9ICIiOworCW9wZW4oVEVNUExBVEUsJHRlbXBsYXRlZGlyLiIvIi4kdGVtcGxhdGUpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VmaWxlOiAiLiR0ZW1wbGF0ZWRpci4iLyIuJHRlbXBsYXRlOworCXdoaWxlKDxURU1QTEFURT4peworCQkkc291cmNlIC49ICRfOworCX0KKwljbG9zZShURU1QTEFURSk7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+KC4qKVw8XC9vbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+LzsKKwkkZnVuY3Rpb25uYW1lID0gJDEuIihGSUxFIFwqIGxvZ2ZpbGUpOyI7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6ZGlyZWN0aXZlXD4oLiopXDxcL29tcHRzXDpkaXJlY3RpdmVcPi87CisJJGRpcmVjdGl2ZSA9ICQxOworCSRoZWFkZXJmaWxlIC49ICJpbnQgdGVzdF8iLiRmdW5jdGlvbm5hbWUuIiAgLyogVGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7CisJJGhlYWRlcmZpbGUgLj0gImludCBjcm9zc3Rlc3RfIi4kZnVuY3Rpb25uYW1lLiIgIC8qIENyb3NzdGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7Cit9CisKKyMgaW5zZXJ0aW5nIHRoZSBlbmQgb2YgdGhlIGluY2x1ZGVndWFyZDoKKyRoZWFkZXJmaWxlIC49ICJcbiNlbmRpZiI7CisKKyMgY3JhZXRpbmcgdGhlIGhlYWRlcmZpbGU6CitvcGVuKE9VVEZJTEUsIj4iLiRvdXRmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGhhZWRhZXJmaWxlICgkb3V0ZmlsZSkiOworcHJpbnQgT1VURklMRSAkaGVhZGVyZmlsZS4iXG4iOworY2xvc2UoT1VURklMRSk7CisKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThkNzI3MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCkBAIC0wLDAgKzEsMTY3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIFNPVVJDRUZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLXRlc3Q6IAltYWtlIHRlc3QKKyMgLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIHJlZ2lvbnMgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisjIC1sYW5nPUxBTkcJcHJlcHJvY2Vzc2luZyBmb3IgbGFuZ3VhZ2UgTEFORywgd2hlcmUgTEFORyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6CisjCQljLCBmb3J0cmFuCisjIC1vPUZJTEVOQU1FCW91dHB1dGZpbGUgKG9ubHkgd2hlbiBvbmUgdGVtcGxhdGVmaWxlIGlzIHNwZWNpZmllZCkKKworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygiLXRlc3QiID0+IFwkdGVzdCwiLWNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICItbz1zIiA9PiBcJG91dHB1dGZpbGUsICItb3JwaGFuIiA9PiBcJG9ycGhhbiwgIi1mISIsICItbGFuZz1zIiA9PiBcJGxhbmd1YWdlKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KK2ZvcmVhY2ggJGZpbGUoQEFSR1YpCit7CisJaWYoLWUgJGZpbGUpeyBwdXNoKEBzb3VyY2VmaWxlcywkZmlsZSk7IH0KKwllbHNlIHsgcHJpbnQgIkVycm9yOiBVbmtub3duIE9wdGlvbiAkZmlsZVxuIjsgfQorfQorCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKK2lmKEBzb3VyY2VmaWxlcyA9PSAwKXtkaWUgIk5vIGZpbGVzIHRvIHBhcnNlIGFyZSBzcGVjaWZpZWQhIjt9CitpZigkb3V0cHV0ZmlsZSAmJiAoQHNvdXJjZWZpbGVzICE9IDEgfHwgKCR0ZXN0ICYmICRjcm9zc3Rlc3QpICkgKXtkaWUgIlRoZXJlIHdlcmUgbXVsdGlwbGUgZmlsZXMgZm9yIG9uZSBvdXRwdXRmaWxlcyBzcGVjaWZpZWQhIjt9IAorIyBwcmVwYXJhdGlvbnMgZm9wciBvcnBoYW4gdGVzdHMKK2lmKCRvcnBoYW4peyAkb3JwaGFucHJlZml4ID0gIm9ycGhhbmVkIjsgfQorZWxzZSB7ICRvcnBoYW5wcmVmaXggPSAiIjsgfQorIyBwcmVwYXJhdGlvbnMgZm9yIHRlc3QgLyBjcm9zc3Rlc3QKK2lmKCR0ZXN0KXtwdXNoKEB0ZXN0dHlwZXMsInRlc3QiKTsgCisjICVjaGVja3NbJ3Rlc3QnXT0iY2hlY2siOworfQoraWYoJGNyb3NzdGVzdCl7cHVzaChAdGVzdHR5cGVzLCJjdGVzdCIpOworIyAlY2hlY2tzWydjcm9zc3Rlc3QnXT0iY3Jvc3NjaGVjayI7Cit9CisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBsYW5ndWFnZQoraWYoJGxhbmd1YWdlIGVxImMiKSB7ICRleHRlbnNpb24gPSAiYyI7fQorZWxzaWYoJGxhbmd1YWdlIGVxICJmb3J0cmFuIiBvciAkbGFuZ3VhZ2UgZXEgImYiKSB7ICRsYW5ndWFnZSA9ICJmIjsgJGV4dGVuc2lvbiA9ICJmIjt9CitlbHNlIHsgZGllICJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgbGFuZ3VhZ2UhIjsgfQorICAgIAorCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIHRlc3RzIGludG8gQHNvdXJjZXMKK2ZvcmVhY2ggJHNyY2ZpbGUgKEBzb3VyY2VmaWxlcykKK3sKKwkjIFJlYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgc291cmNlZmlsZQlpbnRvICRzcmMKKwlvcGVuKFRFU1QsJHNyY2ZpbGUpIG9yIHByaW50ICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7CisJd2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorCWNsb3NlKFRFU1QpOworCSMgQWRkaW5nIHRoZSBjb250ZW50ICRzcmMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBAc291cmNlcworCXB1c2goQHNvdXJjZXMsJHNyYyk7Cit9CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitpZigkbGFuZ3VhZ2UgZXEgImMiKSB7ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5jIjsgfQorZWxzaWYoJGxhbmd1YWdlIGVxICJmIikgeyAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuZiI7IH0gCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7CisJJG1haW5wcm9jIC49ICRfOworfQorCitmb3JlYWNoICR0ZXN0dHlwZSAoQHRlc3R0eXBlcykKK3sKKyAgZm9yZWFjaCAkc3JjKEBzb3VyY2VzKQorICB7CisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKKyAgICAoJGRlc2NyaXB0aW9uKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworICAgICgkZGlyZWN0aXZlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworICAgICgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCisgICAgb3BlbihPVVRGSUxFLCI+Ii4kbGFuZ3VhZ2UuJG9ycGhhbnByZWZpeC4kdGVzdHR5cGUuIl8iLiRmdW5jdGlvbm5hbWUuIi4iLiRleHRlbnNpb24pIG9yIGRpZSgiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiKTsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKKyAgICAoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorICAgICRjb2RlIC49ICRtYWlucHJvYzsKKyAgICAKKyMgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisjIHRoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdAorICAgICgkcGFybXMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjpwYXJtcycsJGNvZGUpOworICAgICgkcGFybXMpID0gbGVhdmVfc2luZ2xlX3NwYWNlKCRwYXJtcyk7CisjIHRvIHJlbW92ZSBwYXJhbWV0ZXJzIHRhZyBiZXR3ZWVuICdvbXB0czpvcnBoYW46cGFybXMnIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCRjb2RlKTsKKyAgICAKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgorICAgIGlmKCRvcnBoYW4pCisgICAgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgICBmb3JlYWNoICRfIChAZGVmcykKKyAgICAgIHsKKwkjcHJpbnQgJF87CisJaWYobm90IC9eWyBdKiQvZ3MpIHsgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IH0gCisJI3ByaW50ICJPS1xuIi4kb3JwaHZhcnNkZWY7IAorICAgICAgfQorICAgICAgaWYoJGxhbmd1YWdlIGVxICJmIikKKyAgICAgIHsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBzdWJyb3V0aW5lczoKKwkkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucygiJHRlc3R0eXBlXyIsICRjb2RlKTsKKyMgUmVwbGFjZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKwkoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyAgICAjdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1ldG4gYW5kIGFkZCBwYXJhbWV0ZXJzCisgICAgCisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgICB9CisgICAgICBlbHNpZigkbGFuZ3VhZ2UgZXEgImMiKQorICAgICAgeworIyBHZW5lcmF0ZSBwcmVkZWNsYXJhdGlvbnMgZm9yIG9ycGFobiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jc2RlZnMgPSBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgUmVwbGE6ZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisJKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kb3JwaHZhcnNkZWYgLiAkb3JwaGZ1bmNzZGVmcyAuICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXByaW50ICJBbiBlcnJvciBvY2N1cnJlZCEiOworICAgICAgfQorICAgIH0KKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiA8b21wdHM6b3JwaGFuOnBhcm1zPiB0YWdzLCBhZGRlZCBieSBqb29uCisgICAgKCRjb2RlKT0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCRjb2RlKTsKKyAgICAKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworCisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworICAgIAorICAgIGlmKCR0ZXN0dHlwZSBlcSAidGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisgICAgZWxzaWYoJHRlc3R0eXBlIGVxICJjdGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIi4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIiwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKKyAgICBwcmludCBPVVRGSUxFICRjb2RlOworICAgIGNsb3NlKE9VVEZJTEUpOworICB9Cit9CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbSBiL3JjMS90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2VkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpAQCAtMCwwICsxLDI4MCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgZnVuY3Rpb25zLnBtCisjIFRoaXMgcGFja2FnZSBjb250YWlucyBhIHNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIG9wZW5NUCBUZXN0dWl0ZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWJyb3V0aW5lcyB0byBleHRyYWN0LCBtb2RpZnkgb3IgZGVsZXRlIHRhZ3MgZnJvbSB0aGUgdGVtcGxhdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTElTVCBnZXRfdGFnX3ZhbHVlcyggJHRhZ25hbWUsICRzdHJpbmcgKQorIyBzdWJydXRpbmUgdG8gZ2V0IHRoZSB0ZXh0IGVuY2xvZGVkIGJ5IGEgdGFnLgorIyBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBpbm5lciB0ZXh0cyBvZiB0aGUgZm91bmQgdGFncworc3ViIGdldF90YWdfdmFsdWVzCit7CisJbXkgKCAkdGFnbmFtZSwgJHN0cmluZyApOworCSggJHRhZ25hbWUsICRzdHJpbmcgKSA9IEBfOworCW15IChAdG1wLEB0bXAyKTsKKyAgIAlAdG1wID0gc3BsaXQoL1w8JHRhZ25hbWVcPi8sJHN0cmluZyk7IAorCWZvcmVhY2ggJF8oQHRtcCl7CisJCXB1c2goQHRtcDIsc3BsaXQoL1w8XC8kdGFnbmFtZVw+LykpOworCX0KKwlteShAcmVzdWx0LCRpKTsKKwkkaT0xOyAjIGNvdXRlciB0byBnZXQgb25seSBldmVyeSBzZWNvbmQgaXRlbQorCWZvcmVhY2ggJF8oQHRtcDIpeworCQlpZigkaSUyIGVxIDApeworCQkJcHVzaChAcmVzdWx0LCRfKTsKKwkJfQorCQkkaSsrOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIHJlcGxhY2VfdGFncyggJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byByZXBsYWNlIHRhZ3MgYnkgYSByZXBsYWNlc3RyaW5nLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIHJlcGxhY2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBzdHJpbmdsaXN0LCBAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMkcmVwbGFjZXN0cmluZyNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCBlbmxhcmdlX3RhZ3MoICR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIHJlcGxhY2UgdGFncyBieSB0aGUgdGFncyBhZGRlZCBieSBhIHN0cmluZyBiZWZvcmUgYW5kIGFmdGVyLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIGVubGFyZ2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAc3RyaW5nbGlzdCxAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQHN0cmluZ2xpc3QpID0gQF87CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jJGJlZm9yZSQxJGFmdGVyI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIGRlbGV0ZV90YWdzKCAkdGFnbmFtZSwgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gZGVsZXRlIHRhZ3MgaW4gYSBzdHJpbmcuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2xlYXJlZCBzdHJpbmdzCitzdWIgZGVsZXRlX3RhZ3MKK3sKKwlteSgkdGFnbmFtZSxAc3RyaW5nbGlzdCk7CisJKCR0YWduYW1lLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlteShAcmVzdWx0KTsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3Vicm91dGluZXMgZm9yIGdlbmVyYXRpbmcgIm9ycGFobmVkIiB0ZXN0cyAJCQkJCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTQ0FMQVIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSAKKyMgb3JwaGFuIHJlZ2lvbnMuCitzdWIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucworeworCW15ICgkY29kZSxAZGVmcyk7CisJKCRjb2RlKSA9IEBfOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlZmluaXRpb25zIG9mIHRoZSBvcnBoYW4gZnVuY3Rpb25zICovXG4iOworCisJJGkgPSAxOworCWZvcmVhY2ggKEBkZWZzKSB7CisJCSRmdW5jdGlvbnNyYyAuPSAiXG52b2lkIG9ycGgkaVxfJGZ1bmN0aW9ubmFtZSAoRklMRSAqIGxvZ0ZpbGUpIHsiOworCQkkZnVuY3Rpb25zcmMgLj0gJF87CisJCSRmdW5jdGlvbnNyYyAuPSAiXG59XG4iOworCQkkaSsrOworCX0KKwkkZnVuY3Rpb25zcmMgLj0gIi8qIEVuZCBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWZpbml0aW9ucyAqL1xuIjsKKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIFNDQUxBUiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgdGhlIAorIyBvcnBoYW4gcmVnaW9ucy4KK3N1YiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zCit7CisJbXkgKCRwcmVmaXgsJGNvZGUsQGRlZnMsJG9ycGhhbl9wYXJtcyk7CisJKCRwcmVmaXgsJGNvZGUsJG9ycGhhbl9wYXJtcykgPSBAXzsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKworICAgICN0byByZW1vdmUgc3BhY2UgYW5kIHB1dCBhIHNpbmdsZSBzcGFjZQorICAgIGlmKCRvcnBoYW5fcGFybXMgbmUgIiIpCisgICAgeworICAgICAgJG9ycGhhbl9wYXJtcyA9fiBzL1sgXHRdKy8vc2c7CisgICAgICAkb3JwaGFuX3Bhcm1zID1+IHMvWyBcdF0rXG4vXG4vc2c7CisgICAgfQorICAgIAorCSgkb3JwaGFudmFyc2RlZnMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAoQHZhcnNkZWYpIHsKKwkJaWYgKG5vdCAvW14gXG4kXSovKXsgJG9ycGhhbnZhcnNkZWZzID0gam9pbigiXG4iLCRvcnBoYW52YXJzZGVmLCRfKTt9CisJfQorCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbiEgRGVmaW5pdGlvbnMgb2YgdGhlIG9ycGhhbiBmdW5jdGlvbnNcbiI7CisJJGkgPSAxOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkkZnVuY3Rpb25zcmMgLj0gIlxuICAgICAgU1VCUk9VVElORSBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRvcnBoYW5fcGFybXNcKVxuICAgICAgIjsKKyAgICAgICAgJGZ1bmN0aW9uc3JjIC49ICJJTkNMVURFIFwib21wX3Rlc3RzdWl0ZS5mXCJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAkb3JwaGFudmFyc2RlZnMuIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRfOworCQkkZnVuY3Rpb25zcmMgLj0gIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICIgICAgICBFTkQgU1VCUk9VVElORVxuISBFbmQgb2YgZGVmaW5pdGlvblxuXG4iOworCQkkaSsrOworCX0KKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIExJU1Qgb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucyggJHByZWZpeCwgQGNvZGUgKQorIyByZXBsYWNlcyBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzIGluIEMvQysrLgorc3ViIG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMKK3sKKwlteSAoJGNvZGUsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJGNvZGUpID0gQF87CisJJGkgPSAxOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKyAgICAgICAgd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpIHsKKyAgICAgICAgICAgIHMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jb3JwaCRpXF8kZnVuY3Rpb25uYW1lIChsb2dGaWxlKTsjczsKKyAgICAgICAgICAgICRpKys7CisgICAgICAgIH0KKwlyZXR1cm4gJGNvZGU7Cit9CisKKyMgTElTVCBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCBAY29kZSApCisjIHJlcGxhY2VzIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHMgaW4gZm9ydHJhbgorc3ViIG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMKK3sKKwlteSAoICRwcmVmaXgsIEBjb2RlLCAkbXlfcGFybXMsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJHByZWZpeCwgKCRjb2RlKSwgJG15X3Bhcm1zKSA9IEBfOworCSRpID0gMTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJZm9yZWFjaCAkXygoJGNvZGUpKQorCXsKKwkJd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpCisJCXsKKwkJCXMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jICAgICAgQ0FMTCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRteV9wYXJtc1wpOyNzOworCQkJJGkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKCRjb2RlKTsKK30KKworIyBTQ0FMQVIgb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCAKKyMgaW4gdGhlIG9ycGhhbiByZWdpb25zLiBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIGdlbmVyYXRlZCB1c2luZyAKKyMgdGhlICRwcmVmaXggYXMgcHJlZml4IGZvciB0aGUgZnVuY3Rpb25uYW1lLgorc3ViIG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucworeworCW15ICgkcHJlZml4LCAkY29kZSk7CisJKCRwcmVmaXgsICRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQgKTsKKwkKKwkjIGNyZWF0aW5nIGRlY2xhcmF0aW9ucyBmb3IgbGF0ZXIgdXNlZCBmdW5jdGlvbnMKKwkkcmVzdWx0IC49ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBjb2RlIGZvciB0aGUgb3JwaGFuIHJlZ2lvbnMgKi9cbiNpbmNsdWRlIDxzdGRpby5oPlxuIjsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKwlteSAoJGZ1bmN0aW9ubmFtZSwkaSk7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCSRpID0gMTsKKwlmb3JlYWNoICRfKEBkZWZzKSB7CisJCSRyZXN1bHQgLj0gIlxudm9pZCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWUgKCBGSUxFICogbG9nRmlsZSApOyI7CisJCSRpKys7CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworIyBTQ0FMQVIgbWFrZV9nbG9iYWxfdmFyc19kZWZpbml0aW9uKCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgdmFycyBuZWVkZWQgdG8KKyMgYmUgZGVjbGFyZWQgZ2xvYmFsIGZvciB0aGUgb3JwaGFuIHJlZ2lvbi4KK3N1YiBtYWtlX2dsb2JhbF92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG9ycGhhbiByZWdpb24uICovXG4iOworCQorCSMgZ2V0IGFsbCB0YWdzIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zCisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJIyBjdXR0aW5nIHRoZSBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHRhZyBieSB0aGUgJzsnIGFzIGN1dHRtYXJrCisJCUB0bXAgPSBzcGxpdCgvOy8sJF8pOworCQlmb3JlYWNoICRfKEB0bXApCisJCXsKKwkJCSMgcmVwbGFjaW5nIG5ld2xpbmVzIGFuZCBkb3VibGUgc3BhY2VzCisJCQlzL1xuLy9nczsKKwkJCXMvICAvL2dzOworCQkJIyBwdXQgdGhlIG5ldyBkZWNsYXJhdGlvbiBhdCB0aGUgZW5kIG9mICRyZXN1bHQKKwkJCWlmKCRfIG5lICIiKXsgJHJlc3VsdCAuPSAiXG4gJF87IjsgfQorCQl9CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgU0NBTEFSIGV4dGVybl92YXJzX2RlZmluaXRpb24oICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSB2YXJzIG5lZWRlZCB0bworIyBiZSBkZWNsYXJlZCBleHRlcm4gZm9yIHRoZSBvcnBoYW4gcmVnaW9uLgorc3ViIGV4dGVybl92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBleHRlcm4gdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgZXh0ZXJuIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcnBoYW4gcmVnaW9uLiAqL1xuIjsKKwkjICRyZXN1bHQgLj0gIlxuI2luY2x1ZGUgPHN0ZGlvLmg+XG4jaW5jbHVkZSA8b21wLmg+XG4iOworCSRyZXN1bHQgLj0gIlxuZXh0ZXJuIEZJTEUgKiBsb2dGaWxlOyI7CisJCisJIyBnZXQgYWxsIHRhZ3MgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkjIGN1dHRpbmcgdGhlIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgdGFnIGJ5IHRoZSAnOycgYXMgY3V0dG1hcmsKKwkJQHRtcCA9IHNwbGl0KC87LywkXyk7CisJCWZvcmVhY2ggJF8oQHRtcCkKKwkJeworCQkJIyByZXBsYWNpbmcgbmV3bGluZXMgYW5kIGRvdWJsZSBzcGFjZXMKKwkJCXMvXG4vL2dzOworCQkJcy8gIC8vZ3M7CisJCQkjIGN1dHRpbmcgb2ZmIGRlZmluaXRpb25zCisJCQlAdG1wMiA9IHNwbGl0KCI9IiwkXyk7CisJCQkjIHB1dCB0aGUgbmV3IGRlY2xhcmF0aW9uIGF0IHRoZSBlbmQgb2YgJHJlc3VsdAorCQkJJHJlc3VsdCAuPSAiXG5leHRlcm4gJHRtcDJbMF07IjsKKwkJfQorCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uLiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCitzdWIgbGVhdmVfc2luZ2xlX3NwYWNlCit7CisgIG15KCRzdHIpOworICAoJHN0cik9QF87CisgIGlmKCRzdHIgbmUgIiIpCisgIHsKKyAgICAkc3RyID1+IHMvXlsgXHRdKy8gLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rXG4kL1xuLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYyBiL3JjMS90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMwNTJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiYmluL2MvPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPi5sb2ciOwkvKiBuYW1lIG9mIHRoZSBsb2dmaWxlICovCisKKworCS8qIE9wZW4gYSBuZXcgTG9nZmlsZSBvciBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZS4gKi8KKwlsb2dGaWxlID0gZm9wZW4obG9nRmlsZU5hbWUsIncrIik7CisKKwlwcmludGYoIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgJXMgIyMjIyMjXG4iLCBPTVBUU19WRVJTSU9OICk7CisJcHJpbnRmKCIjIyBSZXBldGl0aW9uczogJTNkICAgICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLFJFUEVUSVRJT05TKTsKKwlwcmludGYoIiMjIExvb3AgQ291bnQgOiAlNmQgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsTE9PUENPVU5UKTsKKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCXByaW50ZigiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPlxuXG4iKTsKKworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAlcyAjIyMjIyNcbiIsIE9NUFRTX1ZFUlNJT04gKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIFJlcGV0aXRpb25zOiAlM2QgICAgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsUkVQRVRJVElPTlMpOworCWZwcmludGYobG9nRmlsZSwiIyMgTG9vcCBDb3VudCA6ICU2ZCAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixMT09QQ09VTlQpOworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7CisJZnByaW50Zihsb2dGaWxlLCJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+XG5cbiIpOworCisJZm9yICggaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiXG5cbiVkLiBydW4gb2YgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiBvdXQgb2YgJWRcblxuIixpKzEsUkVQRVRJVElPTlMpOworCQlpZig8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+KGxvZ0ZpbGUpKXsKKwkJCWZwcmludGYobG9nRmlsZSwiVGVzdCBzdWNjZXNzZnVsLlxuIik7CisJCQlzdWNjZXNzKys7CisJCX0KKwkJZWxzZSB7CisJCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yOiBUZXN0IGZhaWxlZC5cbiIpOworCQkJcHJpbnRmKCJFcnJvcjogVGVzdCBmYWlsZWQuXG4iKTsKKwkJCWZhaWxlZCsrOworCQl9CisJfQorCisgICAgaWYoZmFpbGVkPT0wKXsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuXG4iKTsKKwkJcHJpbnRmKCJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLlxuIik7CisJCXJlc3VsdD0wOworCX0KKwllbHNleworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuICVpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXByaW50ZigiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuXG4laSB0ZXN0KHMpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXJlc3VsdCA9IChpbnQpICgoKGRvdWJsZSkgZmFpbGVkIC8gKGRvdWJsZSkgUkVQRVRJVElPTlMgKSAqIDEwMCApOworCX0KKwlwcmludGYgKCJSZXN1bHQ6ICVpXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYgYi9yYzEvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmY2FiNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZgpAQCAtMCwwICsxLDY4IEBACishVGhpcyBpcyB0aGUgbWFpbiBkcml2ZXIgdG8gaW52b2tlIGRpZmZlcmVudCB0ZXN0IGZ1bmN0aW9ucworICAgICAgUFJPR1JBTSA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+X21haW4KKyAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgIElOVEVHRVIgZmFpbGVkLCBzdWNjZXNzICFOdW1iZXIgb2YgZmFpbGVkL3N1Y2NlZWRlZCB0ZXN0cworICAgICAgSU5URUdFUiBudW1fdGVzdHMsY3Jvc3NjaGVja2VkLCBjcm9zc2ZhaWxlZCwgagorICAgICAgSU5URUdFUiB0ZW1wLHRlbXAxCisgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgIElOVEVHRVIgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPgorCisKKyAgICAgIENIQVJBQ1RFUio1MCBsb2dmaWxlbmFtZSAhUG9pbnRlciB0byBsb2dmaWxlCisgICAgICBJTlRFR0VSIHJlc3VsdCAKKworICAgICAgbnVtX3Rlc3RzID0gMAorICAgICAgY3Jvc3NjaGVja2VkID0gMAorICAgICAgY3Jvc3NmYWlsZWQgPSAwCisgICAgICByZXN1bHQgPSAxCisgICAgICBmYWlsZWQgPSAwCisKKyAgICAgICFPcGVuIGEgbmV3IGxvZ2ZpbGUgb3Igb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUuCisgICAgICBsb2dmaWxlbmFtZSA9ICJiaW4vZm9ydHJhbi88dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+LmxvZyIKKyEgICAgICBXUklURSAoKiwqKSAiRW50ZXIgbG9nRmlsZW5hbWU6IiAKKyEgICAgICBSRUFEICAoKiwqKSBsb2dmaWxlbmFtZQorCisgICAgICBPUEVOICgxLCBGSUxFID0gbG9nZmlsZW5hbWUpCisgCisgICAgICBXUklURSAoKiwqKSAiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAzLjBhICMjIyMjIyIKKyAgICAgIFdSSVRFICgqLCopICIjIyBSZXBldGl0aW9uczoiLCBOIAorICAgICAgV1JJVEUgKCosKikgIiMjIExvb3AgQ291bnQgOiIsIExPT1BDT1VOVAorICAgICAgV1JJVEUgKCosKikgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisgICAgICBXUklURSAoKiwqKQorCisgICAgICBjcm9zc2ZhaWxlZD0wCisgICAgICByZXN1bHQ9MQorICAgICAgV1JJVEUgKDEsKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgV1JJVEUgKDEsKikgIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT4iCisgICAgICBXUklURSAoMSwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBXUklURSAoMSwqKSAKKyAgICAgIFdSSVRFICgxLCopICJ0ZXN0bmFtZTogPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiIKKyAgICAgIFdSSVRFICgxLCopICIoQ3Jvc3N0ZXN0cyBzaG91bGQgZmFpbCkiCisgICAgICBXUklURSAoMSwqKQorICAgICAgCisgICAgICBETyBqID0gMSwgTgorICAgICAgICB0ZW1wID0gIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJRiAodGVtcCAuRVEuIDEpIFRIRU4KKyAgICAgICAgICBXUklURSAoMSwqKSAgaiwgIi4gdGVzdCBzdWNjZXNzZnVsLiIKKyAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyArIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogIixqLCAiLiB0ZXN0IGZhaWxlZC4iCisgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICBFTkRJRgorICAgICAgRU5EIERPCisKKyAgICAgIAorICAgICAgSUYgKGZhaWxlZCAuRVEuIDApIFRIRU4KKyAgICAgICAgV1JJVEUgKDEsKikgIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy4iCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgV1JJVEUgKCosKikgIlJlc3VsdDoiLHJlc3VsdAorICAgICAgRUxTRQorICAgICAgICBXUklURSAoMSwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICByZXN1bHQgPSBmYWlsZWQgKiAxMDAgLyBOCisgICAgICAgIFdSSVRFICgqLCopICJSZXN1bHQ6IixyZXN1bHQKKyAgICAgIEVORElGCisgICAgICBDQUxMIEVYSVQgKHJlc3VsdCkKKyAgICAgIEVORCBQUk9HUkFNIApkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsIGIvcmMxL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0NzIzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL3J1bnRlc3QucGwKQEAgLTAsMCArMSw1OTIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBydW50ZXN0IFtvcHRpb25zXSBGSUxFTkFNRQorIworIyBSZWFkIHRoZSBmaWxlIEZJTEVOQU1FLiBFYWNoIGxpbmUgY29udGFpbnMgYSB0ZXN0LgorIyBDb252ZXJ0IHRlbXBsYXRlIHRvIHRlc3QgYW5kIGNyb3NzdGVzdC4KKyMgSWYgcG9zc2lsYmxlIGdlbmVyYXRlIG9ycGhhbmVkIHRlc3R2ZXJzaW9ucywgdG9vLgorIyBVc2UgbWFrZSB0byBjb21waWxlIHRoZSB0ZXN0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBydW50ZXN0c2NyaXB0IGl0c2VsZjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgbmFtZSBvZiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHRlc3RzdWl0ZToKKyRjb25maWdfZmlsZSAgICA9ICJvbXB0cy5jb25mIjsKKyRsb2dmaWxlICAgICAgICA9ICJvbXB0cy5sb2ciOyAjIG92ZXJ3cml0ZWFibGUgYnkgdmFsdWUgaW4gY29uZmlnIGZpbGUKKyRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCA9ICdPTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7JzsKKyRkZWJ1Z19tb2RlICAgICA9IDA7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBZnRlciB0aGlzIGxpbmUgdGhlIHNjcmlwdCBwYXJ0IGJlZ2lucyEgRG8gbm90IGVkaXQgYW5pdGhpbmcgYmVsb3cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBOYW1lc3BhY2VzOgordXNlIEdldG9wdDo6TG9uZzsKKyN1c2UgVW5peDo6UElEOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgRXh0cmFjdGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJoZWxwIiwKKyAgICAgICJsaXN0bGFuZ3VhZ2VzIiwKKyAgICAgICJsYW5nPXMiLAorICAgICAgImxpc3QiLAorICAgICAgInRlc3RpbmZvPXMiLAorICAgICAgIm51bXRocmVhZHM9aSIsCisgICAgICAidGVzdD1zIiwKKyAgICAgICJjb21waWxlISIsCisgICAgICAicnVuISIsCisgICAgICAib3JwaGFuISIsCisgICAgICAicmVzdWx0ZmlsZT1zIgorICAgICAgKTsKKworIyBHZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpbm8gb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlOgoraWYoISAtZSAkY29uZmlnX2ZpbGUpeyBlcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdfZmlsZVxuIiwgMSk7fQorb3BlbiAoQ09ORklHLCAiPCRjb25maWdfZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gY29uZmlnIGZpbGUgJGNvbmZpZ19maWxlXG4iLCAyKTsKK3doaWxlICg8Q09ORklHPikgeyAkY29uZmlnIC49ICRfOyB9CitjbG9zZSAoQ09ORklHKTsKKworKCRsb2dmaWxlKSA9IGdldF90YWdfdmFsdWVzICgibG9nZmlsZSIsICRjb25maWcpOworKCR0aW1lb3V0KSA9IGdldF90YWdfdmFsdWVzICgic2luZ2xldGVzdHRpbWVvdXQiLCAkY29uZmlnKTsKKygkZGlzcGxheV9lcnJvcnMpID0gZ2V0X3RhZ192YWx1ZXMoImRpc3BsYXllcnJvcnMiLCAkY29uZmlnKTsKKygkZGlzcGxheV93YXJuaW5ncykgPSBnZXRfdGFnX3ZhbHVlcyAoImRpc3BsYXl3YXJuaW5ncyIsICRjb25maWcpOworKCRudW10aHJlYWRzKSA9IGdldF90YWdfdmFsdWVzICgibnVtdGhyZWFkcyIsICRjb25maWcpOworKCRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCkgPSBnZXRfdGFnX3ZhbHVlcygiZW52c2V0dGhyZWFkc2NvbW1hbmQiLCRjb25maWcpOworJGVudl9zZXRfdGhyZWFkc19jb21tYW5kID1+IHMvXCVuLyRudW10aHJlYWRzL2c7CitAbGFuZ3VhZ2VzID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZSIsICRjb25maWcpOworCitpZiAoIWRlZmluZWQoJG9wdF9jb21waWxlKSkgeyRvcHRfY29tcGlsZSA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfcnVuKSkgICAgIHskb3B0X3J1biA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfb3JwaGFuKSkgeyRvcHRfb3JwaGFuID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9yZXN1bHRzZmlsZSkpIHsoJG9wdF9yZXN1bHRzZmlsZSkgPSBnZXRfdGFnX3ZhbHVlcygicmVzdWx0c2ZpbGUiLCAkY29uZmlnKTt9CitpZiAoIGRlZmluZWQoJG9wdF9udW10aHJlYWRzKSAmJiAoJG9wdF9udW10aHJlYWRzID4gMCkpIHskbnVtdGhyZWFkcyA9ICRvcHRfbnVtdGhyZWFkczt9CitpZiAoJGRlYnVnX21vZGUpIHsKK3ByaW50IDw8RU9GOworVGVzdHN1aXRlIGNvbmZpZ3VyYXRpb246CitMb2dmaWxlID0gJGxvZ2ZpbGUKK1RpbWVvdXQgPSAkdGltZW91dCBzZWNvbmRzCitMYW5ndWFnZTogICRvcHRfbGFuZworRGlzcGxheSBlcnJvcnM6ICAgJGRpc3BsYXlfZXJyb3JzCitEaXNwbGF5IHdhcm5pbmdzOiAkZGlzcGxheV93YXJuaW5ncworUmVzdWx0c2ZpbGU6ICAgICAgJG9wdF9yZXN1bHRzZmlsZQorTnVtdGhyZWFkczogJG51bXRocmVhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU9GCit9CisKKyRudW1fY29uc3RydWNzICAgID0gMDsKKyRudW1fdGVzdHMgICAgICAgID0gMDsKKyRudW1fZmFpbGVkX3Rlc3RzID0gMDsKKyRudW1fc3VjY2Vzc2Z1bF90ZXN0cyAgID0gMDsKKyRudW1fdmVyaWZpZWRfdGVzdHMgICAgID0gMDsKKyRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gMDsKKworJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0ID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQgPSAwOworCiskbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQgPSAwOworCitpZiAoJG9wdF9oZWxwKSAgICAgICAgIHsgcHJpbnRfaGVscF90ZXh0ICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfbGlzdGxhbmd1YWdlcyl7IHByaW50X2F2YWlsX2xhbmdzICgpOyBleGl0IDA7IH0KK2lmICgkb3B0X2xpc3QpICAgICB7IHByaW50X2F2YWlsX3Rlc3RzICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfdGVzdGluZm8pIHsgcHJpbnRfdGVzdGluZm8gKCk7ICAgICAgZXhpdCAwOyB9CitpZiAoJG9wdF90ZXN0KSAgICAgeyB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOyBleGl0IDA7IH0KK2lmICgtZSAkQVJHVlswXSkgICB7IHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfdGVzdGxpc3QoJEFSR1ZbMF0pOyBwcmludF9yZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeSgpOyBleGl0IDA7fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRnVuY3Rpb24gd2hpY2ggcHJpbnRzIHRoZSByZXN1bHRzIGZpbGUKK3N1YiBwcmludF9yZXN1bHRzCit7CisgICAgc3lzdGVtKCJlY2hvOyBjYXQgJG9wdF9yZXN1bHRzZmlsZTsgZWNobzsiKTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBwcmludHMgYSBzdW1tYXJ5IG9mIGFsbCB0ZXN0CitzdWIgcmVzdWx0X3N1bW1hcnkKK3sKKyAgICBteSAkbnVtX2RpcmVjdGl2ZXMgPSBAdGVzdF9yZXN1bHRzOworCisgICAgcHJpbnQgPDxFT0Y7CisKK1N1bW1hcnk6CitTIE51bWJlciBvZiB0ZXN0ZWQgT3BlbiBNUCBjb25zdHJ1Y3RzOiAkbnVtX2NvbnN0cnVjdHMKK1MgTnVtYmVyIG9mIHVzZWQgdGVzdHM6ICAgICAgICAgICAgICAgICRudW1fdGVzdHMKK1MgTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fZmFpbGVkX3Rlc3RzCitTIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMKK1MgKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fdmVyaWZpZWRfdGVzdHMKKworTm9ybWFsIHRlc3RzOgorTiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkCitOICsgZnJvbSB0aGlzIGZhaWwgY29tcGlsYXRpb246ICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yCitOICsgZnJvbSB0aGlzIHRpbWVkIG91dCAgICAgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQKK04gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwKK04gKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkCisKK09ycGhhbmVkIHRlc3RzOgorTyBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQKK08gKyBmcm9tIHRoaXMgZmFpbCBjb21waWxhdGlvbjogICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcgorTyArIGZyb20gdGhpcyB0aW1lZCBvdXQgICAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQKK08gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bAorTyArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZAorRU9GCisKK30KKworIyBGdW5jdGlvbiB0aGF0IGV4ZWN1dGVzdCB0aGUgdGVzdHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBsaXN0CitzdWIgZXhlY3V0ZV90ZXN0bGlzdAoreworICAgIG15ICgkZmlsZW5hbWUpID0gQF87CisgICAgIyBvcGVuaW5nIHRlc3RsaXN0CisgICAgb3BlbihURVNUUywkZmlsZW5hbWUpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gICRmaWxlbmFtZVxuIiwgMSk7CitURVNUOiB3aGlsZSAoPFRFU1RTPikgeworICAgICAgICBpZiAoL15ccyojLykge25leHQgVEVTVDt9CisgICAgICAgIGlmICgvXlxzKiQvKSB7bmV4dCBURVNUO30KKyAgICAgICAgJG9wdF90ZXN0ID0gJF87CisgICAgICAgIGNob21wICgkb3B0X3Rlc3QpOworICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOworICAgIH0KKyMgcHJpbnQgRHVtcGVyKEB0ZXN0X3Jlc3VsdHMpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZCBidXQgdGFrZXMgY2FyZSBvZiB0aGUgZ2xvYmFsIHRpbWVvdXQKKyMgSWYgY29tbWFuZCBkaWQgbm90IGZpbmlzaCBpbmJldHdlZW4gcmV0dXJucyAnLScgb3RoZXJ3aXNlIHRoZSBleGl0IHN0YXR1cyBvZgorIyB0aGUgc3lzdGVtIGNvbW1hbmQKK3N1YiB0aW1lZF9zeXNfY29tbWFuZAoreworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAnLSc7CisKKyMgc2V0IHVwIHRoZSB0aW1lb3V0IGZvciB0aGUgY29tbWFuZAorICAgIGV2YWwgeworICAgICAgICBsb2NhbCAkU0lHe0FMUk19ID0gc3ViIHtkaWUgImFsYXJtXG4ifTsKKyAgICAgICAgYWxhcm0gJHRpbWVvdXQ7CisgICAgICAgIGxvZ19tZXNzYWdlX2FkZCAoIlN0YXJ0aW5nIGNvbW1hbmQgXCIkY29tbWFuZFwiIik7CisgICAgICAgICRleGl0X3N0YXR1cyA9IHN5c3RlbSAoJGNvbW1hbmQpOworICAgICAgICBhbGFybSAwOworICAgIH07CisjIGNoZWNrIGlmIGNvbW1hbmQgZmluaXNoZWQgZHVyaW5nIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRAIGVxICJhbGFybVxuIikgeworIyB0ZXN0IHRpbWVkIG91dAorIwkJbXkgJHBpZCA9IFVuaXg6OlBJRC0+bmV3KCk7CisjCQkkcGlkLT5nZXRfcGlkb2YoJGNvbW1hbmQsIDEpOworIwkJJHBpZC0+a2lsbCgpOworICAgICAgICBpZiAoJGRlYnVnX21vZGUpIHsKKwkgICAgbG9nX21lc3NhZ2VfYWRkICgiQ29tbWFuZCBcIiRjb21tYW5kXCIgcmVhY2hlZCBtYXggZXhlY3V0aW9uIHRpbWUuXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlRPIjsKKyAgICB9CisjIHRlc3QgZmluaXNoZWQKKyAgICByZXR1cm4gJGV4aXRfc3RhdHVzOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcnVucyB0aGUgdGVzdHMgZ2l2ZW4gYXMgYSBhcnJheSBjb250YWluaW5nIHRoZSB0ZXN0bmFtZXMKKyMgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwZXJjZW50IHZhbHVlcyBvZiB0aGUgcGFzc2VkIHRlc3RzIGFuZCB0aGUKKyMgc3VjY2Vzc2Z1bCBjcm9zc3Rlc3RzLgorc3ViIHJ1bl90ZXN0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBteSAkYmluX25hbWUsICRjYmluX25hbWU7CisgICAgbXkgJGNtZCwgJGV4aXRfc3RhdHVzLCAkZmFpbGVkOworICAgIG15ICRyZXN1bHR0ZXN0LCAkcmVzdWx0Y3Rlc3Q7CisKKyMgcGF0aCB0byB0ZXN0IGFuZCBjcm9zc3Rlc3QgZWl0aGVyIGluIG5vcm1hbCBvciBpbiBvcnBoYW5lZCB2ZXJzaW9uCisgICAgaWYgKCRvcnBoYW4pIHsKKyAgICAgICAgJGJpbl9uYW1lICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY2Jpbl9uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0gZWxzZSB7CisgICAgICAgICRiaW5fbmFtZSAgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjYmluX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0KKyMgQ2hlY2sgaWYgZXhlY3V0YWJsZXMgZXhpc3QKKyAgICBpZiAoISAtZSAkYmluX25hbWUpIHsKKyAgICAgICAgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGV4ZWN1dGFibGUgXCIkYmluX25hbWVcIi4iKTsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJy0nLCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMgcnVuIHRoZSB0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kYmluX25hbWUgPiRiaW5fbmFtZS5vdXQiOworICAgIHByaW50ICJSdW5uaW5nIHRlc3Qgd2l0aCAkbnVtdGhyZWFkcyB0aHJlYWRzIC4iOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiB0ZXN0IGZpbmlzaGVkIHdpdGhpbiBtYXggZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJGV4aXRfc3RhdHVzIGVxICdUTycpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICh0aW1lb3V0KVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJ1RPJywgJ2Nyb3NzdGVzdCcgPT4gJy0nKQorICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGVjayBpZiBhbGwgdGVzdHMgd2VyZSBzdWNjZXNzZnVsCisgICAgJGZhaWxlZCA9ICRleGl0X3N0YXR1cyA+PiA4OworICAgIGlmICgkZmFpbGVkIDwgMCBvciAkZmFpbGVkID4gMTAwKSB7ICRmYWlsZWQgPSAxMDA7IH0KKyAgICAkcmVzdWx0dGVzdCA9IDEwMCAtICRmYWlsZWQ7CisgICAgaWYgKCRyZXN1bHR0ZXN0IGVxIDEwMCkgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzIC4uLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICRmYWlsZWRcJSBvZiB0aGUgdGVzdHNcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRvIGNyb3NzdGVzdAorIyBjaGVjayBpZiBleGVjdXRhYmxlIGV4aXN0CisgICAgaWYgKCEgLWUgJGNiaW5fbmFtZSkgeworICAgICAgICB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgZXhlY3V0YWJsZSBcIiRjYmluX25hbWVcIi4iKTsKKyAgICAgICAgcHJpbnQgIi4uLiBub3QgdmVyaWZpZWQgKGNyb3NzdGVzdCBtaXNzaW5nKVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyBydW4gY3Jvc3N0ZXN0CisjIFRlc3Qgd2FzIHN1Y2Nlc3NmdWwsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHJ1biB0aGUgY3Jvc3N0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kY2Jpbl9uYW1lID4gJGNiaW5fbmFtZS5vdXQiOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiBjcm9zc3Rlc3QgZmluaXNoZWQgd2l0aGluIG1heCBleGVjdXRpb24gdGltZQorICAgIGlmICgkZXhpdF9zdGF0dXMgZXEgJ1RPJykgeworICAgICAgICBwcmludCAiLi4uIG5vdCB2ZXJpZmllZCAodGltZW91dClcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHQsICdjcm9zc3Rlc3QnID0+ICdUTycpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IGlmIGNyb3NzdGVzdHMgZmFpbGVkIGFzIGV4cGVjdGVkCisgICAgJHJlc3VsdGN0ZXN0ID0gJGV4aXRfc3RhdHVzID4+IDg7CisgICAgaWYgKCRyZXN1bHRjdGVzdCA+IDApIHsKKyAgICAgICAgcHJpbnQgIi4uLiBhbmQgdmVyaWZpZWQgd2l0aCAkcmVzdWx0Y3Rlc3RcJSBjZXJ0YWludHlcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLiBidXQgbWlnaHQgYmUgbHVja3lcbiI7CisgICAgfQorICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAkcmVzdWx0Y3Rlc3QpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHRlc3QgYmluYXJpZXMgb3V0IG9mIHRoZSBzb3VyY2Vjb2RlCitzdWIgY29tcGlsZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIHByaW50ICJDb21waWxpbmcgc291cmVzIC4uLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkZXhlY19uYW1lICAgICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgID0gc3lzdGVtICgibWFrZSAkZXhlY19uYW1lID4gJGV4ZWNfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIm1ha2UgJGNyb3NzZXhlX25hbWUgPiAkY3Jvc3NleGVfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRleGVjX25hbWUgICAgID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRyZXN1bHR0ZXN0ICA9IHN5c3RlbSAoIm1ha2UgJGV4ZWNfbmFtZSA+ICRleGVjX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCJtYWtlICRjcm9zc2V4ZV9uYW1lID4gJGNyb3NzZXhlX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgIH0KKyAgICBpZiAoJHJlc3VsdHRlc3QpIHsgdGVzdF9lcnJvciAoIkNvbXBpbGF0aW9uIG9mIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiQ29tcGlsYXRpb24gb2YgdGhlIGNyb3NzdGVzdCBmYWlsZWQuIik7IH0KKworICAgIGlmICgkcmVzdWx0dGVzdCBvciAkcmVzdWx0Y3Rlc3QpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkXG4iOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggcHJlcGFyZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZToKK3N1YiBpbml0X2RpcmVjdG9yeV9zdHJ1Y3R1cmUKK3sKKyAgICBteSAoJGxhbmd1YWdlKSA9IEBfOworICAgIGlmICgtZSAiYmluIiAmJiAtZCAiYmluIikgeyB3YXJuaW5nICgiT2xkIGJpbmFyeSBkaXJlY3RvcnkgZGV0ZWN0ZWQhIik7fQorICAgIGVsc2UgeyBzeXN0ZW0gKCJta2RpciBiaW4iKTsgfQorICAgIGlmICgtZSAiYmluLyRsYW5ndWFnZSIgJiYgLWQgImJpbi8kbGFuZ3VhZ2UiKSB7CisgICAgICAgIHdhcm5pbmcgKCJPbGQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgbGFuZ3VhZ2UgJGxhbmd1YWdlIGZvdW5kLiIpO30KKyAgICBlbHNlIHsgc3lzdGVtICgibWtkaXIgYmluLyRsYW5ndWFnZSIpOyB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHNvdXJjZWNvZGUgZm9yIHRoZSBnaXZlbiB0ZXN0CitzdWIgbWFrZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIG15ICR0ZW1wbGF0ZV9maWxlOworICAgIG15ICRzcmNfbmFtZTsKKworICAgICR0ZW1wbGF0ZV9maWxlID0gIiRkaXIvJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgIGlmICghLWUgJHRlbXBsYXRlX2ZpbGUpIHsgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciBcIiR0ZXN0bmFtZVwiIik7IH0KKworICAgIHByaW50ICJHZW5lcmF0aW5nIHNvdXJjZXMgLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICB9CisgICAgaWYgKCRyZXN1bHR0ZXN0KSB7IHRlc3RfZXJyb3IgKCJHZW5lcmF0aW9uIG9mIHNvdXJjZWNvZGUgZm9yIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiR2VuZXJhdGlvbiBvZiBzb3VyY2Vjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0IGZhaWxlZC4iKTsgfQorCisgICAgaWYgKCRyZXN1bHR0ZXN0IG9yICRyZXN1bHRjdGVzdCkgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWRcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworIyBGdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB0ZXN0IGlzIG9ycGhhbmFibGUKK3N1YiB0ZXN0X2lzX29ycGhhbmFibGUKK3sKKyAgICBteSAoJHRlc3RuYW1lKSA9IEBfOworICAgIG15ICRzcmM7CisgICAgbXkgJGZpbGUgPSAiJGRpci8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgaWYoISAtZSAkZmlsZSl7IHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZXN0IGZpbGUgJGZpbGVcbiIpO30KKyAgICBvcGVuIChURVNULCAiPCRmaWxlIikgb3IgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBvcGVuIHRlc3QgZmlsZSAkZmlsZVxuIik7CisgICAgd2hpbGUgKDxURVNUPikgeyAkc3JjIC49ICRfOyB9CisgICAgY2xvc2UgKFRFU1QpOworICAgIHJldHVybiAkc3JjID1+L29tcHRzOm9ycGhhbi87Cit9CisKK3N1YiB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkCit7CisgICAgb3BlbiAoUkVTVUxUUywgIj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworICAgICRyZXN1bHRsaW5lID0gc3ByaW50ZiAiJS0yNXMgJS1zXG4iLCAiI1Rlc3RlZCBEaXJlY3RpdmUiLCAiXHR0XHRjdFx0b3RcdG9jdCI7CisgICAgcHJpbnQgUkVTVUxUUyAkcmVzdWx0bGluZTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBhZGRzIGEgcmVzdWx0IHRvIHRoZSBsaXN0IG9mIHJlc3VsdHMKK3N1YiBhZGRfcmVzdWx0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJHJlc3VsdCkgPSBAXzsKKyMJcHJpbnQgRHVtcGVyKEB7JHJlc3VsdH0pOworCisgICAgJG51bV9jb25zdHJ1Y3RzKys7CisKKyAgICBvcGVuIChSRVNVTFRTLCAiPj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworCisgICAgaWYgKCR7JHJlc3VsdH1bMF1bMF0pIHsKKwkJJG51bV90ZXN0cyArKzt9CisKKwlpZiAoJG9wdF9jb21waWxlIGFuZCAkeyRyZXN1bHR9WzBdWzFdIGVxIDApIHsKKwkJJHskcmVzdWx0fVswXVsyXXt0ZXN0fSAgICAgID0gJ2NlJzsKKwkJJHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9ID0gJy0nOworCQkkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJICAgICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCX0KKworICAgIGlmICgkb3B0X3J1biBhbmQgJHskcmVzdWx0fVswXVsyXSBhbmQgJHskcmVzdWx0fVswXVsyXXt0ZXN0fSBuZSAnY2UnKSB7CisgICAgICAgIGlmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9ID09IDEwMCkgeworICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCsrOworICAgICAgICAgICAgaWYgKCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fSA9PSAxMDApeworCQkJCSRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0Kys7CisJCQkkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lID0gIiR7JHJlc3VsdH1bMF1bMl17dGVzdH1cdCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fVx0IjsKKworICAgIGlmICgkeyRyZXN1bHR9WzFdWzBdKSB7CisJCSRudW1fdGVzdHMgKys7fQorICAgIGVsc2UgeyAkcmVzdWx0bGluZSAuPSAiLVx0LVxuIjsgfQorCisgICAgaWYgKCRvcHRfY29tcGlsZSBhbmQgJHskcmVzdWx0fVsxXVsxXSBlcSAwKSB7CisJCSR7JHJlc3VsdH1bMV1bMl17dGVzdH0gICAgICA9ICdjZSc7CisJCSR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fSA9ICctJzsKKwkJJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisJfQorCisgICAgaWYgKCRvcHRfcnVuIGFuZCAkeyRyZXN1bHR9WzFdWzJdIGFuZCAkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IG5lICdjZScpIHsKKyAgICAgICAgaWYgKCR7JHJlc3VsdH1bMV1bMl17dGVzdH0gPT0gMTAwKSB7CisgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwrKzsKKyAgICAgICAgICAgIGlmICgkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH0gPT0gMTAwKXsKKwkJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQrKzsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisgICAgICAgIH0gZWxzZSB7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lIC49ICIkeyRyZXN1bHR9WzFdWzJde3Rlc3R9XHQkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH1cbiI7CisKKyAgICAkbnVtX2ZhaWxlZF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCArICRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkOworCSRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvciArICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcjsKKwkkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsICsgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsOworCSRudW1fdmVyaWZpZWRfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCArICRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQ7CisKKyAgICAkcmVzdWx0bGluZTIgPSBzcHJpbnRmICIlLTI1cyAlLXMiLCAiJHRlc3RuYW1lIiwgIlx0JHJlc3VsdGxpbmUiOworICAgIHByaW50IFJFU1VMVFMgJHJlc3VsdGxpbmUyOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIGEgc2luZ2xlIHRlc3QKK3N1YiBleGVjdXRlX3NpbmdsZV90ZXN0Cit7CisgICAgbXkgQHJlc3VsdDsKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzICgkb3B0X2xhbmcpOworICAgIGluaXRfZGlyZWN0b3J5X3N0cnVjdHVyZSAoJG9wdF9sYW5nKTsKKyAgICBsb2dfbWVzc2FnZV9hZGQgKCJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOiIpOworICAgIHByaW50ICJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOlxuIjsKKyMgdGVzdHMgaW4gbm9ybWFsIG1vZGUKKyAgICBpZiAoJG9wdF9jb21waWxlKXsgJHJlc3VsdFswXVswXSA9IG1ha2Vfc3JjICgkb3B0X3Rlc3QsIDApOworICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzBdWzFdID0gY29tcGlsZV9zcmMgKCRvcHRfdGVzdCwgMCk7fQorICAgIGlmICgkb3B0X3J1biAmJiAkcmVzdWx0WzBdWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFswXVsyXSA9IHtydW5fdGVzdCAoJG9wdF90ZXN0LCAwKX07fQorIyB0ZXN0cyBpbiBvcnBoYW5lZCBtb2RlCisgICAgaWYgKCRvcHRfb3JwaGFuICYmIHRlc3RfaXNfb3JwaGFuYWJsZSgkb3B0X3Rlc3QpKXsKKyAgICAgICAgbG9nX21lc3NhZ2VfYWRkICgiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIiBpbiBvcnBoYW5lZCBtb2RlOiIpOworICAgICAgICBwcmludCAiKyBvcnBoYW5lZCBtb2RlOlxuIjsKKyAgICAgICAgaWYgKCRvcHRfY29tcGlsZSkgeyAkcmVzdWx0WzFdWzBdID0gbWFrZV9zcmMgKCRvcHRfdGVzdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsxXVsxXSA9IGNvbXBpbGVfc3JjICgkb3B0X3Rlc3QsIDEpO30KKyAgICAgICAgaWYgKCRvcHRfcnVuICYmICRyZXN1bHRbMV1bMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMV1bMl0gPSB7cnVuX3Rlc3QgKCRvcHRfdGVzdCwgMSl9O30KKyAgICB9CisgICAgYWRkX3Jlc3VsdCgkb3B0X3Rlc3QsIFxAcmVzdWx0KTsKK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBpbmZvIGFib3V0IGEgZ2l2ZW4gdGVzdAorc3ViIHByaW50X3Rlc3RpbmZvCit7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncygkb3B0X2xhbmcpOworICAgIG15ICRkb2MgPSAiIjsKKyAgICBteSAkZmlsZSA9ICRkaXIuIi8iLiRvcHRfdGVzdGluZm8uIi4iLiRleHRlbnNpb247CisgICAgaWYgKCEgLWUgJGZpbGUpIHtlcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciB0ZXN0ICRvcHRfdGVzdGluZm8iLCA1KTt9CisgICAgb3BlbiAoVEVTVCwiPCRmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSBmaWxlIFwiJGZpbGVcIiBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvIiwgNik7CisgICAgd2hpbGUgKDxURVNUPikgeyRkb2MgLj0gJF87fQorICAgIGNsb3NlIChURVNUKTsKKworICAgIChteSAkb21wX3ZlcnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czpvbXB2ZXJzaW9uIiwgJGRvYyk7CisgICAgKG15ICRkZXBlbmRlbmNlcykgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOmRlcGVuZGVuY2VzIiwgJGRvYyk7CisgICAgKG15ICRkZXNjcmlwdGlvbikgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOnRlc3RkZXNjcmlwdGlvbiIsICRkb2MpOworICAgIG15ICRvcnBoYW5hYmxlID0gJ25vJzsKKyAgICBpZiAoJGRvYyA9fiAvb21wdHM6b3JwaGFuLykgeyRvcnBoYW5hYmxlID0gJ3llcyc7fQorICAgIHByaW50IDw8RU9GOworSW5mbyBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvOgorT3BlbiBNUCBzdGFuZGFyZDogJG9tcF92ZXJzaW9uCitPcnBoYW5lZCBtb2RlOiAkb3JwaGFuYWJsZQorRGVwZW5kZW5jaWVzOiAgJGRlcGVuZGVuY2VzCitEZXNjcmlwdGlvbjogICAkZGVzY3JpcHRpb24KK0VPRgorfQorCisjIEZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNldHRpbmdzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBpbml0X2xhbmd1YWdlX3NldHRpbmdzCit7CisgICAgbXkgKCRsYW5ndWFnZSkgPSBAXzsKKyAgICBmb3JlYWNoIG15ICRsYW5nIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgIChteSAkbmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlbmFtZSIsICRsYW5nKTsKKyAgICAgICAgaWYgKCRuYW1lIGVxICRsYW5ndWFnZSkgeworICAgICAgICAgICAgKCRleHRlbnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJmaWxlZXh0ZW5zaW9uIiwgJGxhbmcpOworICAgICAgICAgICAgKCRkaXIpICAgICAgID0gZ2V0X3RhZ192YWx1ZXMgKCJkaXIiLCAkbGFuZyk7CisgICAgICAgICAgICAoJHRlbXBsYXRlcGFyc2VybmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoInRlbXBsYXRlcGFyc2VybmFtZSIsICRsYW5nKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBDaGVjayBpZiB3ZSBmb3VuZCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGluIHRoZSBjb25maWcgZmlsZQorICAgIGlmICghJGV4dGVuc2lvbiBhbmQgISRkaXIpIHsKKyAgICAgIGVycm9yICgiTGFuZ3VhZ2UgJGxhbmd1YWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIsIDMpOworICAgIH0KK30KKworCisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfdGVzdHMKK3sKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzKCRvcHRfbGFuZyk7CisgICAgbXkgQHRlc3RzOworICAgIG9wZW5kaXIoRElSLCIkZGlyIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBkaXJlY3RvcnkgJGRpciIsIDQpOworICAgIHdoaWxlKCRfID0gcmVhZGRpcihESVIpKSB7IGlmICgvXC4kZXh0ZW5zaW9uJC8pIHtzL1wuJGV4dGVuc2lvbi8vOyBwdXNoIChAdGVzdHMsICRfKTt9fQorICAgIGNsb3NlZGlyKERJUik7CisgICAgcHJpbnQgIkZvdW5kICIuKEB0ZXN0cykuIiB0ZXN0czpcbiIuICItIiB4IDMwIC4gIlxuIjsKKyAgICBmb3JlYWNoIChAdGVzdHMpIHsgcHJpbnQgJF8uIlxuIjt9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfbGFuZ3MKK3sKKyAgICBpZiAoQGxhbmd1YWdlcyA+IDApIHsKKyAgICAgICAgcHJpbnQgIkF2YWlsYWJsZSBsYW5ndWFnZXM6XG4iOworICAgICAgICBmb3JlYWNoIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgICAgICAobXkgJG5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZW5hbWUiLCAkXyk7CisgICAgICAgICAgICBwcmludCAiJG5hbWVcbiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiTm8gbGFuZ3VhZ2VzIGF2YWlsYWJsZVxuIjsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgdGhlIGVycm9yIG1lc3NhZ2UKK3N1YiBwcmludF9oZWxwX3RleHQKK3sKKyAgICBwcmludCA8PEVPRjsKK3J1bnRlc3QucGwgW29wdGlvbnNdIFtGSUxFXQorCitFeGVjdXRlcyB0aGUgdGVzdHMgbGlzdGVkIGluIEZJTEUuIEZJTEUgaGFzIHRvIGNvbnRhaW4gdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cywKK29uZSB0ZXN0IHBlciBsaW5lLiBMaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIGJlIGlnbm9yZWQuCitBIGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgLS1oZWxwIGFuZCAtLWxpc3RsYW5ndWFnZXMuCisKK09wdGlvbnM6CisgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXlzIHRoaXMgaGVscCBtZXNzYWdlCisgIC0tbGlzdGxhbmd1YWdlcyAgIGxpc3RzIGFsbCBhdmFpbGFibGUgbGFuZ3VhZ2VzCisgIC0tbGFuZz1zICAgICAgICAgIHNlbGVjdCBsYW5ndWFnZQorICAtLWxpc3QgICAgICAgICAgICBsaXN0IGF2YWlsYWJsZSB0ZXN0cyBmb3IgYSBsYW5ndWFnZQorICAtLXRlc3RpbmZvPU5BTUUgICBzaG93IGluZm8gZm9yIHRlc3QgTkFNRQorICAtLW51bXRocmVhZHM9TlVNICBzZXQgbnVtYmVyIG9mIHRocmVhZHMgKG92ZXJ3cml0ZXMgY29uZmlnIGZpbGUgc2V0dGluZ3MpCisgIC0tdGVzdD1OQU1FICAgICAgIGV4ZWN1dGUgc2luZ2xlIHRlc3QgTkFNRQorICAtLW5vY29tcGlsZSAgICAgICBkbyBub3QgY29tcGlsZSB0ZXN0cworICAtLW5vcnVuICAgICAgICAgICBkbyBub3QgcnVuIHRlc3RzCisgIC0tbm9vcnBoYW4gICAgICAgIHN3aXRjaCBvZiBvcnBoYW5lZCB0ZXN0cworICAtLXJlc3VsdGZpbGU9TkFNRSB1c2UgTkFNRSBhcyByZXN1bHRmaWxlIChvdmVyd3JpdGVzIGNvbmZpZyBmaWxlIHNldHRpbmdzKQorRU9GCit9CisKKyMgRnVuY3Rpb24gdGhhdCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYSBmYWlsZWQgdGVzdCAvIHBhcnQgb2YgYSB0ZXN0CitzdWIgdGVzdF9lcnJvcgoreworICAgbXkgKCRtZXNzYWdlKSA9IEBfOworICAgbG9nX21lc3NhZ2VfYWRkICgiRVJST1I6ICRtZXNzYWdlIik7CisgICBpZiAoJGRpc3BsYXlfZXJyb3JzIGVxIDEpIHsgcHJpbnQgU1RERVJSICJFUlJPUjogJG1lc3NhZ2VcbiI7IH0KK30KKworIyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gd2FybmluZyBtZXNzYWdlCitzdWIgd2FybmluZyB7CisgIG15ICgkbWVzc2FnZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X3dhcm5pbmdzIGVxIDEpIHsgcHJpbnQgIldhcm5pb25nOiAkbWVzc2FnZVxuIjsgfQorICBsb2dfbWVzc2FnZV9hZGQgKCJXYXJuaW5nOiAkbWVzc2FnZSIpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZQorc3ViIGVycm9yIHsKKyAgbXkgKCRtZXNzYWdlLCAkZXJyb3JfY29kZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X2Vycm9ycyBlcSAxKSB7IHByaW50IFNUREVSUiAiRVJST1I6ICRtZXNzYWdlXG4iOyB9CisgIGxvZ19tZXNzYWdlX2FkZCAoIkVSUk9SOiAkbWVzc2FnZSIpOworICBleGl0ICgkZXJyb3JfY29kZSk7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggYWRkcyBhbiBuZXcgZW50cnkgaW50byB0aGUgbG9nZmlsZSB0b2dldGhlciB3aXRoIGEgdGltZXN0YW1wCitzdWIgbG9nX21lc3NhZ2VfYWRkCit7CisgICAgKG15ICRtZXNzYWdlKSA9IEBfOworICAgICgkc2VjLCRtaW4sJGhvdXIsJG1kYXksJG1vbiwkeWVhciwkd2RheSwkeWRhdCwkaXNkc3QpID0gbG9jYWx0aW1lKCk7CisgICAgaWYobGVuZ3RoKCRob3VyKSA9PSAxKSB7ICRob3VyPSIwJGhvdXIiOyB9CisgICAgaWYobGVuZ3RoKCRtaW4pID09IDEpICB7ICRtaW49IjAkbWluIjsgICB9CisgICAgaWYobGVuZ3RoKCRzZWMpID09IDEpICB7ICRzZWM9IjAkc2VjIjsgICB9CisgICAgJG1vbj0kbW9uKzE7CisgICAgJHllYXI9JHllYXIrMTkwMDsKKyAgICBvcGVuIChMT0dGSUxFLCI+PiRsb2dmaWxlIikgb3IgZGllICJFUlJPUjogQ291bGQgbm90IGNyZWF0ZSAkbG9nZmlsZVxuIjsKKyAgICBwcmludCBMT0dGSUxFICIkbWRheS8kbW9uLyR5ZWFyICRob3VyLiRtaW4uJHNlYzogJG1lc3NhZ2VcbiI7Cit9CmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9jLnBsIGIvcmMxL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDZmMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApAQCAtMCwwICsxLDExNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBJTkZJTEUgT1VURklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtLXRlc3Q6IAltYWtlIHRlc3QKKyMgLS1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gCisjCisjIFJldHVybjoKKyMgICAgICAgU3VjY2VzOiAgICAgICAgICAgICAgICAgMAorIyAgICAgICBUZW1wbGF0ZSBub3QgZm91bmQgICAgICAtMQorIworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygidGVzdCIgPT4gXCR0ZXN0LCJjcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAib3JwaGFuISIgPT4gXCRvcnBoYW4pOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCitteSAkdGVtcGxhdGVmaWxlOworbXkgJHNvdXJjZWZpbGU7CitteSAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuYyI7IAorCiskdGVtcGxhdGVmaWxlID0gJEFSR1ZbMF07Ciskb3V0ZmlsZSA9ICRBUkdWWzFdOworCitpZiAoIS1lICR0ZW1wbGF0ZWZpbGUpIHsKKyAgICBwcmludCAiVGVtYXBsdGUgZmlsZSBub3QgZm91bmQiOworICAgIGV4aXQgLTE7Cit9CisKKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cyAKK29wZW4oVEVTVCwkdGVtcGxhdGVmaWxlKSBvciBkaWUgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKK3doaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KK2Nsb3NlKFRFU1QpOworCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peyAkbWFpbnByb2MgLj0gJF87IH0KK2Nsb3NlIChNQUlOUFJPQyk7CisKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorbXkgKCRkZXNjcmlwdGlvbikgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworbXkgKCRkaXJlY3RpdmUpICAgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworbXkgKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCitvcGVuIChPVVRGSUxFLCI+JG91dGZpbGUiKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIjsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKK215ICgkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CiskY29kZSAuPSAkbWFpbnByb2M7CisKK215ICR0ZXN0cHJlZml4ID0gIiI7CisKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgoraWYgKCRvcnBoYW4pIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgZm9yZWFjaCAoQGRlZnMpIHsKKyAgICAgICAgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IAorICAgIH0KKyMgR2VuZXJhdGUgcHJlZGVjbGFyYXRpb25zIGZvciBvcnBhaG4gZnVuY3Rpb25zOgorICAgICRvcnBoZnVuY3NkZWZzID0gb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisgICAgJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoJGNvZGUpOworIyBSZXBsYTplIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisgICAgJGNvZGUgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCRjb2RlKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIiAuICRvcnBodmFyc2RlZiAuICRvcnBoZnVuY3NkZWZzIC4gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICR0ZXN0cHJlZml4IC49ICJvcnBoXyI7Cit9CisKKyMgUmVtb3ZlIHJlbWFpbmluZyBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorICAgICR0ZXN0cHJlZml4IC49ICJ0ZXN0XyI7Cit9CitlbHNpZigkY3Jvc3N0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICAkdGVzdHByZWZpeCAuPSAiY3Rlc3RfIjsKK30KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCR0ZXN0cHJlZml4LiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkdGVzdHByZWZpeCwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKK3ByaW50IE9VVEZJTEUgJGNvZGU7CitjbG9zZShPVVRGSUxFKTsKZGlmZiAtLWdpdCBhL3JjMS90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGwgYi9yYzEvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MGE0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCkBAIC0wLDAgKzEsMTE1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIElORklMRSBPVVRGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC0tdGVzdDogCW1ha2UgdGVzdAorIyAtLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC0tb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiAKKyMKKyMgUmV0dXJuOgorIyAgICAgICBTdWNjZXM6ICAgICAgICAgICAgICAgICAwCisjICAgICAgIFRlbXBsYXRlIG5vdCBmb3VuZCAgICAgIC0xCisjCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJ0ZXN0IiA9PiBcJHRlc3QsImNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICJvcnBoYW4hIiA9PiBcJG9ycGhhbik7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCisKK215ICR0ZW1wbGF0ZWZpbGU7CitteSAkc291cmNlZmlsZTsKK215ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5mIjsgCisKKyR0ZW1wbGF0ZWZpbGUgPSAkQVJHVlswXTsKKyRvdXRmaWxlID0gJEFSR1ZbMV07CisKK2lmICghLWUgJHRlbXBsYXRlZmlsZSkgeworICAgIHByaW50ICJUZW1hcGx0ZSBmaWxlIG5vdCBmb3VuZCI7CisgICAgZXhpdCAtMTsKK30KKworCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzIAorb3BlbihURVNULCR0ZW1wbGF0ZWZpbGUpIG9yIGRpZSAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOword2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvcmMxL3Rlc3RzdWl0ZS90ZXN0bGlzdC1jLnR4dCBiL3JjMS90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMS90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9yYzEvdGVzdHN1aXRlL3Rlc3RsaXN0LWYudHh0IGIvcmMxL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM4OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL3JjMS93d3cvUkVBRE1FLnR4dCBiL3JjMS93d3cvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNjYTdmCi0tLSAvZGV2L251bGwKKysrIGIvcmMxL3d3dy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTEyIEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLiAgCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZyAKKworaW4gdGhpcyBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgTWFrZWZpbGUgYXQgdGhlIHRvcC1sZXZlbCB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHdoYXQgaXQgbmVlZHMgdG8KK2J1aWxkIHRoZSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywgCit0eXBlOgorCittYWtlIGluZm8KKworWW91IGNhbiBjaGFuZ2UgdGhlIE1ha2VmaWxlJ3MgYmVoYXZpb3Igd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK29tcF9yb290OiAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0b3AtbGV2ZWwKKwkgICAgIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIG9mIHRoZSAKKwkgICAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisKK29tcF9vczogICAgICBPcGVyYXRpbmcgc3lzdGVtLiAgQnkgZGVmYXVsdCwgdGhlIGJ1aWxkIHdpbGwgYXR0ZW1wdCB0byAKKwkgICAgIGRldGVjdCB0aGlzLiBDdXJyZW50bHkgc3VwcG9ydHMgImxpbnV4IiwgIm1hY29zIiwgYW5kIAorCSAgICAgIndpbmRvd3MiLgorCithcmNoOiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IAorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIAorICAgICAgICAgICAgICAgICAiMzJlIiBmb3IgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICJtaWMiIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUKKwkgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQorCSAgICAgbmVjZXNzYXJ5IHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lCisJICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSAoYnV0IGFuIEludGVsKFIpIFhlb24gUGhpKFRNKQorCSAgICAgY29wcm9jZXNzb3IgY2FyZCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLgorCitjb21waWxlcjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIiAKKwkgICAgIG9yICJpY2wiIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Ygb21wX29zLiBBbHNvIHN1cHBvcnRzIAorCSAgICAgc29tZSB2ZXJzaW9ucyBvZiAiZ2NjIiogd2hlbiBvbXBfb3MgaXMgImxpbnV4Ii4gVGhlIHNlbGVjdGVkIAorCSAgICAgY29tcGlsZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgCisJICAgICBjb3JyZXNwb25kaW5nIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguIAorCSAgICAgU2VlICJTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zIiBiZWxvdyBmb3IgbW9yZSAKKwkgICAgIGluZm9ybWF0aW9uIG9uIGNvbXBpbGVyIHZlcnNpb25zLgorCittb2RlOiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4KKworVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3IgCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGdjYyBpbnN0ZWFkIG9mIGljYywgdHlwZToKKworbWFrZSBjb21waWxlcj1nY2MKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZSAKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIGdjYyB2ZXJzaW9uIDQuNi4yIGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIGNsYW5nIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBjbGFuZyBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkIAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiAgaWNjL2ljbCwgZ2NjLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvcmMxL3d3dy9SZWZlcmVuY2UucGRmIGIvcmMxL3d3dy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGY5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvd3d3L1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmMxL3d3dy9jb250ZW50LmNzcyBiL3JjMS93d3cvY29udGVudC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNmEzMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMS93d3cvY29udGVudC5jc3MKQEAgLTAsMCArMSwyNyBAQAoraHRtbCB7IG1hcmdpbjogMHB4OyB9IGJvZHkgeyBtYXJnaW46IDhweDsgfQorCitodG1sLCBib2R5IHsKKyAgcGFkZGluZzowcHg7CisgIGZvbnQtc2l6ZTpzbWFsbDsgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsIEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IGNvbG9yOiAjMjIyOworICBsaW5lLWhlaWdodDoxLjU7Cit9CisKK2gxLCBoMiwgaDMsIHR0IHsgY29sb3I6ICMwMDAgfQorCitoMSB7IHBhZGRpbmctdG9wOjBweDsgbWFyZ2luLXRvcDowcHg7fQoraDIgeyBjb2xvcjojMzMzMzMzOyBwYWRkaW5nLXRvcDowLjVlbTsgfQoraDMgeyBwYWRkaW5nLXRvcDogMC41ZW07IG1hcmdpbi1ib3R0b206IC0wLjI1ZW07IGNvbG9yOiMyZDU4Yjd9CitsaSB7IHBhZGRpbmctYm90dG9tOiAwLjVlbTsgfQordWwgeyBwYWRkaW5nLWxlZnQ6MS41ZW07IH0KKworLyogU2xpZGVzICovCitJTUcuaW1nX3NsaWRlIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6IGF1dG8KK30KKworLml0ZW1UaXRsZSB7IGNvbG9yOiMyZDU4YjcgfQorCisvKiBUYWJsZXMgKi8KK3RyIHsgdmVydGljYWwtYWxpZ246dG9wIH0KZGlmZiAtLWdpdCBhL3JjMS93d3cvaW5kZXguaHRtbCBiL3JjMS93d3cvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBmNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMxL3d3dy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTkxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPCEtLSBNYXRlcmlhbCB1c2VkIGZyb206IEhUTUwgNC4wMSBzcGVjczogaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS8gLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgPHRpdGxlPk9wZW5NUCogOiBTdXBwb3J0IGZvciB0aGUgT3Blbk1QIGxhbmd1YWdlPC90aXRsZT4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb250ZW50LmNzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorPGRpdiBpZD0ibWVudSI+CisgIDxkaXY+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnLyI+TExWTSBIb21lPC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+T3Blbk1QIEluZm88L2xhYmVsPgorICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sIj5BYm91dDwvYT4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0ic3VibWVudSI+CisgICAgPGxhYmVsPlF1aWNrIExpbmtzPC9sYWJlbD4KKyAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMuY3MudWl1Yy5lZHUvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtZGV2Ij5vcGVubXAtZGV2PC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1jb21taXRzIj5vcGVubXAtY29tbWl0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuay8iPkJyb3dzZSBTVk48L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3ZpZXd2Yy9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFZpZXdWQzwvYT4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBpZD0iY29udGVudCI+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgPGgxPiJPcGVuTVAmcmVnOyIgU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvaDE+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKworICA8cD5UaGUgT3Blbk1QIHN1YnByb2plY3Qgb2YgTExWTSBpcyBpbnRlbmRlZCB0byBjb250YWluIGFsbCBvZiB0aGUKKyAgICAgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhbiBleGVjdXRpbmcgT3Blbk1QIHByb2dyYW0gdGhhdCBhcmUKKyAgICAgb3V0c2lkZSB0aGUgY29tcGlsZXIgaXRzZWxmLiBTdXBwb3J0IGZvciBPcGVuTVAgMy4xIGluIENsYW5nIGlzIGluIHRoZQorICAgICBwcm9jZXNzIG9mIGJlaW5nIHByb21vdGVkIGludG8gdGhlIENsYW5nIG1haW5saW5lLCBhbmQgY2FuIGJlCisgICAgIGZvdW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy1vbXAuZ2l0aHViLmlvLyI+T3Blbk1QL0NsYW5nPC9hPi4gCisgIDwvcD4KKworICA8cD5IZXJlIHlvdSBjYW4gZmluZCB0aGUgY29kZSBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBhZ2FpbnN0IHdoaWNoCisgICAgY29kZSBjb21waWxlZCBieSB0aGUgT3Blbk1QL0NsYW5nIGNvbXBpbGVyIG11c3QgYmUgbGlua2VkIGJlZm9yZSBpdAorICAgIGNhbiBydW4uIFRoaXMgY29kZSBpcyBhbHNvIGF2YWlsYWJsZQorICAgIGF0IDxhIGhyZWY9Imh0dHA6Ly9vcGVubXBydGwub3JnLyI+b3Blbm1wcnRsLm9yZzwvYT47IHdlIGludGVuZCB0bworICAgIGtlZXAgdGhlIGRpZmZlcmVudCBzaXRlcyBpbiBzeW5jLgorICA8L3A+CisKKyAgPHA+U3VwcG9ydCBmb3IgdGhlIHBhcnRzIG9mIHRoZSBPcGVuTVAgNC4wIGxhbmd1YWdlIHRoYXQgYXJlIG5vdAorICBhc3NvY2lhdGVkIHdpdGggdGhlICJ0YXJnZXQiIGNvbnN0cnVjdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgInJ1bnRpbWUiIGRpcmVjdG9yeS4gU3VwcG9ydCBmb3Igb2ZmbG9hZGluZyBjb21wdXRhdGlvbiB2aWEgdGhlCisgICJ0YXJnZXQiIGRpcmVjdGl2ZSBpcyBpbiB0aGUgc2VwYXJhdGUgIm9mZmxvYWQiIGRpcmVjdG9yeS4gVGhhdAorICBidWlsZHMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRyYW5zZmVycmluZyBjb2RlCisgIGFuZCBkYXRhIHRvIGFuIGF0dGFjaGVkIGNvbXB1dGF0aW9uYWwgZGV2aWNlLiBJbml0aWFsIHN1cHBvcnQgaGVyZQorICBpcyBmb3IgdGhlIEludGVsJnJlZyBYZW9uIFBoaSYjMDE1MyBjb3Byb2Nlc3NvciwgYnV0IHdvcmsgaXMKKyAgYmVnaW5uaW5nIHRvIHN1cHBvcnQgb3RoZXIgYXR0YWNoZWQgY29tcHV0aW5nIGRldmljZXMsIGFuZCB0aGUKKyAgZGVzaWduIGlzIGludGVuZGVkIHRvIGJlIGdlbmVyYWwuIFRoZSBSRUFETUUudHh0IGluIHRoZSAib2ZmbG9hZCIKKyAgZGlyZWN0b3J5IGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIG9mZmxvYWQgbGlicmFyeS4KKyAgPC9wPgorCisgIDxwPkFsbCBvZiB0aGUgY29kZSBoZXJlIGlzIDxhCisgICAgIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sI2xpY2Vuc2UiPmR1YWwgbGljZW5zZWQ8L2E+CisgICAgIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBhbmQgdGhlIFVJVUMgTGljZW5zZSAoYSBCU0QtbGlrZSBsaWNlbnNlKS4KKyAgICAgVGhlIExJQ0VOU0UudHh0IGZpbGUgYXQgdGhlIHRvcCBvZiB0aGUgT3Blbk1QIHByb2plY3QgY29udGFpbnMKKyAgICAgdGhlIGxpY2Vuc2UgdGV4dCBhbmQgYXNzb2NpYXRlZCBwYXRlbnQgZ3JhbnRzLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImdvYWxzIj5GZWF0dXJlcyBhbmQgR29hbHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgICA8dWw+CisgICAgICAgIDxsaT5Db3JyZWN0bmVzcyBhcyBkZWZpbmVkIGJ5IHRoZSAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDMuMS5wZGYiPk9wZW5NUAorICAgICAgICAgIDMuMSBzdGFuZGFyZCAoUERGKTwvYT4gbm93LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVA0LjAuMC5wZGYiPk9wZW5NUAorICAgICAgICAgIDQuMCBzdGFuZGFyZCAoUERGKTwvYT4gaW4gdGhlIGZ1dHVyZS48L2xpPgorICAgICAgICA8bGk+SGlnaCBwZXJmb3JtYW5jZS48L2xpPgorICAgICAgICA8bGk+QUJJIGNvbXBhdGliaWxpdHkgd2l0aCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmciPkdjYzwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtY29tcGlsZXJzIj5JbnRlbCdzCisgICAgICAgIGV4aXN0aW5nIE9wZW5NUCBjb21waWxlcnMuPC9hPiAKKyAgICAgICAgSG93ZXZlciwgd2UgYXJlIG5vdCBjdXJyZW50bHkgKE1heSAyMDE0KSBjb21wYXRpYmxlIHdpdGggZ2NjIDQuOSwgc2luY2UKKyAgICAgICAgaXQgaGFzIGludHJvZHVjZWQgbmV3IGVudHJ5cG9pbnRzIHdpdGggd2hpY2ggd2UgaGF2ZSBub3QgeWV0CisgICAgICAgIGNhdWdodCB1cC4uLiAKKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJ3aHkiPldoeSBoYXZlIHRoZSBydW50aW1lIGNvZGUgaGVyZT88L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+SXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSB0aGUgcnVudGltZSBzb3VyY2VzIGluIHRoZSBzYW1lIHBsYWNlCisgICAgKGFuZCB3aXRoIHRoZSBzYW1lIGxpY2Vuc2UpIGFzIHRoZSBjb21waWxlci4KKyAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPlBsYXRmb3JtIFN1cHBvcnQ8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+VGhlIE9wZW5NUCBydW50aW1lIGlzIGtub3duIHRvIHdvcmsgb24gMzIgYW5kIDY0IGJpdCBYODYKKyAgICBwcm9jZXNzb3JzIHdoZW4gY29tcGlsZWQgd2l0aCBlaXRoZXIgdGhlIEludGVsIGNvbXBpbGVyIG9yIGdjYywgYW5kIGFsc28gdGhlIEludGVsJnJlZzsmbmJzcDtYZW9uIFBoaSZ0cmFkZTsgcHJvZHVjdCBmYW1pbHksIHdoZW4gY29tcGlsZWQgd2l0aAorICAgIHRoZSBJbnRlbCBjb21waWxlci4KKyAgPC9wPgorICAKKyAgPHA+QSBmdWxsIE9TIGNvbXBhdGliaWxpdHkgbWF0cml4IGlzIGluIAorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+CisgIDwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJkaXItc3RydWN0dXJlIj5TdGF0dXM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgIDxwPlRoZSBydW50aW1lIGNhbiBiZSBidWlsdCB3aXRoIGdjYywgaWNjIG9yIGNsYW5nLiBIb3dldmVyLCBub3RlCisgICB0aGF0IGEgcnVudGltZSBidWlsdCB3aXRoIGNsYW5nIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aAorICAgT3Blbk1QIGNvZGUgY29tcGlsZWQgYnkgdGhlIG90aGVyIGNvbXBpbGVycywgc2luY2UgY2xhbmcgZG9lcyBub3Qgc3VwcG9ydAorICAgYSAxMjgtYml0IGZsb2F0IHR5cGUsIGFuZCBjYW5ub3QgdGhlcmVmb3JlIGdlbmVyYXRlIHRoZSBjb2RlIHVzZWQKKyAgIGZvciByZWR1Y3Rpb25zIG9mIHRoYXQgdHlwZSAod2hpY2ggbWF5IG9jY3VyIGluIHVzZXIgY29kZSBjb21waWxlZAorICAgYnkgdGhlIG90aGVyIGNvbXBpbGVycykuCisgICA8L3A+CisgCisgICA8cD5UaGUgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIGhhcyBraW5kbHkgY29udHJpYnV0ZWQgdGhlaXIgdGVzdAorICAgc3VpdGUgKGluIHRoZSAidGVzdHN1aXRlIiBkaXJlY3RvcnkpLiBJbnRlZ3JhdGlvbiBhbmQgdXNlIG9mIHRoaXMKKyAgIGZvciBhdXRvbWF0aWMgdGVzdGluZyByZW1haW4gdG8gYmUgZG9uZSwgYnV0IG5vdyB0aGUgY29kZSBpcyBoZXJlCisgICB3b3JrIGNhbiBiZWdpbi4KKyAgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5HZXQgaXQgYW5kIGdldCBpbnZvbHZlZCE8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+Rmlyc3QgcGxlYXNlIHJldmlldyBvdXIKKyAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwiPkRldmVsb3BlcidzIFBvbGljeTwvYT4uCisKKyAgPHA+VG8gY2hlY2sgb3V0IHRoZSBjb2RlLCB1c2U6PC9wPgorCisgIDx1bD4KKyAgPGxpPjxjb2RlPnN2biBjbyBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsgb3Blbm1wPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+CisgICAgIE5leHQ6CisgIDwvcD4KKyAgCisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgb3Blbm1wL3J1bnRpbWU8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZSBjb21waWxlcj1nY2M8L2NvZGU+PC9saT4KKyAgPC91bD4KKyAgCisgIDxwPkZ1bGwgZGV0YWlscyBvZiBob3cgdG8gYnVpbGQgYXJlIGluIHRoZQorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+CisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMz5Ob3RlczwvaDM+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHA+CisKKzwvcD4KKworICA8cD5TZW5kIGRpc2N1c3Npb25zIHRvIHRoZQorICAoPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+T3Blbk1QIG1haWxpbmcgbGlzdDwvYT4pLjwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkRlc2lnbiBEb2N1bWVudHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzx1bD4KKzxsaT48YSBocmVmPSJSZWZlcmVuY2UucGRmIj5SdW50aW1lIGRlc2lnbiAoUERGKTwvYT48L2xpPgorPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5Db3B5cmlnaHQgbm90aWNlczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzx1bD4KKzxsaT4KKyAgVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUKKyAgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCis8L2xpPgorPGxpPgorICBJbnRlbCBpcyBhIHRyYWRlbWFyayBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzwvdWw+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3JjMS93d3cvbWVudS5jc3MgYi9yYzEvd3d3L21lbnUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzEvd3d3L21lbnUuY3NzCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKiovCisvKiBwYWdlIGxheW91dCAqLworLyoqKioqKioqKioqKioqKi8KKworW2lkPW1lbnVdIHsKKwlwb3NpdGlvbjpmaXhlZDsKKwl3aWR0aDoyNWV4OworfQorW2lkPWNvbnRlbnRdIHsKKwkvKiAqKioqKiAgRURJVCBUSElTIFZBTFVFIElGIENPTlRFTlQgT1ZFUkxBUFMgTUVOVSAqKioqKiAqLworCXBvc2l0aW9uOmFic29sdXRlOworICBsZWZ0OjI5ZXg7CisJcGFkZGluZy1yaWdodDo0ZXg7Cit9CisKKy8qKioqKioqKioqKioqKi8KKy8qIG1lbnUgc3R5bGUgKi8KKy8qKioqKioqKioqKioqKi8KKworI21lbnUgLnN1Ym1lbnUgeworCXBhZGRpbmctdG9wOjFlbTsKKwlkaXNwbGF5OmJsb2NrOworfQorCisjbWVudSBsYWJlbCB7CisJZGlzcGxheTpibG9jazsKKwlmb250LXdlaWdodDogYm9sZDsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MiwxOTIsMTkyKTsKK30KKyNtZW51IGEgeworCXBhZGRpbmc6MCAuMmVtOworCWRpc3BsYXk6YmxvY2s7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWJhY2tncm91bmQtY29sb3I6IHJnYigyMzUsMjM1LDIzNSk7Cit9CisjbWVudSBhOnZpc2l0ZWQgeworCWNvbG9yOnJnYigxMDAsNTAsMTAwKTsKK30K